import { ExtendedKind, isMusicTrackKind, isNip71StyleVideoKind } from '@/constants' import { getMusicTrackFromEvent } from '@/lib/music-track' import { isLongFormNip71VideoEventKind } from '@/lib/long-video-load-policy' import { getCachedThreadContextEvents } from '@/lib/navigation-related-events' import { toNote } from '@/lib/link' import client from '@/services/client.service' import { extractAllMediaFromEvent } from '@/services/media-extraction.service' import { useSmartNoteNavigationOptional } from '@/PageManager' import { Image as ImageIcon, Images, Music, Play } from 'lucide-react' import { type Event } from 'nostr-tools' import { useMemo } from 'react' export default function MediaGridItem({ event }: { event: Event }) { const { navigateToNote } = useSmartNoteNavigationOptional() const media = useMemo(() => extractAllMediaFromEvent(event), [event]) const first = media.all[0] /** Kind 20 is always treated as image unless imeta explicitly says video (rare mis-tag). */ const isPictureKind = event.kind === ExtendedKind.PICTURE const isLongFormVideo = isLongFormNip71VideoEventKind(event.kind) const isVideo = (!isPictureKind && first?.m?.startsWith('video/')) || (!isPictureKind && isNip71StyleVideoKind(event.kind)) const musicTrack = isMusicTrackKind(event.kind) ? getMusicTrackFromEvent(event) : null const isAudio = first?.m?.startsWith('audio/') || event.kind === ExtendedKind.VOICE || musicTrack != null const hasMultiple = media.all.length > 1 // For videos prefer the poster image; long-form feed tiles never prefetch the .mp4 (open note to play). const displayUrl = isVideo ? isLongFormVideo ? (first?.image ?? first?.thumb) : (first?.image ?? first?.url) : musicTrack?.imageUrl ?? first?.thumb ?? first?.url const handleClick = () => { client.addEventToCache(event) navigateToNote(toNote(event), event, getCachedThreadContextEvents(event)) } return (
{displayUrl ? ( isVideo && !isLongFormVideo && !(first?.image ?? first?.thumb) && first?.url ? (
) }