import { NostrLink, TaggedNostrEvent } from "@snort/system"; import { memo, MouseEvent, ReactNode } from "react"; import { useInView } from "react-intersection-observer"; import { Link } from "react-router-dom"; import Icon from "@/Components/Icons/Icon"; import { ProxyImg } from "@/Components/ProxyImg"; import getEventMedia from "@/Utils/getEventMedia"; interface ImageGridItemProps { event: TaggedNostrEvent; onClick?: (event: MouseEvent) => void; waitUntilInView?: boolean; } const ImageGridItem = memo((props: ImageGridItemProps) => { const { event, onClick, waitUntilInView } = props; const { ref, inView } = useInView({ triggerOnce: true, rootMargin: "0px 0px 3000px 0px" }); const media = getEventMedia(event); if (media.length === 0) return null; const multiple = media.length > 1; const isVideo = media[0].mimeType?.startsWith("video/"); const noteId = NostrLink.fromEvent(event).encode(CONFIG.eventLinkPrefix); const myOnClick = (clickEvent: MouseEvent) => { if (onClick && window.innerWidth >= 768) { onClick(clickEvent); clickEvent.preventDefault(); } }; const renderContent = (): ReactNode | undefined => { if (waitUntilInView && !inView) return undefined; return ( <>
{multiple && } {isVideo && }
); }; return ( {renderContent()} ); }); ImageGridItem.displayName = "ImageGridItem"; export default ImageGridItem;