1- import type { FC } from 'react'
2- import { Link } from '@mui/material'
31import { makeStyles } from '@masknet/theme'
4- import { Video } from '../../../components/shared/Video'
52import { CollectibleTab } from './CollectibleTab'
63import { CollectibleState } from '../hooks/useCollectibleState'
4+ import { AssetPlayer } from '@masknet/shared'
5+ import { useMemo } from 'react'
76
87const useStyles = makeStyles ( ) ( {
98 body : {
@@ -15,44 +14,38 @@ const useStyles = makeStyles()({
1514 maxHeight : '100%' ,
1615 border : 'none' ,
1716 } ,
17+ errorPlaceholder : {
18+ padding : '82px 0' ,
19+ } ,
20+ loadingPlaceholder : {
21+ padding : '74px 0' ,
22+ } ,
1823} )
1924
20- interface AssetPlayerProps {
21- src ?: string
22- alt : string
23- }
24-
25- // opensea supports: JPG, PNG, GIF, SVG, MP4, WEBM, MP3, WAV, OGG, GLB, GLTF.
26- const AssetPlayer : FC < AssetPlayerProps > = ( { src, alt } ) => {
27- const { classes } = useStyles ( )
28- if ( ! src ) return null
29- const isVideo = src . match ( / \. ( m p 4 | w e b m ) $ / i)
30- return isVideo ? (
31- < Video src = { src } VideoProps = { { className : classes . player } } />
32- ) : (
33- < img className = { classes . player } src = { src } alt = { alt } />
34- )
35- }
36-
3725export interface ArticleTabProps { }
3826
3927export function ArticleTab ( props : ArticleTabProps ) {
4028 const { classes } = useStyles ( )
4129 const { asset } = CollectibleState . useContainer ( )
4230
43- if ( ! asset . value ) return null
44- const resourceUrl = asset . value . image_url || asset . value . animation_url
45- return (
46- < CollectibleTab >
47- < div className = { classes . body } >
48- { asset . value . animation_url ? (
49- < Link href = { asset . value . animation_url } target = "_blank" rel = "noopener noreferrer" >
50- < AssetPlayer src = { resourceUrl } alt = { asset . value ?. name ?? '' } />
51- </ Link >
52- ) : (
53- < AssetPlayer src = { resourceUrl } alt = { asset . value ?. name ?? '' } />
54- ) }
55- </ div >
56- </ CollectibleTab >
57- )
31+ return useMemo ( ( ) => {
32+ if ( ! asset . value ) return null
33+ const resourceUrl = asset . value . animation_url || asset . value . image_url
34+ return (
35+ < CollectibleTab >
36+ < div className = { classes . body } >
37+ < AssetPlayer
38+ url = { resourceUrl }
39+ options = { {
40+ playsInline : true ,
41+ } }
42+ classes = { {
43+ errorPlaceholder : classes . errorPlaceholder ,
44+ loadingPlaceholder : classes . loadingPlaceholder ,
45+ } }
46+ />
47+ </ div >
48+ </ CollectibleTab >
49+ )
50+ } , [ asset . value ?. animation_url , asset . value ?. image_url , classes ] )
5851}
0 commit comments