import type { HTMLChakraProps } from '@chakra-ui/react'; import type React from 'react'; export type MediaType = 'image' | 'video' | 'html'; export type TransportType = 'http' | 'ipfs'; // Currently we have only 3 sizes: // sm = max-width<=30px // md = max-width<=250px // original export type Size = 'sm' | 'md' | 'original'; export type MediaElementProps = HTMLChakraProps & { src: string; srcSet?: string; transport: TransportType; onLoad?: () => void; onError?: () => void; onClick?: () => void; }; // https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types const IMAGE_EXTENSIONS = [ '.jpg', 'jpeg', '.jfif', '.pjpeg', '.pjp', '.png', '.apng', '.avif', '.gif', '.svg', '.webp', ]; const VIDEO_EXTENSIONS = [ '.mp4', '.webm', '.ogg', ]; export function getPreliminaryMediaType(url: string): MediaType | undefined { if (IMAGE_EXTENSIONS.some((ext) => url.endsWith(ext))) { return 'image'; } if (url.startsWith('data:image')) { return 'image'; } if (VIDEO_EXTENSIONS.some((ext) => url.endsWith(ext))) { return 'video'; } } export const mediaStyleProps = { transitionProperty: 'transform', transitionDuration: 'normal', transitionTimingFunction: 'ease', cursor: 'pointer', _hover: { base: {}, lg: { transform: 'scale(1.2)', }, }, }; export const videoPlayProps = { disablePictureInPicture: true, loop: true, muted: true, playsInline: true, };