"use client" import { useCallback, useEffect, useLayoutEffect, useRef, useState, } from "react" import type { EmailAttachment } from "@/lib/email-data" import { ListAttachmentChip } from "./list-attachment-chip" export function EmailListAttachmentRow({ emailId, attachments, }: { emailId: string attachments: EmailAttachment[] }) { const containerRef = useRef(null) const measureRef = useRef(null) const [collapsed, setCollapsed] = useState(false) const attachSig = attachments.map((a) => `${a.name}\u0001${a.kind ?? ""}`).join("\u0002") const updateCollapsed = useCallback(() => { const container = containerRef.current const measure = measureRef.current if (!container || !measure || attachments.length <= 1) { setCollapsed(false) return } const available = container.clientWidth const needed = measure.scrollWidth setCollapsed(needed > available + 1) }, [attachSig, attachments.length]) useLayoutEffect(() => { updateCollapsed() }, [updateCollapsed]) useEffect(() => { const el = containerRef.current if (!el || typeof ResizeObserver === "undefined") return const ro = new ResizeObserver(() => updateCollapsed()) ro.observe(el) return () => ro.disconnect() }, [updateCollapsed]) const othersLabel = attachments.length - 1 === 1 ? "1 autre" : `${attachments.length - 1} autres` const othersTitle = attachments .slice(1) .map((a) => a.name) .join(", ") return (
{attachments.length > 1 && (
{attachments.map((att, idx) => ( ))}
)}
{collapsed && attachments.length > 1 ? ( <> {othersLabel} ) : ( attachments.map((att, idx) => ( )) )}
) }