import React, { useState } from "react"; import { PhotoProvider, PhotoView } from "react-photo-view"; import "react-photo-view/dist/react-photo-view.css"; import { AlertCircle, Download } from "lucide-react"; import { Button } from "@/components/button.tsx"; import { useTranslation } from "react-i18next"; interface ImagePreviewProps { content: string; fileName: string; onDownload?: () => void; onMediaDimensionsChange?: (dimensions: { width: number; height: number; }) => void; } function getImageDataUrl(content: string, fileName: string): string { const ext = fileName.split(".").pop()?.toLowerCase() || ""; const mimeTypes: Record = { svg: "image/svg+xml", png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", gif: "image/gif", webp: "image/webp", bmp: "image/bmp", ico: "image/x-icon", tiff: "image/tiff", tif: "image/tiff", }; const mimeType = mimeTypes[ext] || "image/png"; return `data:${mimeType};base64,${content}`; } export function ImagePreview({ content, fileName, onDownload, onMediaDimensionsChange, }: ImagePreviewProps) { const { t } = useTranslation(); const [imageLoadError, setImageLoadError] = useState(false); const [imageLoading, setImageLoading] = useState(true); const imageUrl = getImageDataUrl(content, fileName); return (
{imageLoadError ? (

{t("fileManager.imageLoadError")}

{fileName}

{onDownload && ( )}
) : ( {fileName} { setImageLoading(false); setImageLoadError(false); const img = e.currentTarget; if ( onMediaDimensionsChange && img.naturalWidth && img.naturalHeight ) { onMediaDimensionsChange({ width: img.naturalWidth, height: img.naturalHeight, }); } }} onError={() => { setImageLoading(false); setImageLoadError(true); }} /> )} {imageLoading && !imageLoadError && (

Loading image...

)}
); }