diff --git a/ui/components/ui/jazzicon/README.mdx b/ui/components/ui/jazzicon/README.mdx new file mode 100644 index 000000000000..7548f8ddd0e3 --- /dev/null +++ b/ui/components/ui/jazzicon/README.mdx @@ -0,0 +1,15 @@ +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; + +import Jazzicon from './jazzicon.component'; + +# Jazzicon + +Jazzicon uses the [jazzicon library](https://github.com/MetaMask/jazzicon) to create a graphic identity of an ethereum address + + + + + +## Props + + \ No newline at end of file diff --git a/ui/components/ui/jazzicon/jazzicon.component.js b/ui/components/ui/jazzicon/jazzicon.component.js index 3786af79d786..98eae9e36064 100644 --- a/ui/components/ui/jazzicon/jazzicon.component.js +++ b/ui/components/ui/jazzicon/jazzicon.component.js @@ -1,4 +1,4 @@ -import React, { createRef, PureComponent } from 'react'; +import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import jazzicon from '@metamask/jazzicon'; import iconFactoryGenerator from '../../../helpers/utils/icon-factory'; @@ -9,56 +9,61 @@ const iconFactory = iconFactoryGenerator(jazzicon); * Wrapper around the jazzicon library to return a React component, as the library returns an * HTMLDivElement which needs to be appended. */ -export default class Jazzicon extends PureComponent { - static propTypes = { - address: PropTypes.string.isRequired, - className: PropTypes.string, - diameter: PropTypes.number, - style: PropTypes.object, - tokenList: PropTypes.object, - }; - static defaultProps = { - diameter: 46, - }; +function Jazzicon({ + address, + className, + diameter = 46, + style, + tokenList = {}, +}) { + const container = useRef(); - container = createRef(); + useEffect(() => { + const _container = container.current; - componentDidMount() { - this.appendJazzicon(); - } - - componentDidUpdate(prevProps) { - const { address: prevAddress, diameter: prevDiameter } = prevProps; - const { address, diameter } = this.props; - - if (address !== prevAddress || diameter !== prevDiameter) { - this.removeExistingChildren(); - this.appendJazzicon(); - } - } - - removeExistingChildren() { - const { children } = this.container.current; - - for (let i = 0; i < children.length; i++) { - this.container.current.removeChild(children[i]); - } - } - - appendJazzicon() { - const { address, diameter, tokenList } = this.props; - const image = iconFactory.iconForAddress( + // add icon + const imageNode = iconFactory.iconForAddress( address, diameter, - tokenList[address.toLowerCase()], + tokenList[address?.toLowerCase()], ); - this.container.current.appendChild(image); - } - render() { - const { className, style } = this.props; + _container?.appendChild(imageNode); + + // remove icon + return () => { + while (_container.firstChild) { + _container.firstChild.remove(); + } + }; + }, [address, diameter, tokenList]); - return
; - } + return
; } + +Jazzicon.propTypes = { + /** + * Address used for generating random image + */ + address: PropTypes.string.isRequired, + /** + * Add custom css class + */ + className: PropTypes.string, + /** + * Sets the width and height of the inner img element + * Jazzicon accepts a pixel diameter + */ + diameter: PropTypes.number, + /** + * Add inline style for the component + */ + style: PropTypes.object, + /** + * Add list of token in object + */ + tokenList: PropTypes.object, +}; + +export default Jazzicon; diff --git a/ui/components/ui/jazzicon/jazzicon.stories.js b/ui/components/ui/jazzicon/jazzicon.stories.js new file mode 100644 index 000000000000..7310b0394191 --- /dev/null +++ b/ui/components/ui/jazzicon/jazzicon.stories.js @@ -0,0 +1,28 @@ +import React from 'react'; +import README from './README.mdx'; +import Jazzicon from './jazzicon.component'; + +export default { + title: 'Components/UI/Jazzicon', + id: __filename, + component: Jazzicon, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + address: { control: 'text' }, + className: { control: 'text' }, + diameter: { control: 'number' }, + tokenList: { control: 'object' }, + }, +}; + +export const DefaultStory = (args) => ; + +DefaultStory.storyName = 'Default'; +DefaultStory.args = { + address: '0x5CfE73b6021E818B776b421B1c4Db2474086a7e1', + diameter: 32, +};