"use client"; import ShiftCard from "@/components/molecules/cards/ShiftCard"; import { DEPARTMENTS } from "@/lib/constants"; import { useShift } from "@/lib/shift-context"; import { useMemo, useState } from "react"; import type { MobileShiftViewProps } from "./ShiftSchedule.types"; const DAY_HEADERS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; function formatDateISO(d: Date): string { const y = d.getFullYear(); const m = (d.getMonth() + 1).toString().padStart(2, "0"); const day = d.getDate().toString().padStart(2, "0"); return `${y}-${m}-${day}`; } function isToday(d: Date): boolean { const today = new Date(2026, 3, 10); return ( d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear() ); } const MONTH_NAMES = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]; export default function MobileShiftView({ onShiftClick, }: MobileShiftViewProps) { const { currentDate, shifts, goToNextMonth, goToPrevMonth } = useShift(); const [selectedDate, setSelectedDate] = useState(new Date(2026, 3, 10)); const calendarDays = useMemo(() => { const year = currentDate.getFullYear(); const month = currentDate.getMonth(); const firstDay = new Date(year, month, 1); const lastDay = new Date(year, month + 1, 0); let startOffset = firstDay.getDay() - 1; if (startOffset < 0) startOffset = 6; const days: (Date | null)[] = []; for (let i = 0; i < startOffset; i++) days.push(null); for (let d = 1; d <= lastDay.getDate(); d++) { days.push(new Date(year, month, d)); } while (days.length % 7 !== 0) days.push(null); return days; }, [currentDate]); const getDotColors = (date: Date): string[] => { const dayShifts = shifts.filter((s) => s.date.getDate() === date.getDate()); const dots: string[] = []; // if (dayShifts.some((s) => s.status === "available")) // dots.push("bg-amber-400"); // if (dayShifts.some((s) => s.status === "registered")) // dots.push("bg-green-500"); // if (dayShifts.some((s) => s.status === "approved_leave")) // dots.push("bg-purple-400"); // if (dayShifts.some((s) => s.status === "absent")) dots.push("bg-red-400"); return dots; }; const selectedShifts = useMemo(() => { return shifts.filter((s) => s.date.getDate() === selectedDate.getDate()); }, [shifts, selectedDate]); const selectedDateObj = new Date(selectedDate + "T00:00:00"); const dayOfWeek = DAY_HEADERS[(selectedDateObj.getDay() + 6) % 7]; return (
{/* Compact month calendar */}
{/* Month navigation */}

{MONTH_NAMES[currentDate.getMonth()]} {currentDate.getFullYear()}

{/* Day headers */}
{DAY_HEADERS.map((day) => (
{day}
))}
{/* Calendar grid */}
{calendarDays.map((date, i) => { if (!date) { return
; } const today = isToday(date); const selected = date === selectedDate; const dots = getDotColors(date); return ( ); })}
{/* Legend */}
Available
Registered
On leave
Absent
{/* Selected day shifts */}

{dayOfWeek}, {selectedDateObj.getDate()}/ {selectedDateObj.getMonth() + 1}/{selectedDateObj.getFullYear()} ({selectedShifts.length} shift {selectedShifts.length !== 1 ? "s" : ""})

{selectedShifts.length === 0 ? (

No shifts for this day

) : (
{DEPARTMENTS.map((dept) => { const deptShifts = selectedShifts; if (deptShifts.length === 0) return null; return (
{dept.name}
{deptShifts.map((shift) => ( ))}
); })}
)}
); }