'use client'; import React, { useEffect, useRef, useState, useCallback } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { X, Send, FileText, Film, Music, Archive, File } from 'lucide-react'; interface FilePreviewModalProps { file: File | null; onConfirm: (file: File, caption: string) => Promise; onCancel: () => void; } function formatFileSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; } function getFileIcon(type: string) { if (type.startsWith('video/')) return ; if (type.startsWith('audio/')) return ; if (type.includes('pdf') || type.includes('document') || type.includes('word')) return ; if (type.includes('zip') || type.includes('compressed') || type.includes('tar')) return ; return ; } function getFileLabel(type: string): string { if (type.startsWith('image/')) return 'Imagem'; if (type.startsWith('video/')) return 'Vídeo'; if (type.startsWith('audio/')) return 'Áudio'; if (type.includes('pdf')) return 'PDF'; return 'Arquivo'; } export default function FilePreviewModal({ file, onConfirm, onCancel }: FilePreviewModalProps) { const [caption, setCaption] = useState(''); const [sending, setSending] = useState(false); const [objectUrl, setObjectUrl] = useState(null); const captionRef = useRef(null); const isImage = file?.type.startsWith('image/'); const isVideo = file?.type.startsWith('video/'); // Create / revoke object URL useEffect(() => { if (!file) { setObjectUrl(null); return; } const url = URL.createObjectURL(file); setObjectUrl(url); setCaption(''); setSending(false); setTimeout(() => captionRef.current?.focus(), 200); return () => URL.revokeObjectURL(url); }, [file]); // ESC cancels useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onCancel(); }; document.addEventListener('keydown', onKey); return () => document.removeEventListener('keydown', onKey); }, [onCancel]); const handleSend = useCallback(async () => { if (!file || sending) return; setSending(true); try { await onConfirm(file, caption.trim()); } finally { setSending(false); } }, [file, caption, sending, onConfirm]); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }; return ( {file && ( {/* ── Top bar ── */}
{file ? getFileLabel(file.type) : ''}
{/* spacer */}
{/* ── Preview area ── */}
{isImage && objectUrl && ( )} {isVideo && objectUrl && ( )} {!isImage && !isVideo && file && ( {getFileIcon(file.type)}

{file.name}

{formatFileSize(file.size)}

)}
{/* ── Caption + Send bar ── */}
setCaption(e.target.value)} onKeyDown={handleKeyDown} disabled={sending} className="flex-1 bg-[#2a3942] text-[#e9edef] placeholder:text-[#8696a0] text-sm rounded-full px-4 py-2.5 outline-none border-none focus:ring-0 disabled:opacity-50" />
)} ); }