diff --git a/packages/shared/src/UI/components/NFTList/index.tsx b/packages/shared/src/UI/components/NFTList/index.tsx index 37606c65d08b..9143372abde6 100644 --- a/packages/shared/src/UI/components/NFTList/index.tsx +++ b/packages/shared/src/UI/components/NFTList/index.tsx @@ -2,21 +2,21 @@ import { useChainId, useCurrentWeb3NetworkPluginID, useWeb3State, Web3Helper } f import { ElementAnchor, Linking, NFTCardStyledAssetPlayer, RetryHint } from '@masknet/shared' import { LoadingBase, makeStyles } from '@masknet/theme' import { isSameAddress, NetworkPluginID, NonFungibleToken } from '@masknet/web3-shared-base' -import { formatTokenId } from '@masknet/web3-shared-evm' +import type { ChainId, SchemaType } from '@masknet/web3-shared-evm' import { Checkbox, List, ListItem, Radio, Stack, Typography } from '@mui/material' import classnames from 'classnames' import { noop } from 'lodash-unified' import { FC, useCallback } from 'react' interface NFTItemProps { - token: NonFungibleToken + token: NonFungibleToken } export type NFTKeyPair = [address: string, tokenId: string] interface Props { selectable?: boolean - tokens: Array> + tokens: Array> selectedPairs?: NFTKeyPair[] onChange?: (id: string | null, contractAddress?: string) => void limit?: number @@ -28,7 +28,7 @@ interface Props { hasError?: boolean } -const useStyles = makeStyles<{ columns?: number; gap?: number }>()((theme, { columns, gap }) => { +const useStyles = makeStyles<{ columns?: number; gap?: number }>()((theme, { columns = 4, gap = 12 }) => { const isLight = theme.palette.mode === 'light' return { checkbox: { @@ -37,16 +37,17 @@ const useStyles = makeStyles<{ columns?: number; gap?: number }>()((theme, { col top: 0, }, list: { - gridGap: gap ?? 12, + gridGap: gap, padding: 0, display: 'grid', - gridTemplateColumns: `repeat(${columns ?? 4}, 1fr)`, + gridTemplateColumns: `repeat(${columns}, 1fr)`, }, nftContainer: { background: isLight ? '#EDEFEF' : '#2F3336', borderRadius: 8, width: '100%', transition: 'all 0.2s ease', + overflow: 'auto', '&:hover': { backgroundColor: isLight ? theme.palette.background.paper : undefined, boxShadow: isLight ? '0px 4px 30px rgba(0, 0, 0, 0.1)' : undefined, @@ -122,7 +123,10 @@ const useStyles = makeStyles<{ columns?: number; gap?: number }>()((theme, { col export const NFTItem: FC = ({ token }) => { const { classes } = useStyles({}) - const chainId = useChainId() + const chainId = useChainId(NetworkPluginID.PLUGIN_EVM) + const { Others } = useWeb3State(NetworkPluginID.PLUGIN_EVM) + const fullCaption = token.metadata?.name || token.tokenId + const caption = token.metadata?.name?.match(/#\d+$/) ? token.metadata.name : Others?.formatTokenId(token.tokenId) return (
= ({ token }) => { wrapper: classes.wrapper, }} /> - {formatTokenId(token.tokenId)} + + {caption} +
) } @@ -177,7 +183,7 @@ export const NFTList: FC = ({ } const SelectComponent = isRadio ? Radio : Checkbox - const { Others } = useWeb3State() + const { Others } = useWeb3State(NetworkPluginID.PLUGIN_EVM) return ( <> diff --git a/packages/web3-providers/src/NFTScan/index.ts b/packages/web3-providers/src/NFTScan/index.ts index b6d61a0b92a4..96c68def6c2a 100644 --- a/packages/web3-providers/src/NFTScan/index.ts +++ b/packages/web3-providers/src/NFTScan/index.ts @@ -218,7 +218,7 @@ export class NFTScanAPI implements NonFungibleTokenAPI.Provider { export interface NonFungibleTokenMetadata { chainId: ChainId + /** Might be the format `TheName #42` */ name: string symbol: string description?: string diff --git a/packages/web3-shared/evm/utils/formatter.ts b/packages/web3-shared/evm/utils/formatter.ts index e8bff3b48c65..f394f9dba98a 100644 --- a/packages/web3-shared/evm/utils/formatter.ts +++ b/packages/web3-shared/evm/utils/formatter.ts @@ -20,9 +20,14 @@ export function formatEthereumAddress(address: string, size = 0) { return `${address_.slice(0, Math.max(0, 2 + size))}...${address_.slice(-size)}` } -export function formatTokenId(tokenId: string, size = 0) { - if (tokenId.length < 9) return `#${tokenId}` - return `#${tokenId.slice(0, Math.max(0, 2 + size))}...${tokenId.slice(-size)}` +export function formatTokenId(tokenId: string, size = 4) { + size = Math.max(2, size) + const isHex = tokenId.toLowerCase().startsWith('0x') + const prefix = isHex ? '0x' : '#' + if (tokenId.length < size * 2 + prefix.length) return `#${tokenId}` + const head = tokenId.slice(0, isHex ? 2 + size : size) + const tail = tokenId.slice(-size) + return `${prefix}${head}...${tail}` } export function formatDomainName(domain: string, size = 4) {