From 2ed882a765a5183f076c919c480a95b1285991d4 Mon Sep 17 00:00:00 2001 From: Frenkie Nguyen Date: Thu, 11 Jul 2024 14:25:22 +0700 Subject: [PATCH 01/13] [Issue: 220] Add support for Ordinals with some content type --- .../src/koni/api/nft/inscription/index.ts | 4 +- .../Popup/Home/Nfts/NftCollectionDetail.tsx | 1 + .../src/Popup/Home/Nfts/NftItemDetail.tsx | 104 +++++++++++- .../Home/Nfts/component/NftGalleryWrapper.tsx | 153 +++++++++++++++--- 4 files changed, 239 insertions(+), 23 deletions(-) diff --git a/packages/extension-base/src/koni/api/nft/inscription/index.ts b/packages/extension-base/src/koni/api/nft/inscription/index.ts index a753e4d32c..3d1b044409 100644 --- a/packages/extension-base/src/koni/api/nft/inscription/index.ts +++ b/packages/extension-base/src/koni/api/nft/inscription/index.ts @@ -50,11 +50,11 @@ export class InscriptionApi extends BaseNftApi { } private parseInsUrl (id: string, type: string) { - if (type.startsWith('audio/') || type.startsWith('text/html') || type.startsWith('image/svg') || type.startsWith('model/gltf')) { + if (type.startsWith('image/svg') || type.startsWith('model/gltf')) { return this.createIframePreviewUrl(id); } - if (type.startsWith('video/')) { + if (type.startsWith('video/') || type.startsWith('audio/') || type.startsWith('text/html')) { return `https://ordinals.com/content/${id}`; } diff --git a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx index d82fbef4c6..8c1832e375 100644 --- a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx @@ -125,6 +125,7 @@ function Component ({ className = '' }: Props): React.ReactElement { have3dViewer={SHOW_3D_MODELS_CHAIN.includes(nftItem.chain)} image={nftItem.image} key={`${nftItem.chain}_${nftItem.collectionId}_${nftItem.id}`} + nftItem={nftItem} routingParams={routingParams} title={nftItem.name || nftItem.id} /> diff --git a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx index 351c0dead1..4c9cfbef08 100644 --- a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx @@ -146,6 +146,52 @@ function Component ({ className = '' }: Props): React.ReactElement { return false; }, [ordinalNftItem]); + const getContentType = useMemo(() => { + let contentType = ''; + + if (nftItem?.properties) { + Object.entries(nftItem.properties).forEach(([attName, attValueObj]) => { + const { value: attValue } = attValueObj as Record; + + if (attName === 'content_type') { + contentType = attValue; + } + }); + } + + return contentType; + }, [nftItem?.properties]); + + const renderAppJsonContent = useCallback(() => { + const ordinalNftDescription = nftItem?.description && isValidJson(nftItem.description) + ? JSON.parse(nftItem.description) as Record + : undefined; + + if (!ordinalNftDescription) { + return null; + } + + return ( +
+ {Object.entries(ordinalNftDescription).map(([key, value]) => ( +
{key}:
{String(value)}
+ ))} +
+ ); + }, [nftItem.description]); + + const checkContentType = useCallback((type: string): boolean => getContentType.includes(type), [getContentType]); + + const isAudioInscriptions = useMemo(() => checkContentType('audio'), [checkContentType]); + + const isTextHTMLInscriptions = useMemo(() => checkContentType('text/html'), [checkContentType]); + + const isSVGInscriptions = useMemo(() => checkContentType('image/svg'), [checkContentType]); + const isAppJsonInscriptions = useMemo(() => checkContentType('application/json'), [checkContentType]); + return ( { properties={JSON.parse(nftItem.description) as OrdinalRemarkData} /> )} - {!isBRC20Inscription && ( + {isAudioInscriptions && +
+ +
+ } + {isAppJsonInscriptions && + renderAppJsonContent() + } + {(isTextHTMLInscriptions || isSVGInscriptions) && +
+