'use client'; import React, { useState } from 'react'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { formatDateForAPI, createDate, getToday } from '@/lib/date-utils'; import { format } from 'date-fns'; import { fr } from 'date-fns/locale'; interface CalendarProps { currentDate: Date; onDateSelect: (date: Date) => void; markedDates?: string[]; // Liste des dates marquées (format YYYY-MM-DD) showTodayButton?: boolean; showLegend?: boolean; className?: string; } export function Calendar({ currentDate, onDateSelect, markedDates = [], showTodayButton = true, showLegend = true, className = '' }: CalendarProps) { const [viewDate, setViewDate] = useState(createDate(currentDate)); // Formatage des dates pour comparaison (éviter le décalage timezone) const formatDateKey = (date: Date) => { return formatDateForAPI(date); }; const currentDateKey = formatDateKey(currentDate); // Navigation mois const goToPreviousMonth = () => { const newDate = createDate(viewDate); newDate.setMonth(newDate.getMonth() - 1); setViewDate(newDate); }; const goToNextMonth = () => { const newDate = createDate(viewDate); newDate.setMonth(newDate.getMonth() + 1); setViewDate(newDate); }; const goToToday = () => { const today = getToday(); setViewDate(today); onDateSelect(today); }; // Obtenir les jours du mois const getDaysInMonth = () => { const year = viewDate.getFullYear(); const month = viewDate.getMonth(); // Premier jour du mois const firstDay = new Date(year, month, 1); // Dernier jour du mois const lastDay = new Date(year, month + 1, 0); // Premier lundi de la semaine contenant le premier jour const startDate = createDate(firstDay); const dayOfWeek = firstDay.getDay(); const daysToSubtract = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // Lundi = 0 startDate.setDate(firstDay.getDate() - daysToSubtract); // Générer toutes les dates du calendrier (6 semaines) const days = []; const currentDay = createDate(startDate); for (let i = 0; i < 42; i++) { // 6 semaines × 7 jours days.push(createDate(currentDay)); currentDay.setDate(currentDay.getDate() + 1); } return { days, firstDay, lastDay }; }; const { days } = getDaysInMonth(); const handleDateClick = (date: Date) => { onDateSelect(date); }; const isTodayDate = (date: Date) => { const today = getToday(); return formatDateKey(date) === formatDateKey(today); }; const isCurrentMonth = (date: Date) => { return date.getMonth() === viewDate.getMonth(); }; const hasMarkedDate = (date: Date) => { return markedDates.includes(formatDateKey(date)); }; const isSelected = (date: Date) => { return formatDateKey(date) === currentDateKey; }; const formatMonthYear = () => { return format(viewDate, 'MMMM yyyy', { locale: fr }); }; const weekDays = ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim']; return ( {/* Header avec navigation */}

{formatMonthYear()}

{/* Bouton Aujourd'hui */} {showTodayButton && (
)} {/* Jours de la semaine */}
{weekDays.map((day) => (
{day}
))}
{/* Grille du calendrier */}
{days.map((date, index) => { const isCurrentMonthDay = isCurrentMonth(date); const isTodayDay = isTodayDate(date); const hasMarked = hasMarkedDate(date); const isSelectedDay = isSelected(date); return ( ); })}
{/* Légende */} {showLegend && (
Jour avec des éléments
Aujourd'hui
)}
); }