import { Carousel } from "@mantine/carousel"; import { Button, Group, rem, Stack, Text, Transition } from "@mantine/core"; import { useEffect, useState } from "react"; import type { ImageSearchResult } from "../../../../modules/types"; import "@mantine/carousel/styles.css"; import Lightbox from "yet-another-react-lightbox"; import Captions from "yet-another-react-lightbox/plugins/captions"; import carouselClassNames from "./ImageResultsList.module.css"; import "yet-another-react-lightbox/styles.css"; import "yet-another-react-lightbox/plugins/captions.css"; import { addLogEntry } from "../../../../modules/logEntries"; import { getHostname } from "../../../../modules/stringFormatters"; interface ImageResultsState { isLightboxOpen: boolean; lightboxIndex: number; canStartTransition: boolean; } export default function ImageResultsList({ imageResults, }: { imageResults: ImageSearchResult[]; }) { const [state, setState] = useState({ isLightboxOpen: false, lightboxIndex: 0, canStartTransition: false, }); useEffect(() => { setState((prev) => ({ ...prev, canStartTransition: true })); }, []); const handleImageClick = (index: number) => { setState((prev) => ({ ...prev, lightboxIndex: index, isLightboxOpen: true, })); }; const imageStyle = { objectFit: "cover", height: rem(180), width: rem(240), borderRadius: rem(4), border: `${rem(2)} solid var(--mantine-color-default-border)`, cursor: "zoom-in", } as const; return ( <> {imageResults.map(([title, url, thumbnailUrl], index) => ( {(styles) => ( {title} handleImageClick(index)} onKeyDown={(e) => { if (e.key === "Enter") { handleImageClick(index); } }} style={imageStyle} /> )} ))} setState((prev) => ({ ...prev, isLightboxOpen: false }))} plugins={[Captions]} index={state.lightboxIndex} slides={imageResults.map(([title, url, thumbnailUrl, sourceUrl]) => ({ src: thumbnailUrl, alt: title, description: ( {title && ( {title} )} ), }))} /> ); }