import { Modal } from "@mantine/core"; import { useEffect, useState } from "react"; import type { Task } from "../types"; export function ReplyImagePreview({ task, url, alt, loadImage, source, onLightboxChange }: { task: Task; url: string; alt: string; loadImage: (task: Task, url?: string) => Promise; source?: string | null; onLightboxChange?: (opened: boolean) => void }) { const [src, setSrc] = useState(source ?? null); const [failed, setFailed] = useState(false); const [opened, setOpened] = useState(false); useEffect(() => { let cancelled = false; setSrc(source ?? null); setFailed(false); if (source) return; void loadImage(task, url).then(value => { if (!cancelled) { if (value && /^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/=]+$/.test(value)) setSrc(value); else setFailed(true); } }).catch(() => { if (!cancelled) setFailed(true); }); return () => { cancelled = true; }; }, [task.id, task.turnId, url, loadImage, source]); useEffect(() => { if (!opened) return; onLightboxChange?.(true); return () => onLightboxChange?.(false); }, [opened, onLightboxChange]); if (failed) return null; if (!src) return ; return setOpened(false)} title={alt} centered size="auto" zIndex={400} classNames={{ content: "taskchef-image-lightbox" }}> {alt} { setFailed(true); setOpened(false); }} /> ; }