Fix send to client: use primary submission, add error handling
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -105,52 +105,52 @@ export default function TaskDetail() {
|
|||||||
const handleSendToClient = async (e) => {
|
const handleSendToClient = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setSaving(true);
|
setSaving(true);
|
||||||
const latestSub = submissions[submissions.length - 1];
|
try {
|
||||||
if (!latestSub) return;
|
// 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 = [];
|
const uploadedFiles = [];
|
||||||
for (const file of sendForm.files) {
|
for (const file of sendForm.files) {
|
||||||
const path = `${id}/${Date.now()}_${file.name}`;
|
const path = `${id}/${Date.now()}_${file.name}`;
|
||||||
const { data: uploaded } = await supabase.storage.from('deliveries').upload(path, file);
|
const { data: uploaded, error } = await supabase.storage.from('deliveries').upload(path, file);
|
||||||
if (uploaded) uploadedFiles.push({ name: file.name, storage_path: path, size: file.size });
|
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({
|
const { data: delivery, error: deliveryError } = await supabase.from('deliveries').insert({
|
||||||
submission_id: latestSub.id,
|
submission_id: primarySub.id,
|
||||||
sent_by: currentUser?.name,
|
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,
|
|
||||||
message: sendForm.message,
|
message: sendForm.message,
|
||||||
taskId: id,
|
}).select().single();
|
||||||
});
|
if (deliveryError) throw new Error(`Delivery failed: ${deliveryError.message}`);
|
||||||
}
|
|
||||||
|
|
||||||
setShowSendForm(false);
|
if (delivery && uploadedFiles.length > 0) {
|
||||||
setSendForm({ files: [], message: '' });
|
await supabase.from('delivery_files').insert(
|
||||||
setNotification(`✓ Sent to client — ${company?.name} has been notified with ${uploadedFiles.length} file${uploadedFiles.length !== 1 ? 's' : ''}.`);
|
uploadedFiles.map(f => ({ ...f, delivery_id: delivery.id }))
|
||||||
setSaving(false);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) => {
|
const getFileUrl = async (path) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user