vision refactor

This commit is contained in:
alma 2026-01-15 19:35:31 +01:00
parent 35af854428
commit 085b3d72fc

View File

@ -64,6 +64,7 @@ export default function VisionPage() {
} | null>(null);
const [jitsiUrl, setJitsiUrl] = useState<string | null>(null);
const [scheduledMeetings, setScheduledMeetings] = useState<ScheduledMeeting[]>([]);
const [meetingsLoading, setMeetingsLoading] = useState(false);
const [showMeetingDialog, setShowMeetingDialog] = useState(false);
const [selectedDate, setSelectedDate] = useState<Date | undefined>(new Date());
const [meetingForm, setMeetingForm] = useState<{
@ -97,26 +98,89 @@ export default function VisionPage() {
}
}, [status]);
// Load scheduled meetings from localStorage
useEffect(() => {
if (status === "authenticated" && session?.user?.id) {
const stored = localStorage.getItem(`meetings_${session.user.id}`);
if (stored) {
try {
setScheduledMeetings(JSON.parse(stored));
} catch (e) {
console.error("Error loading meetings:", e);
}
}
}
}, [session, status]);
// Helper function to convert calendars to ScheduledMeeting format
const convertCalendarsToMeetings = (calendarsData: any[]): ScheduledMeeting[] => {
const groupAndMissionCalendars = calendarsData.filter((cal: any) => {
const isGroup = cal.name?.startsWith("Groupe:");
const isMission = cal.name?.startsWith("Mission:");
return isGroup || isMission;
});
// Save scheduled meetings to localStorage
const meetings: ScheduledMeeting[] = [];
groupAndMissionCalendars.forEach((calendar: any) => {
const calendarName = calendar.name || "";
const isGroup = calendarName.startsWith("Groupe:");
const isMission = calendarName.startsWith("Mission:");
// Extract entity name from calendar name
let entityName = "";
let entityId = "";
if (isGroup) {
entityName = calendarName.replace("Groupe: ", "");
// Find matching group by name
const matchingGroup = groups.find((g: Group) => g.name === entityName);
entityId = matchingGroup?.id || "";
} else if (isMission) {
entityName = calendarName.replace("Mission: ", "");
// Find matching mission by name
const matchingMission = missions.find((m: Mission) => m.name === entityName);
entityId = matchingMission?.id || calendar.missionId || "";
}
// Convert events to ScheduledMeeting format
(calendar.events || []).forEach((event: any) => {
const eventStart = new Date(event.start);
const dateStr = eventStart.toISOString().split('T')[0];
const timeStr = event.isAllDay ? "" : eventStart.toTimeString().slice(0, 5);
meetings.push({
id: event.id,
type: isGroup ? "group" : "mission",
entityId: entityId,
entityName: entityName,
date: dateStr,
time: timeStr,
title: event.title,
});
});
});
return meetings;
};
// Load meetings from database (events from group and mission calendars)
useEffect(() => {
if (status === "authenticated" && session?.user?.id && scheduledMeetings.length >= 0) {
localStorage.setItem(`meetings_${session.user.id}`, JSON.stringify(scheduledMeetings));
}
}, [scheduledMeetings, session, status]);
const fetchMeetings = async () => {
if (status !== "authenticated" || !session?.user?.id) {
return;
}
try {
setMeetingsLoading(true);
// Fetch calendars with events
const calendarsResponse = await fetch("/api/calendars");
if (!calendarsResponse.ok) {
throw new Error("Impossible de charger les calendriers");
}
const calendarsData = await calendarsResponse.json();
const meetings = convertCalendarsToMeetings(calendarsData);
setScheduledMeetings(meetings);
} catch (error) {
console.error("Error loading meetings:", error);
toast({
title: "Erreur",
description: "Impossible de charger les réunions",
variant: "destructive",
});
} finally {
setMeetingsLoading(false);
}
};
fetchMeetings();
}, [session, status, groups, missions, toast]);
// Fetch user groups and missions
useEffect(() => {
@ -263,11 +327,11 @@ export default function VisionPage() {
try {
// Fetch user calendars to find the matching calendar
const calendarsRes = await fetch("/api/calendars");
if (!calendarsRes.ok) {
const calendarsResponse = await fetch("/api/calendars");
if (!calendarsResponse.ok) {
throw new Error("Impossible de charger les calendriers");
}
const calendars = await calendarsRes.json();
const calendars = await calendarsResponse.json();
// Find the calendar for this mission or group
let targetCalendar = null;
@ -354,23 +418,13 @@ export default function VisionPage() {
await Promise.all(eventPromises);
// Also update localStorage for Vision page display
const meetings: ScheduledMeeting[] = eventsToCreate.map(({ start }, index) => {
const dateStr = start.toISOString().split('T')[0];
const timeStr = meetingForm.allDay ? "" : start.toTimeString().slice(0, 5);
return {
id: `${Date.now()}-${index}-${Math.random()}`,
type: meetingForm.type,
entityId: meetingForm.entityId,
entityName: meetingForm.entityName,
date: dateStr,
time: timeStr,
title: meetingForm.title || `${meetingForm.type === "group" ? "Groupe" : "Mission"}: ${meetingForm.entityName}`,
};
});
setScheduledMeetings([...scheduledMeetings, ...meetings]);
// Refresh meetings from database after creation
const calendarsResponse = await fetch("/api/calendars");
if (calendarsResponse.ok) {
const calendarsData = await calendarsResponse.json();
const meetings = convertCalendarsToMeetings(calendarsData);
setScheduledMeetings(meetings);
}
setShowMeetingDialog(false);
setMeetingForm({
type: "",
@ -399,12 +453,37 @@ export default function VisionPage() {
};
// Handle delete meeting
const handleDeleteMeeting = (meetingId: string) => {
setScheduledMeetings(scheduledMeetings.filter(m => m.id !== meetingId));
toast({
title: "Succès",
description: "Réunion supprimée",
});
const handleDeleteMeeting = async (meetingId: string) => {
try {
const response = await fetch(`/api/events/${meetingId}`, {
method: "DELETE",
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || "Erreur lors de la suppression");
}
// Refresh meetings from database after deletion
const calendarsResponse = await fetch("/api/calendars");
if (calendarsResponse.ok) {
const calendarsData = await calendarsResponse.json();
const meetings = convertCalendarsToMeetings(calendarsData);
setScheduledMeetings(meetings);
}
toast({
title: "Succès",
description: "Réunion supprimée",
});
} catch (error) {
console.error("Error deleting meeting:", error);
toast({
title: "Erreur",
description: error instanceof Error ? error.message : "Erreur lors de la suppression",
variant: "destructive",
});
}
};
// Format date for display