import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Calendar, MapPin, Clock, Shield, Car, ChevronLeft, ChevronRight } from "lucide-react"; import { format, addDays, startOfWeek, parseISO, isValid } from "date-fns"; import { it } from "date-fns/locale"; interface ShiftAssignment { id: string; shiftId: string; plannedStartTime: string; plannedEndTime: string; armed: boolean; vehicleId: string | null; vehiclePlate: string | null; site: { id: string; name: string; address: string; location: string; }; shift: { shiftDate: string; startTime: string; endTime: string; }; } export default function MyShiftsFixed() { // Data iniziale: inizio settimana corrente const [currentWeekStart, setCurrentWeekStart] = useState(() => { const today = new Date(); return startOfWeek(today, { weekStartsOn: 1 }); }); // Query per recuperare i turni fissi della guardia loggata const { data: user } = useQuery({ queryKey: ["/api/auth/user"], }); const { data: myShifts, isLoading } = useQuery({ queryKey: ["/api/my-shifts/fixed", currentWeekStart.toISOString()], queryFn: async () => { const weekEnd = addDays(currentWeekStart, 6); const response = await fetch( `/api/my-shifts/fixed?startDate=${currentWeekStart.toISOString()}&endDate=${weekEnd.toISOString()}` ); if (!response.ok) throw new Error("Failed to fetch shifts"); return response.json(); }, enabled: !!user, }); // Naviga settimana precedente const handlePreviousWeek = () => { setCurrentWeekStart(addDays(currentWeekStart, -7)); }; // Naviga settimana successiva const handleNextWeek = () => { setCurrentWeekStart(addDays(currentWeekStart, 7)); }; // Raggruppa i turni per giorno const shiftsByDay = myShifts?.reduce((acc, shift) => { const date = shift.shift.shiftDate; if (!acc[date]) acc[date] = []; acc[date].push(shift); return acc; }, {} as Record) || {}; // Genera array di 7 giorni della settimana const weekDays = Array.from({ length: 7 }, (_, i) => addDays(currentWeekStart, i)); const locationLabels: Record = { roccapiemonte: "Roccapiemonte", milano: "Milano", roma: "Roma", }; return (
{/* Header */}

I Miei Turni Fissi

Visualizza i tuoi turni con orari e dotazioni operative

{/* Navigazione settimana */}
{format(currentWeekStart, "dd MMMM", { locale: it })} -{" "} {format(addDays(currentWeekStart, 6), "dd MMMM yyyy", { locale: it })}
{/* Loading state */} {isLoading && ( Caricamento turni... )} {/* Griglia giorni settimana */} {!isLoading && (
{weekDays.map((day) => { const dateStr = format(day, "yyyy-MM-dd"); const dayShifts = shiftsByDay[dateStr] || []; return ( {format(day, "EEEE dd/MM", { locale: it })} {dayShifts.length === 0 ? "Nessun turno" : `${dayShifts.length} turno${dayShifts.length > 1 ? "i" : ""}`} {dayShifts.length === 0 ? (
Riposo
) : ( dayShifts.map((shift) => { // Parsing sicuro orari let startTime = "N/A"; let endTime = "N/A"; if (shift.plannedStartTime) { const parsedStart = parseISO(shift.plannedStartTime); if (isValid(parsedStart)) { startTime = format(parsedStart, "HH:mm"); } } if (shift.plannedEndTime) { const parsedEnd = parseISO(shift.plannedEndTime); if (isValid(parsedEnd)) { endTime = format(parsedEnd, "HH:mm"); } } return (

{shift.site.name}

{locationLabels[shift.site.location] || shift.site.location}
{startTime} - {endTime}
{/* Dotazioni */}
{shift.armed && ( Armato )} {shift.vehicleId && ( {shift.vehiclePlate || "Automezzo"} )}
{shift.site.address}
); }) )}
); })}
)}
); }