import { useState } from 'react'; export default function BulkInviteModal({ collectionId, isOpen, onClose, onSuccess }) { const [inviteData, setInviteData] = useState({ emails: '', role: 'viewer', message: '' }); const [processing, setProcessing] = useState(false); const [results, setResults] = useState(null); const handleSubmit = async (e) => { e.preventDefault(); setProcessing(true); setResults(null); try { // Parse emails (split by comma, semicolon, or newline) const emailList = inviteData.emails .split(/[,;\n]/) .map(email => email.trim()) .filter(email => email && email.includes('@')); if (emailList.length === 0) { alert('Please enter at least one valid email address'); setProcessing(false); return; } // Send invitations const invitePromises = emailList.map(email => fetch(`/api/collections/${collectionId}/permissions`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, role: inviteData.role, message: inviteData.message }) }).then(async response => ({ email, success: response.ok, error: response.ok ? null : (await response.json()).error })) ); const results = await Promise.all(invitePromises); setResults(results); const successCount = results.filter(r => r.success).length; if (successCount > 0 && onSuccess) { onSuccess(); } } catch (error) { console.error('Bulk invite error:', error); alert('An error occurred while sending invitations'); } finally { setProcessing(false); } }; const handleClose = () => { setInviteData({ emails: '', role: 'viewer', message: '' }); setResults(null); onClose(); }; const successCount = results ? results.filter(r => r.success).length : 0; const failureCount = results ? results.filter(r => !r.success).length : 0; if (!isOpen) return null; return (
{successCount} successful, {failureCount} failed