import { WeeklyAvailability } from "@ui/hooks/availabilities"; import { Text } from "@ui/ui-library/text"; // Check if a time slot is available for a given day const isTimeSlotAvailable = ( day: number, timeSlot: string, draftAvailabilities: WeeklyAvailability ): boolean => { const dayAvailability = draftAvailabilities[day]; if (!dayAvailability.enabled) return false; const slotMinutes = timeToMinutes(timeSlot); return dayAvailability.timeRanges.some((range) => { const startMinutes = timeToMinutes(range.start); const endMinutes = timeToMinutes(range.end); return slotMinutes >= startMinutes && slotMinutes < endMinutes; }); }; // Helper function to convert time string to minutes const timeToMinutes = (time: string): number => { const [hours, minutes] = time.split(":").map(Number); return hours * 60 + minutes; }; // Helper function to convert minutes to time string const minutesToTime = (minutes: number): string => { const hours = Math.floor(minutes / 60); const mins = minutes % 60; return `${hours.toString().padStart(2, "0")}:${mins .toString() .padStart(2, "0")}`; }; // Generate time slots for visualization based on duration const generateTimeSlots = (intervalMinutes: number = 30) => { const slots = []; for (let hour = 0; hour < 24; hour++) { for (let minute = 0; minute < 60; minute += intervalMinutes) { slots.push(minutesToTime(hour * 60 + minute)); } } return slots; }; const DAYS_OF_WEEK = [0, 1, 2, 3, 4, 5, 6]; const DAYS_OF_WEEK_DISPLAY = [ "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche", ]; export const AvailabilityVisualization = ({ draftAvailabilities, slotDurationMinutes = 30, }: { draftAvailabilities: WeeklyAvailability; slotDurationMinutes?: number; }) => { const timeSlots = generateTimeSlots(slotDurationMinutes); return (
{/* Weekly Calendar Header */}
Heure
{DAYS_OF_WEEK.map((day) => (
{DAYS_OF_WEEK_DISPLAY[day]}
))}
{/* Time Slots */}
{timeSlots.map((timeSlot) => { const timeMinutes = timeToMinutes(timeSlot); const hour = Math.floor(timeMinutes / 60); // Only show hours from 6 AM to 11 PM if (hour < 6 || hour > 23) return null; return (
{timeSlot}
{DAYS_OF_WEEK.map((day) => (
{isTimeSlotAvailable(day, timeSlot, draftAvailabilities) ? (
) : (
)}
))}
); })}
); };