import { useCallback, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import useSWR from "swr"; import { Dialog, DialogContent, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { IoClose } from "react-icons/io5"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import Heading from "@/components/ui/heading"; import { cn } from "@/lib/utils"; import { Event } from "@/types/event"; import { useApiHost } from "@/api"; import { isDesktop, isMobile } from "react-device-detect"; type ImagePickerProps = { selectedImageId?: string; setSelectedImageId?: (id: string) => void; camera: string; }; export default function ImagePicker({ selectedImageId, setSelectedImageId, camera, }: ImagePickerProps) { const { t } = useTranslation(["components/dialog"]); const [open, setOpen] = useState(false); const containerRef = useRef(null); const [searchTerm, setSearchTerm] = useState(""); const { data: events } = useSWR( `events?camera=${camera}&limit=100`, { revalidateOnFocus: false, }, ); const apiHost = useApiHost(); const images = useMemo(() => { if (!events) return []; return events.filter( (event) => (event.label.toLowerCase().includes(searchTerm.toLowerCase()) || (event.sub_label && event.sub_label.toLowerCase().includes(searchTerm.toLowerCase())) || searchTerm === "") && event.camera === camera, ); }, [events, searchTerm, camera]); const selectedImage = useMemo( () => images.find((img) => img.id === selectedImageId), [images, selectedImageId], ); const handleImageSelect = useCallback( (id: string) => { if (setSelectedImageId) { setSelectedImageId(id); } setSearchTerm(""); setOpen(false); }, [setSelectedImageId], ); return (
{ setOpen(open); }} > {!selectedImageId ? ( ) : (
{selectedImage?.label
{selectedImage?.label || selectedImageId} {selectedImage?.sub_label ? ` (${selectedImage.sub_label})` : ""}
{ if (setSelectedImageId) { setSelectedImageId(""); } }} />
)}
{t("imagePicker.selectImage")}
{t("imagePicker.selectImage")}
setSearchTerm(e.target.value)} />
{images.length === 0 ? (
{t("imagePicker.noImages")}
) : ( images.map((image) => (
{image.label} handleImageSelect(image.id)} />
)) )}
); }