import { useMemo, useState, useCallback, useEffect } from 'react' import { useVacayStore } from '../../store/vacayStore' import { useTranslation } from '../../i18n' import { isWeekend } from './holidays' import { tripsApi } from '../../api/client' import VacayMonthCard from './VacayMonthCard' import { Building2, MousePointer2 } from 'lucide-react' export default function VacayCalendar() { const { t } = useTranslation() const { selectedYear, selectedUserId, entries, companyHolidays, toggleEntry, toggleCompanyHoliday, plan, users, holidays } = useVacayStore() const [companyMode, setCompanyMode] = useState(false) const [tripDates, setTripDates] = useState>(new Set()) useEffect(() => { let cancelled = false ;(async () => { try { const data = await tripsApi.list() const dates = new Set() for (const trip of data.trips || []) { if (!trip.start_date || !trip.end_date) continue const start = new Date(trip.start_date + 'T00:00:00') const end = new Date(trip.end_date + 'T00:00:00') for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) { const y = d.getFullYear() if (y === selectedYear) { dates.add(`${y}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`) } } } if (!cancelled) setTripDates(dates) } catch { /* ignore */ } })() return () => { cancelled = true } }, [selectedYear]) const companyHolidaySet = useMemo(() => { const s = new Set() companyHolidays.forEach(h => s.add(h.date)) return s }, [companyHolidays]) const entryMap = useMemo(() => { const map = {} entries.forEach(e => { if (!map[e.date]) map[e.date] = [] map[e.date].push(e) }) return map }, [entries]) const blockWeekends = plan?.block_weekends !== false const weekendDays: number[] = plan?.weekend_days ? String(plan.weekend_days).split(',').map(Number) : [0, 6] const companyHolidaysEnabled = plan?.company_holidays_enabled !== false const handleCellClick = useCallback(async (dateStr) => { if (companyMode) { if (!companyHolidaysEnabled) return await toggleCompanyHoliday(dateStr) return } if (blockWeekends && isWeekend(dateStr, weekendDays)) return if (companyHolidaysEnabled && companyHolidaySet.has(dateStr)) return await toggleEntry(dateStr, selectedUserId || undefined) }, [companyMode, toggleEntry, toggleCompanyHoliday, companyHolidaySet, blockWeekends, companyHolidaysEnabled, selectedUserId]) const selectedUser = users.find(u => u.id === selectedUserId) return (
{Array.from({ length: 12 }, (_, i) => ( ))}
{/* Floating toolbar — lift above the mobile bottom nav (z-60). On desktop --bottom-nav-h is 0px. */}
{companyHolidaysEnabled && ( )}
) }