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 ? (