import type { NFTError } from '@/api/types';
import { useNFTLifecycleContext } from '@/nft/components/NFTLifecycleProvider';
import { useNFTContext } from '@/nft/components/NFTProvider';
import { MediaType, Lifecycle } from '@/nft/types';
import { useCallback, useMemo } from 'react';
import { cn } from '../../../styles/theme';
import { NFTAudio } from './NFTAudio';
import { NFTImage } from './NFTImage';
import { NFTVideo } from './NFTVideo';
type NFTMediaProps = {
className?: string;
square?: boolean;
};
export function NFTMedia({ className, square }: NFTMediaProps) {
const { mimeType } = useNFTContext();
const { type, updateLifecycleStatus } = useNFTLifecycleContext();
const mediaType = useMemo(() => {
if (mimeType?.startsWith('video')) {
return MediaType.Video;
}
if (mimeType?.startsWith('audio')) {
return MediaType.Audio;
}
if (mimeType?.startsWith('image')) {
return MediaType.Image;
}
return MediaType.Unknown;
}, [mimeType]);
const handleLoading = useCallback(
(mediaUrl: string) => {
updateLifecycleStatus({
statusName: 'mediaLoading',
statusData: {
mediaType,
mediaUrl,
},
});
},
[mediaType, updateLifecycleStatus],
);
const handleLoaded = useCallback(() => {
// for Views, this is the success state
updateLifecycleStatus({
statusName: type === Lifecycle.MINT ? 'mediaLoaded' : 'success',
});
}, [type, updateLifecycleStatus]);
const handleError = useCallback(
(error: NFTError) => {
updateLifecycleStatus({
statusName: 'error',
statusData: error,
});
},
[updateLifecycleStatus],
);
const media = useMemo(() => {
switch (mediaType) {
case MediaType.Video:
return (