import { ReactNode, useCallback, useEffect } from 'react'; import { IThumbnailContent } from '../../../../types/matrix/common'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { getFileSrcUrl } from './util'; import { mxcUrlToHttp } from '../../../utils/matrix'; import { useSpecVersions } from '../../../hooks/useSpecVersions'; export type ThumbnailContentProps = { info: IThumbnailContent; renderImage: (src: string) => ReactNode; }; export function ThumbnailContent({ info, renderImage }: ThumbnailContentProps) { const mx = useMatrixClient(); const { versions } = useSpecVersions(); const useAuthentication = versions.includes('v1.11'); const [thumbSrcState, loadThumbSrc] = useAsyncCallback( useCallback(() => { const thumbInfo = info.thumbnail_info; const thumbMxcUrl = info.thumbnail_file?.url ?? info.thumbnail_url; if (typeof thumbMxcUrl !== 'string' || typeof thumbInfo?.mimetype !== 'string') { throw new Error('Failed to load thumbnail'); } return getFileSrcUrl( mxcUrlToHttp(mx, thumbMxcUrl, useAuthentication) ?? '', thumbInfo.mimetype, info.thumbnail_file ); }, [mx, info, useAuthentication]) ); useEffect(() => { loadThumbSrc(); }, [loadThumbSrc]); return thumbSrcState.status === AsyncStatus.Success ? renderImage(thumbSrcState.data) : null; }