Skip to content

Commit fd08997

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/openbit-dev'
2 parents 588a443 + 9f31123 commit fd08997

File tree

11 files changed

+373
-93
lines changed

11 files changed

+373
-93
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
"@polkadot/types-codec": "10.10.1",
9595
"@polkadot/util": "^12.6.2",
9696
"@polkadot/util-crypto": "^12.6.2",
97-
"@subwallet/chain-list": "0.2.73-beta.11",
97+
"@subwallet/chain-list": "0.2.75-beta.1",
9898
"@subwallet/keyring": "file:./local-libs/keyring",
9999
"@subwallet/ui-keyring": "file:./local-libs/ui-keyring",
100100
"babel-core": "^7.0.0-bridge.0",

packages/extension-base/src/koni/api/nft/inscription/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ export class InscriptionApi extends BaseNftApi {
5050
}
5151

5252
private parseInsUrl (id: string, type: string) {
53-
if (type.startsWith('audio/') || type.startsWith('text/html') || type.startsWith('image/svg') || type.startsWith('model/gltf')) {
53+
if (type.startsWith('image/svg') || type.startsWith('model/gltf') || type.startsWith('image/gif')) {
5454
return this.createIframePreviewUrl(id);
5555
}
5656

57-
if (type.startsWith('video/')) {
57+
if (type.startsWith('video/') || type.startsWith('audio/') || type.startsWith('text/html') || type.startsWith('image/png') || type.startsWith('image/jpeg') || type.startsWith('image/webp') || type.startsWith('image/gif')) {
5858
return `https://ordinals.com/content/${id}`;
5959
}
6060

@@ -63,8 +63,7 @@ export class InscriptionApi extends BaseNftApi {
6363
}
6464

6565
if (type.startsWith('image/')) {
66-
return `${HIRO_API.list_of_incriptions}/${id}/content`;
67-
// return getPreviewUrl(id);
66+
return `https://ordinals.com/content/${id}`;
6867
}
6968

7069
return undefined;

packages/extension-base/src/services/chain-service/constants.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ export const EVM_PASS_CONNECT_STATUS: Record<string, string[]> = {
260260
arbitrum_one: ['*'],
261261
okxTest: ['*'],
262262
merlinEvm: ['*'],
263-
layerEdge_testnet: ['*']
263+
layerEdge_testnet: ['*'],
264+
custom: ['*']
264265
};
265266

266267
export const EVM_REFORMAT_DECIMALS = {

packages/extension-base/src/services/chain-service/handler/EvmApi.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ export class EvmApi implements _EvmApi {
9494

9595
get ignoreNetListen (): boolean {
9696
const ignoreRpc: string[] | undefined = EVM_PASS_CONNECT_STATUS[this.chainSlug];
97+
const isCustomRpc = this.chainSlug.startsWith('custom-');
9798

98-
return ignoreRpc
99-
? ignoreRpc.includes('*') || ignoreRpc.includes(this.apiUrl)
100-
: false;
99+
if (isCustomRpc) {
100+
return true;
101+
}
102+
103+
return !!ignoreRpc && (ignoreRpc.includes('*') || ignoreRpc.includes(this.apiUrl));
101104
}
102105

103106
createIntervalCheckApi (): NodeJS.Timer {

packages/extension-base/src/services/chain-service/index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,24 @@ const openbitChainInfoMap = (() => {
5151
'bitlayerTest',
5252
'bevm',
5353
'bevmTest',
54+
'bevm_testnet',
5455
'b2',
56+
'b2_testnet',
5557
'bobMainnet',
5658
'merlinEvm',
5759
'botanixEvmTest',
5860
'bounceBitEvm',
5961
'bounceBitEvmTest',
6062
'layerEdge_testnet',
61-
'bevm_testnet',
6263
'sepolia_ethereum',
63-
'syscoin_evm',
6464
'rollux_evm',
65-
'b2_testnet',
66-
'boolBeta_testnet',
6765
'rollux_testnet',
68-
'syscoin_evm_testnet'
66+
'boolBeta_testnet',
67+
'syscoin_evm',
68+
'syscoin_evm_testnet',
69+
'satoshivm',
70+
'satoshivm_testnet',
71+
'core'
6972
];
7073
const enableList = nativeList.concat(bitcoinL2List);
7174

packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function Component ({ className = '' }: Props): React.ReactElement<Props> {
105105
if (nftItem.description && isValidJson(nftItem.description)) {
106106
const ordinalNftItem = JSON.parse(nftItem.description) as OrdinalRemarkData;
107107

108-
if ('p' in ordinalNftItem && 'op' in ordinalNftItem && 'tick' in ordinalNftItem && 'amt' in ordinalNftItem) {
108+
if (typeof ordinalNftItem === 'object' && 'p' in ordinalNftItem && 'op' in ordinalNftItem && 'tick' in ordinalNftItem && 'amt' in ordinalNftItem) {
109109
return (
110110
<InscriptionGalleryWrapper
111111
handleOnClick={handleOnClickNft}
@@ -120,11 +120,12 @@ function Component ({ className = '' }: Props): React.ReactElement<Props> {
120120

121121
return (
122122
<NftGalleryWrapper
123-
fallbackImage={collectionInfo.image}
123+
fallbackImage={{ image: collectionInfo.image }}
124124
handleOnClick={handleOnClickNft}
125125
have3dViewer={SHOW_3D_MODELS_CHAIN.includes(nftItem.chain)}
126126
image={nftItem.image}
127127
key={`${nftItem.chain}_${nftItem.collectionId}_${nftItem.id}`}
128+
nftItem={nftItem}
128129
routingParams={routingParams}
129130
title={nftItem.name || nftItem.id}
130131
/>

packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollections.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { DataContext } from '@subwallet/extension-koni-ui/contexts/DataContext';
77
import { useGetNftByAccount, useNotification, useSetCurrentPage, useTranslation } from '@subwallet/extension-koni-ui/hooks';
88
import { reloadCron } from '@subwallet/extension-koni-ui/messaging';
99
import { NftGalleryWrapper } from '@subwallet/extension-koni-ui/Popup/Home/Nfts/component/NftGalleryWrapper';
10-
import { getTotalCollectionItems, INftCollectionDetail } from '@subwallet/extension-koni-ui/Popup/Home/Nfts/utils';
10+
import { ContentType, determineContentType, getContentType, getTotalCollectionItems, INftCollectionDetail } from '@subwallet/extension-koni-ui/Popup/Home/Nfts/utils';
1111
import { RootState } from '@subwallet/extension-koni-ui/stores';
1212
import { ThemeProps } from '@subwallet/extension-koni-ui/types';
1313
import { ActivityIndicator, ButtonProps, Icon, SwList } from '@subwallet/react-ui';
@@ -90,11 +90,13 @@ function Component ({ className = '' }: Props): React.ReactElement<Props> {
9090
const renderNftCollection = useCallback((nftCollection: NftCollection) => {
9191
const nftList = getNftsByCollection(nftCollection);
9292

93-
let fallbackImage: string | undefined;
93+
let fallbackImage: { image: string; contentType?: ContentType } | undefined;
9494

9595
for (const nft of nftList) { // fallback to any nft image
96+
const contentType = determineContentType(getContentType(nft?.properties));
97+
9698
if (nft.image) {
97-
fallbackImage = nft.image;
99+
fallbackImage = { image: nft.image, contentType: contentType };
98100
break;
99101
}
100102
}

packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx

Lines changed: 126 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import useDefaultNavigate from '@subwallet/extension-koni-ui/hooks/router/useDef
1313
import useGetChainInfo from '@subwallet/extension-koni-ui/hooks/screen/common/useFetchChainInfo';
1414
import useGetAccountInfoByAddress from '@subwallet/extension-koni-ui/hooks/screen/common/useGetAccountInfoByAddress';
1515
import InscriptionImage from '@subwallet/extension-koni-ui/Popup/Home/Nfts/component/InscriptionImage';
16-
import { INftItemDetail, isValidJson } from '@subwallet/extension-koni-ui/Popup/Home/Nfts/utils';
16+
import { ContentType, determineContentType, getContentType, INftItemDetail, isValidJson } from '@subwallet/extension-koni-ui/Popup/Home/Nfts/utils';
1717
import { RootState } from '@subwallet/extension-koni-ui/stores';
1818
import { Theme, ThemeProps } from '@subwallet/extension-koni-ui/types';
1919
import { BackgroundIcon, Field, Icon, Image, Logo, ModalContext, SwModal } from '@subwallet/react-ui';
@@ -139,13 +139,94 @@ function Component ({ className = '' }: Props): React.ReactElement<Props> {
139139
const show3DModel = SHOW_3D_MODELS_CHAIN.includes(nftItem.chain);
140140
const ordinalNftItem = nftItem.description && isValidJson(nftItem.description) && JSON.parse(nftItem.description) as OrdinalRemarkData;
141141
const isBRC20Inscription = useMemo(() => {
142-
if (ordinalNftItem && 'p' in ordinalNftItem && 'op' in ordinalNftItem && 'tick' in ordinalNftItem && 'amt' in ordinalNftItem) {
142+
if (typeof ordinalNftItem === 'object' && 'p' in ordinalNftItem && 'op' in ordinalNftItem && 'tick' in ordinalNftItem && 'amt' in ordinalNftItem) {
143143
return true;
144144
}
145145

146146
return false;
147147
}, [ordinalNftItem]);
148148

149+
const renderAppJsonContent = () => {
150+
const ordinalNftDescription = nftItem?.description && isValidJson(nftItem.description)
151+
? JSON.parse(nftItem.description) as Record<string, unknown>
152+
: undefined;
153+
154+
if (!ordinalNftDescription || Object.keys(ordinalNftDescription).length === 0) {
155+
return (
156+
<Image
157+
className={CN({ clickable: nftItem.externalUrl })}
158+
fallbackSrc={DefaultLogosMap.default_placeholder}
159+
height={358}
160+
modelViewerProps={show3DModel ? { ...DEFAULT_MODEL_VIEWER_PROPS, ...CAMERA_CONTROLS_MODEL_VIEWER_PROPS } : undefined}
161+
onClick={onImageClick}
162+
src={nftItem.image || DefaultLogosMap.default_placeholder}
163+
width={show3DModel ? 358 : undefined}
164+
/>
165+
);
166+
}
167+
168+
return (
169+
<div className='nft-container'>
170+
<pre>
171+
<code>
172+
{JSON.stringify(ordinalNftDescription, null, 2)}
173+
</code>
174+
</pre>
175+
</div>
176+
);
177+
};
178+
179+
const renderNftContent = () => {
180+
const contentType = determineContentType(getContentType(nftItem.properties));
181+
182+
switch (contentType) {
183+
case ContentType.Audio:
184+
return (
185+
<div className='-nft-audio'>
186+
<audio controls>
187+
<source
188+
src={nftItem.image}
189+
type={getContentType(nftItem?.properties)}
190+
/>
191+
</audio>
192+
</div>
193+
);
194+
195+
case ContentType.AppJson:
196+
return renderAppJsonContent();
197+
198+
case ContentType.TextHTML:
199+
case ContentType.ImageSVG:
200+
case ContentType.ModelGltf:
201+
case ContentType.ImageGIF:
202+
return (
203+
<div className='-nft-text-html-wrapper'>
204+
<iframe
205+
className='-nft-text-html'
206+
src={nftItem.image}
207+
/>
208+
</div>
209+
);
210+
211+
default:
212+
if (!isBRC20Inscription) {
213+
return (
214+
<Image
215+
className={CN({ clickable: nftItem.externalUrl })}
216+
fallbackSrc={DefaultLogosMap.default_placeholder}
217+
height={358}
218+
modelViewerProps={show3DModel ? { ...DEFAULT_MODEL_VIEWER_PROPS, ...CAMERA_CONTROLS_MODEL_VIEWER_PROPS } : undefined}
219+
onClick={onImageClick}
220+
src={nftItem.image || DefaultLogosMap.default_placeholder}
221+
width={show3DModel ? 358 : undefined}
222+
/>
223+
);
224+
}
225+
226+
return null;
227+
}
228+
};
229+
149230
return (
150231
<PageWrapper
151232
className={`${className}`}
@@ -162,23 +243,15 @@ function Component ({ className = '' }: Props): React.ReactElement<Props> {
162243
>
163244
<div className={'nft_item_detail__container'}>
164245
<div className={'nft_item_detail__nft_image'}>
165-
{isBRC20Inscription && nftItem.description && (
166-
<InscriptionImage
167-
alone={true}
168-
properties={JSON.parse(nftItem.description) as OrdinalRemarkData}
169-
/>
170-
)}
171-
{!isBRC20Inscription && (
172-
<Image
173-
className={CN({ clickable: nftItem.externalUrl })}
174-
fallbackSrc={DefaultLogosMap.default_placeholder}
175-
height={358}
176-
modelViewerProps={show3DModel ? { ...DEFAULT_MODEL_VIEWER_PROPS, ...CAMERA_CONTROLS_MODEL_VIEWER_PROPS } : undefined}
177-
onClick={onImageClick}
178-
src={nftItem.image || DefaultLogosMap.default_placeholder}
179-
width={show3DModel ? 358 : undefined}
180-
/>
181-
)}
246+
<>
247+
{isBRC20Inscription && nftItem.description && (
248+
<InscriptionImage
249+
alone={true}
250+
properties={JSON.parse(nftItem.description) as OrdinalRemarkData}
251+
/>
252+
)}
253+
{renderNftContent()}
254+
</>
182255
</div>
183256

184257
<div className={'nft_item_detail__info_container'}>
@@ -307,6 +380,40 @@ const NftItemDetail = styled(Component)<Props>(({ theme: { token } }: Props) =>
307380
'.clickable': {
308381
cursor: 'pointer'
309382
},
383+
'.-nft-audio': {
384+
display: 'flex',
385+
alignItems: 'center'
386+
},
387+
'.-nft-text-html': {
388+
width: 358,
389+
height: 358,
390+
border: 'none',
391+
overflow: 'hidden'
392+
},
393+
'.nft-container': {
394+
width: 358,
395+
height: 358,
396+
backgroundColor: token.colorTextTertiary,
397+
padding: token.padding,
398+
gap: 8,
399+
display: 'flex',
400+
flexDirection: 'column',
401+
overflow: 'hidden'
402+
},
403+
'.__nft-item': {
404+
fontSize: token.fontSize,
405+
lineHeight: token.lineHeight,
406+
color: token.colorTextDark1,
407+
justifyContent: 'space-between',
408+
display: 'flex',
409+
gap: 4
410+
411+
},
412+
'.__nft-item-value': {
413+
color: token.colorTextDark4,
414+
overflow: 'hidden',
415+
textOverflow: 'ellipsis'
416+
},
310417

311418
'.nft_item_detail__info_container': {
312419
display: 'flex',

0 commit comments

Comments
 (0)