diff --git a/packages/mask/src/plugins/Avatar/SNSAdaptor/NFTBadge.tsx b/packages/mask/src/plugins/Avatar/SNSAdaptor/NFTBadge.tsx index c101d720a8a0..e21c25c31aa2 100644 --- a/packages/mask/src/plugins/Avatar/SNSAdaptor/NFTBadge.tsx +++ b/packages/mask/src/plugins/Avatar/SNSAdaptor/NFTBadge.tsx @@ -4,7 +4,6 @@ import Link from '@mui/material/Link' import BigNumber from 'bignumber.js' import { useNFT } from '../hooks' import { useNFTVerified } from '../hooks/useNFTVerified' -import { useUserOwnerAddress } from '../hooks/useUserOwnerAddress' import type { AvatarMetaDB } from '../types' import { NFTAvatarRing } from './NFTAvatarRing' @@ -40,7 +39,7 @@ function formatText(symbol: string, length: number) { } export function NFTBadge(props: NFTBadgeProps) { - const { avatar, size = 140, width = 15 } = props + const { avatar, size = 140 } = props const classes = useStylesExtends(useStyles(), props) const { value = { amount: '0', symbol: 'ETH', name: '', owner: '' }, loading } = useNFT( @@ -48,9 +47,8 @@ export function NFTBadge(props: NFTBadgeProps) { avatar.tokenId, ) - const address = useUserOwnerAddress(avatar.userId) - const { amount, symbol, name, owner } = value - const { loading: loadingNFTVerified, value: NFTVerified } = useNFTVerified(avatar.address) + const { amount, symbol, name } = value + const { loading: loadingNFTVerified } = useNFTVerified(avatar.address) return (
({ function NFTAvatarInTwitter() { const rainBowElement = useRef() + const borderElement = useRef() const identity = useCurrentVisitingIdentity() const wallet = useWallet() const { value: _avatar } = useNFTAvatar(identity.identifier.userId) const [avatar, setAvatar] = useState() - const windowSize = useWindowSize() + const location = useLocation() + + const showAvatar = useMemo( + () => getAvatarId(identity.avatar ?? '') === avatar?.avatarId && avatar.avatarId, + [avatar?.avatarId, identity.avatar], + ) const size = useMemo(() => { const ele = searchTwitterAvatarSelector().evaluate() @@ -65,7 +71,7 @@ function NFTAvatarInTwitter() { setNFTEvent(data) } - useEffect(() => { + useAsync(async () => { if (!wallet || !NFTAvatar) return if (!NFTEvent?.address || !NFTEvent?.tokenId) { @@ -79,20 +85,21 @@ function NFTAvatarInTwitter() { return } - PluginNFTAvatarRPC.saveNFTAvatar(wallet.address, { + const avatar = await PluginNFTAvatarRPC.saveNFTAvatar(wallet.address, { ...NFTEvent, avatarId: getAvatarId(identity.avatar ?? ''), - } as AvatarMetaDB).then((avatar: AvatarMetaDB | undefined) => { - setAvatar(avatar) - MaskMessages.events.NFTAvatarTimelineUpdated.sendToAll( - avatar ?? { - userId: identity.identifier.userId, - avatarId: getAvatarId(identity.avatar ?? ''), - address: '', - tokenId: '', - }, - ) - }) + } as AvatarMetaDB) + + setAvatar(avatar) + MaskMessages.events.NFTAvatarTimelineUpdated.sendToAll( + avatar ?? { + userId: identity.identifier.userId, + avatarId: getAvatarId(identity.avatar ?? ''), + address: '', + tokenId: '', + }, + ) + setNFTEvent(undefined) }, [identity.avatar]) @@ -104,7 +111,7 @@ function NFTAvatarInTwitter() { return MaskMessages.events.NFTAvatarUpdated.on((data) => onUpdate(data)) }, [onUpdate]) - useMount(() => { + useEffect(() => { const linkDom = searchTwitterAvatarLinkSelector().evaluate() if (linkDom?.firstElementChild && linkDom.childNodes.length === 4) { @@ -112,11 +119,12 @@ function NFTAvatarInTwitter() { if (linkParentDom) linkParentDom.style.overflow = 'visible' - // remove useless border - linkDom.removeChild(linkDom.firstElementChild) - // create rainbow shadow border - if (linkDom.firstElementChild.tagName !== 'style') { + if (linkDom.lastElementChild?.tagName !== 'STYLE') { + borderElement.current = linkDom.firstElementChild + + // remove useless border + linkDom.removeChild(linkDom.firstElementChild) const style = document.createElement('style') style.innerText = ` ${rainbowBorderKeyFrames.styles} @@ -129,17 +137,53 @@ function NFTAvatarInTwitter() { } ` rainBowElement.current = linkDom.firstElementChild - linkDom.firstElementChild.classList.add('rainbowBorder') - linkDom.insertBefore(style, linkDom.firstChild) + if (showAvatar) linkDom.firstElementChild.classList.add('rainbowBorder') + linkDom.appendChild(style) } } - }) + }, [location.pathname]) + + useEffect(() => { + const linkDom = searchTwitterAvatarLinkSelector().evaluate() + if (showAvatar) { + if (borderElement.current && linkDom?.firstElementChild === borderElement.current) { + linkDom?.removeChild(linkDom.firstElementChild) + } - useUpdateEffect(() => { - if (!avatar) { - rainBowElement.current?.classList.remove('rainbowBorder') - } else { rainBowElement.current?.classList.add('rainbowBorder') + } else { + // recovery Twitter profile avatar style + if (borderElement.current && linkDom?.firstElementChild !== borderElement.current) { + linkDom?.insertBefore(borderElement.current, linkDom.firstChild) + } + + rainBowElement.current?.classList.remove('rainbowBorder') + } + }, [showAvatar]) + + useUpdateEffect(() => { + if ( + location.pathname && + location.pathname.split('/').length === 2 && + trim(location.pathname, '/') !== identity.identifier.userId + ) { + setAvatar(undefined) + } + }, [location, identity]) + + useUpdateEffect(() => { + const linkParentDom = searchTwitterAvatarLinkSelector().evaluate()?.closest('div') + + if (!avatar || !linkParentDom) return + + const handler = () => { + window.open(resolveOpenSeaLink(avatar.address, avatar.tokenId), '_blank') + } + + linkParentDom.addEventListener('click', handler) + + return () => { + linkParentDom.removeEventListener('click', handler) } }, [avatar]) @@ -147,7 +191,7 @@ function NFTAvatarInTwitter() { return ( <> - {getAvatarId(identity.avatar ?? '') === avatar.avatarId && avatar.avatarId ? ( + {showAvatar ? (