import React, { useState } from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; import { ChevronLeft, ChevronRight } from 'lucide-react-native'; import { TimeOffRequest, TimeOffRequestType } from '@/types/types'; interface CalendarWidgetProps { events: TimeOffRequest[]; types: TimeOffRequestType[]; } export default function CalendarWidget({ events, types }: CalendarWidgetProps) { const [currentDate, setCurrentDate] = useState(new Date()); // Helpers per il calendario const daysInMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate(); const firstDayOfMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1).getDay(); // 0 = Sun const adjustedFirstDay = firstDayOfMonth === 0 ? 6 : firstDayOfMonth - 1; // 0 = Mon const weekDays = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom']; const changeMonth = (increment: number) => { const newDate = new Date(currentDate.setMonth(currentDate.getMonth() + increment)); setCurrentDate(new Date(newDate)); }; const getEventForDay = (day: number) => { const year = currentDate.getFullYear(); const month = String(currentDate.getMonth() + 1).padStart(2, '0'); const dayStr = String(day).padStart(2, '0'); const dateStr = `${year}-${month}-${dayStr}`; return events.find(event => { // Logica semplice: controlla se la data cade nel range // Nota: per una logica perfetta sui range lunghi, servirebbe un controllo più approfondito if (event.timeOffRequestType.name === 'Permesso') return event.start_date === dateStr; const end = event.end_date || event.start_date; return dateStr >= event.start_date && dateStr <= end; }); }; return ( {/* Header Mese */} changeMonth(-1)} className="p-2 bg-gray-50 rounded-full" > {currentDate.toLocaleString('it-IT', { month: 'long', year: 'numeric' })} changeMonth(1)} className="p-2 bg-gray-50 rounded-full" > {/* Week Header */} {weekDays.map(day => ( {day} ))} {/* Days Grid */} {/* Empty slots for alignment */} {Array.from({ length: adjustedFirstDay }).map((_, i) => ( ))} {/* Days */} {Array.from({ length: daysInMonth }).map((_, i) => { const day = i + 1; const event = getEventForDay(day); let bgClass = 'bg-transparent'; let textClass = 'text-gray-700'; let borderClass = 'border-transparent'; const bgColor = event?.timeOffRequestType?.color ? `${event.timeOffRequestType.color}25` : 'transparent'; const borderColor = event?.timeOffRequestType?.color || 'transparent'; const textColor = event ? event.timeOffRequestType?.color : '#374151'; return ( {day} ); })} {/* Legenda */} {types.map((type) => ( {type.name} ))} ); }