import { BinaryIcon, BookIcon, FileArchiveIcon, FileAudioIcon, FileEditIcon, FileIcon, FileTextIcon, FileVideo2Icon, SheetIcon, } from "lucide-react"; import React, { useState } from "react"; import { cn } from "@/lib/utils"; import { Attachment } from "@/types/proto/api/v1/attachment_service_pb"; import { getAttachmentThumbnailUrl, getAttachmentType, getAttachmentUrl } from "@/utils/attachment"; import SquareDiv from "./kit/SquareDiv"; import PreviewImageDialog from "./PreviewImageDialog"; interface Props { attachment: Attachment; className?: string; strokeWidth?: number; } const AttachmentIcon = (props: Props) => { const { attachment } = props; const [previewImage, setPreviewImage] = useState<{ open: boolean; urls: string[]; index: number }>({ open: false, urls: [], index: 0, }); const resourceType = getAttachmentType(attachment); const attachmentUrl = getAttachmentUrl(attachment); const className = cn("w-full h-auto", props.className); const strokeWidth = props.strokeWidth; const previewResource = () => { window.open(attachmentUrl); }; const handleImageClick = () => { setPreviewImage({ open: true, urls: [attachmentUrl], index: 0 }); }; if (resourceType === "image/*") { return ( <> { // Fallback to original image if thumbnail fails const target = e.target as HTMLImageElement; if (target.src.includes("?thumbnail=true")) { console.warn("Thumbnail failed, falling back to original image:", attachmentUrl); target.src = attachmentUrl; } }} decoding="async" loading="lazy" /> setPreviewImage((prev) => ({ ...prev, open }))} imgUrls={previewImage.urls} initialIndex={previewImage.index} /> ); } const getAttachmentIcon = () => { switch (resourceType) { case "video/*": return ; case "audio/*": return ; case "text/*": return ; case "application/epub+zip": return ; case "application/pdf": return ; case "application/msword": return ; case "application/msexcel": return ; case "application/zip": return ; case "application/x-java-archive": return ; default: return ; } }; return (
{getAttachmentIcon()}
); }; export default React.memo(AttachmentIcon);