Commit efdfdc90 authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

refactor: use ref for jazzicon (#2874)

parent 709f0299
import jazzicon from '@metamask/jazzicon' import jazzicon from '@metamask/jazzicon'
import useENSAvatar from 'hooks/useENSAvatar' import useENSAvatar from 'hooks/useENSAvatar'
import { useCallback, useState } from 'react' import { useLayoutEffect, useMemo, useRef, useState } from 'react'
import styled from 'styled-components/macro' import styled from 'styled-components/macro'
import { useActiveWeb3React } from '../../hooks/web3' import { useActiveWeb3React } from '../../hooks/web3'
...@@ -24,24 +24,25 @@ export default function Identicon() { ...@@ -24,24 +24,25 @@ export default function Identicon() {
const { avatar } = useENSAvatar(account ?? undefined) const { avatar } = useENSAvatar(account ?? undefined)
const [fetchable, setFetchable] = useState(true) const [fetchable, setFetchable] = useState(true)
const setJazzicon = useCallback( const icon = useMemo(() => account && jazzicon(16, parseInt(account.slice(2, 10), 16)), [account])
(ref: HTMLSpanElement | null) => { const iconRef = useRef<HTMLDivElement>(null)
if (account) { useLayoutEffect(() => {
ref?.appendChild(jazzicon(16, parseInt(account?.slice(2, 10), 16))) const current = iconRef.current
if (icon) {
current?.appendChild(icon)
return () => {
current?.removeChild(icon)
} }
}, }
[account] return
) }, [icon, iconRef])
return ( return (
<StyledIdenticon> <StyledIdenticon>
{avatar && fetchable ? ( {avatar && fetchable ? (
<StyledAvatar alt="avatar" src={avatar} onError={() => setFetchable(false)}></StyledAvatar> <StyledAvatar alt="avatar" src={avatar} onError={() => setFetchable(false)}></StyledAvatar>
) : ( ) : (
<span <span ref={iconRef} />
ref={setJazzicon}
key={account} // forces re-render when account changes so that React controls jazzicon cleanup
/>
)} )}
</StyledIdenticon> </StyledIdenticon>
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment