From 71b34a4700bdd40e990485ffe187a9daa83e471f Mon Sep 17 00:00:00 2001 From: Krao Hasanee Date: Fri, 27 Mar 2026 00:41:15 -0400 Subject: [PATCH] Fix send to client: use primary submission, add error handling Co-Authored-By: Claude Sonnet 4.6 --- src/pages/team/TaskDetail.jsx | 84 +++++++++++++++++------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/pages/team/TaskDetail.jsx b/src/pages/team/TaskDetail.jsx index ae8782f..5a5c50e 100755 --- a/src/pages/team/TaskDetail.jsx +++ b/src/pages/team/TaskDetail.jsx @@ -105,52 +105,52 @@ export default function TaskDetail() { const handleSendToClient = async (e) => { e.preventDefault(); setSaving(true); - const latestSub = submissions[submissions.length - 1]; - if (!latestSub) return; + try { + // Use the primary (non-amendment) submission for the current version + const currentVersion = (task.current_version || 0) + 1; + const primarySub = submissions.find(s => s.version_number === currentVersion && s.type !== 'amendment') + || submissions.filter(s => s.type !== 'amendment').pop(); + if (!primarySub) { setSaving(false); return; } - const uploadedFiles = []; - for (const file of sendForm.files) { - const path = `${id}/${Date.now()}_${file.name}`; - const { data: uploaded } = await supabase.storage.from('deliveries').upload(path, file); - if (uploaded) uploadedFiles.push({ name: file.name, storage_path: path, size: file.size }); - } + const uploadedFiles = []; + for (const file of sendForm.files) { + const path = `${id}/${Date.now()}_${file.name}`; + const { data: uploaded, error } = await supabase.storage.from('deliveries').upload(path, file); + if (error) throw new Error(`Upload failed: ${error.message}`); + if (uploaded) uploadedFiles.push({ name: file.name, storage_path: path, size: file.size }); + } - const { data: delivery } = await supabase.from('deliveries').insert({ - submission_id: latestSub.id, - sent_by: currentUser?.name, - message: sendForm.message, - }).select().single(); - - if (delivery && uploadedFiles.length > 0) { - await supabase.from('delivery_files').insert( - uploadedFiles.map(f => ({ ...f, delivery_id: delivery.id })) - ); - } - - await supabase.from('tasks').update({ status: 'client_review' }).eq('id', id); - setTask(t => ({ ...t, status: 'client_review' })); - - const { data: subs } = await supabase - .from('submissions') - .select('*, delivery:deliveries(*, files:delivery_files(*))') - .eq('task_id', id) - .order('version_number'); - setSubmissions(subs || []); - - if (company?.email) { - sendEmail('sent_to_client', company.email, { - clientFirstName: company.name, - serviceType: task.title, - projectName: project?.name, + const { data: delivery, error: deliveryError } = await supabase.from('deliveries').insert({ + submission_id: primarySub.id, + sent_by: currentUser?.name, message: sendForm.message, - taskId: id, - }); - } + }).select().single(); + if (deliveryError) throw new Error(`Delivery failed: ${deliveryError.message}`); - setShowSendForm(false); - setSendForm({ files: [], message: '' }); - setNotification(`✓ Sent to client — ${company?.name} has been notified with ${uploadedFiles.length} file${uploadedFiles.length !== 1 ? 's' : ''}.`); - setSaving(false); + if (delivery && uploadedFiles.length > 0) { + await supabase.from('delivery_files').insert( + uploadedFiles.map(f => ({ ...f, delivery_id: delivery.id })) + ); + } + + await supabase.from('tasks').update({ status: 'client_review' }).eq('id', id); + setTask(t => ({ ...t, status: 'client_review' })); + + const { data: subs } = await supabase + .from('submissions') + .select('*, delivery:deliveries(*, files:delivery_files(*))') + .eq('task_id', id) + .order('version_number'); + setSubmissions(subs || []); + + setShowSendForm(false); + setSendForm({ files: [], message: '' }); + setNotification(`✓ Sent to client — ${uploadedFiles.length} file${uploadedFiles.length !== 1 ? 's' : ''} delivered.`); + } catch (err) { + setNotification(`✗ Error: ${err.message}`); + } finally { + setSaving(false); + } }; const getFileUrl = async (path) => {