diff --git a/components/missions/missions-admin-panel.tsx b/components/missions/missions-admin-panel.tsx index 8d5b0550..6a603a31 100644 --- a/components/missions/missions-admin-panel.tsx +++ b/components/missions/missions-admin-panel.tsx @@ -17,7 +17,7 @@ import { CardContent } from "../ui/card"; import { Badge } from "../ui/badge"; -import { X, Search, UserPlus, Users, PlusCircle, AlertCircle, Check } from "lucide-react"; +import { X, Search, UserPlus, Users, PlusCircle, AlertCircle, Check, UploadCloud, File } from "lucide-react"; import { toast } from "../ui/use-toast"; import { DropdownMenu, @@ -65,6 +65,7 @@ export function MissionsAdminPanel() { const [activeTab, setActiveTab] = useState("general"); const [isSubmitting, setIsSubmitting] = useState(false); const [selectedLogoFile, setSelectedLogoFile] = useState(null); + const [selectedAttachments, setSelectedAttachments] = useState([]); const [missionData, setMissionData] = useState<{ name?: string; logo?: string; @@ -416,18 +417,23 @@ export function MissionsAdminPanel() { const data = await response.json(); - // If we have a selected logo file and this is a new mission, upload it now - if (selectedLogoFile && data.mission && data.mission.id) { - console.log('Uploading logo for new mission:', data.mission.id); + const newMissionId = data.mission?.id; + if (!newMissionId) { + throw new Error('Failed to get new mission ID'); + } + + // Upload logo if selected + if (selectedLogoFile) { + console.log('Uploading logo for new mission:', newMissionId); - const formData = new FormData(); - formData.append('file', selectedLogoFile); - formData.append('missionId', data.mission.id); - formData.append('type', 'logo'); + const logoFormData = new FormData(); + logoFormData.append('file', selectedLogoFile); + logoFormData.append('missionId', newMissionId); + logoFormData.append('type', 'logo'); const logoResponse = await fetch('/api/missions/upload', { method: 'POST', - body: formData + body: logoFormData }); if (!logoResponse.ok) { @@ -438,6 +444,42 @@ export function MissionsAdminPanel() { } } + // Upload all attachments if there are any + if (selectedAttachments.length > 0) { + console.log(`Uploading ${selectedAttachments.length} attachments for new mission:`, newMissionId); + + const uploadPromises = selectedAttachments.map(async (file) => { + const attachmentFormData = new FormData(); + attachmentFormData.append('file', file); + attachmentFormData.append('missionId', newMissionId); + attachmentFormData.append('type', 'attachment'); + + try { + const attachmentResponse = await fetch('/api/missions/upload', { + method: 'POST', + body: attachmentFormData + }); + + if (!attachmentResponse.ok) { + console.error(`Failed to upload attachment ${file.name}:`, await attachmentResponse.json()); + return false; + } else { + console.log(`Attachment ${file.name} uploaded successfully`); + return true; + } + } catch (error) { + console.error(`Error uploading attachment ${file.name}:`, error); + return false; + } + }); + + // Wait for all attachments to upload + const results = await Promise.allSettled(uploadPromises); + const successCount = results.filter(r => r.status === 'fulfilled' && r.value === true).length; + + console.log(`Uploaded ${successCount} of ${selectedAttachments.length} attachments`); + } + toast({ title: "Mission créée avec succès", description: "Tous les gardiens ont été assignés et la mission a été enregistrée.", @@ -837,11 +879,71 @@ export function MissionsAdminPanel() {
- + {/* For new missions */} + {!missionId ? ( +
+
+

Add Attachments

+

Attachments will be uploaded when you save the mission.

+ + {selectedAttachments.length > 0 && ( +
+
Selected Files ({selectedAttachments.length})
+
    + {selectedAttachments.map((file, index) => ( +
  • +
    + + {file.name} + ({(file.size / 1024).toFixed(1)} KB) +
    + +
  • + ))} +
+
+ )} + +
+ +
+
+
+ ) : ( + /* For existing missions */ + + )}