import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { CommentMediaInfo, getDisplayMediaInfoType, getHasThumbnail, getMediaDimensions } from '../../lib/utils/media-utils'; import { getHostname } from '../../lib/utils/url-utils'; import useExpandedMediaStore from '../../stores/use-expanded-media-store'; import useFetchGifFirstFrame from '../../hooks/use-fetch-gif-first-frame'; import useIsMobile from '../../hooks/use-is-mobile'; import styles from './comment-media.module.css'; import Embed, { canEmbed } from '../embed'; interface MediaProps { commentMediaInfo?: CommentMediaInfo; deleted?: boolean; disableToggle?: boolean; displayHeight?: string; displayWidth?: string; isFloatingEmbed?: boolean; isOutOfFeed?: boolean; isReply?: boolean; linkHeight?: number; linkWidth?: number; parentCid?: string; purged?: boolean; removed?: boolean; spoiler?: boolean; showThumbnail?: boolean; setShowThumbnail: (showThumbnail: boolean) => void; } const Thumbnail = ({ commentMediaInfo, deleted, displayHeight, displayWidth, isFloatingEmbed, isOutOfFeed, isReply, purged, removed, spoiler, setShowThumbnail, }: MediaProps) => { const isMobile = useIsMobile(); const { patternThumbnailUrl, thumbnail, type, url } = commentMediaInfo || {}; let thumbnailComponent: React.ReactNode = null; const iframeThumbnail = patternThumbnailUrl || thumbnail; const { frameUrl: gifFrameUrl, status: gifFrameStatus } = useFetchGifFirstFrame(type === 'gif' ? url : undefined); const hasThumbnail = getHasThumbnail(commentMediaInfo, url); const gifThumbnailButtonProps = gifFrameStatus === 'loading' ? { role: 'button' as const, tabIndex: 0, onKeyDown: (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowThumbnail(false); } }, onClick: () => setShowThumbnail(false), } : {}; if (type === 'gif') { thumbnailComponent = gifFrameStatus === 'loading' ? ( ) : ( { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowThumbnail(false); } }} onClick={() => setShowThumbnail(false)} /> ); } else if (type === 'video') { thumbnailComponent = thumbnail ? ( ) : ( // show first frame of the video, as a workaround for Safari not loading thumbnails