"use client"; import { useEffect, useRef, useState } from "react"; import { useI18n } from "@/hooks/useI18n"; interface ImagePreviewProps { src: string; alt?: string; children: React.ReactNode; className?: string; style?: React.CSSProperties; } export function ImagePreview({ src, alt = "", children, className, style }: ImagePreviewProps) { const { t } = useI18n(); const [open, setOpen] = useState(false); const triggerRef = useRef(null); const dialogRef = useRef(null); const closeButtonRef = useRef(null); useEffect(() => { if (!open) return; const dialog = dialogRef.current; if (!dialog) return; const trigger = triggerRef.current; const previousOverflow = document.body.style.overflow; document.body.style.overflow = "hidden"; dialog.showModal(); closeButtonRef.current?.focus({ preventScroll: true }); return () => { document.body.style.overflow = previousOverflow; if (dialog.open) dialog.close(); if (trigger?.isConnected) { trigger.focus({ preventScroll: true }); } }; }, [open]); const closePreview = () => { if (dialogRef.current?.open) dialogRef.current.close(); setOpen(false); }; return ( <> {open && ( { event.preventDefault(); event.stopPropagation(); closePreview(); }} onKeyDown={(event) => { if (event.key !== "Escape") return; event.preventDefault(); event.stopPropagation(); closePreview(); }} onClick={(event) => { if (event.target === event.currentTarget) closePreview(); }} > {/* eslint-disable-next-line @next/next/no-img-element */} {alt} )} ); }