'use client'; import { useState, useRef } from 'react'; import { Upload, X } from 'lucide-react'; import { apiUrl } from '@/lib/constants'; import { appendTokenToUrl, getAdminToken } from '@/lib/adminAuth'; interface FileUploadProps { roomCode: string; clientId: string; onFileUploaded: (fileEntry: any) => void; } export default function FileUploadComponent({ roomCode, clientId, onFileUploaded }: FileUploadProps) { const [isDragging, setIsDragging] = useState(false); const [isUploading, setIsUploading] = useState(false); const [uploadProgress, setUploadProgress] = useState(0); const [error, setError] = useState(null); const fileInputRef = useRef(null); const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }; const handleDragLeave = () => { setIsDragging(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { handleFileUpload(e.dataTransfer.files[0]); } }; const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { handleFileUpload(e.target.files[0]); } }; const handleFileUpload = async (file: File) => { // Validate file size (10MB max) if (file.size > 10 * 1024 * 1024) { setError('File size exceeds 10MB limit'); return; } setIsUploading(true); setUploadProgress(0); setError(null); const formData = new FormData(); formData.append('file', file); formData.append('clientId', clientId); try { const xhr = new XMLHttpRequest(); const token = getAdminToken(); const uploadUrl = appendTokenToUrl(`${apiUrl}/clipboard/${roomCode}/files`); xhr.upload.onprogress = (event) => { if (event.lengthComputable) { const progress = Math.round((event.loaded / event.total) * 100); setUploadProgress(progress); } }; xhr.onload = () => { if (xhr.status === 200 || xhr.status === 201) { const response = JSON.parse(xhr.responseText); onFileUploaded(response); setIsUploading(false); setUploadProgress(0); // Reset file input if (fileInputRef.current) { fileInputRef.current.value = ''; } } else { setError('Upload failed'); setIsUploading(false); } }; xhr.onerror = () => { setError('Network error occurred'); setIsUploading(false); }; xhr.open('POST', uploadUrl, true); if (token) { xhr.setRequestHeader('x-admin-token', token); } xhr.send(formData); } catch (err: any) { console.error('Error uploading file:', err); setError(err.message || 'An unexpected error occurred'); setIsUploading(false); } }; return (

Add File

fileInputRef.current?.click()} >

{isDragging ? 'Drop file here' : 'Click or drag file to upload'}

Max size: 10MB

{isUploading && (

Uploading: {uploadProgress}%

)} {error && (
{error}
)}
); }