"use client"; import { useState, useMemo } from "react"; import type { Log, LogType } from "@/types"; import { dateIST, fmtTime } from "@/lib/date-ist"; const TYPE_COLORS: Record = { feed: "bg-rose-400", sleep: "bg-blue-400", diaper: "bg-amber-400", }; function getIcon(type: LogType) { if (type === "feed") return "๐Ÿผ"; if (type === "sleep") return "๐Ÿ˜ด"; if (type === "diaper") return "๐Ÿšผ"; return "๐Ÿ“"; } interface Props { logs: Log[]; filter: LogType | "all"; } export function CalendarView({ logs, filter }: Props) { const now = new Date(); const [calMonth, setCalMonth] = useState(new Date(now.getFullYear(), now.getMonth(), 1)); const [selectedDay, setSelectedDay] = useState(now.toISOString().slice(0, 10)); const year = calMonth.getFullYear(); const month = calMonth.getMonth(); const today = now.toISOString().slice(0, 10); const isCurrentMonth = year === now.getFullYear() && month === now.getMonth(); const filteredLogs = filter === "all" ? logs : logs.filter(l => l.type === filter); const logsByDate = useMemo(() => { const map: Record = {}; filteredLogs.forEach(log => { const key = dateIST(log.loggedAt); // IST date, not UTC if (!map[key]) map[key] = []; map[key].push(log); }); return map; }, [filteredLogs]); const firstDow = new Date(year, month, 1).getDay(); const daysInMonth = new Date(year, month + 1, 0).getDate(); const cells: (number | null)[] = [ ...Array(firstDow).fill(null), ...Array.from({ length: daysInMonth }, (_, i) => i + 1), ]; const dayKey = (d: number) => `${year}-${String(month + 1).padStart(2, "0")}-${String(d).padStart(2, "0")}`; const selectedLogs = useMemo( () => selectedDay ? (logsByDate[selectedDay] || []) .slice() .sort((a, b) => new Date(b.loggedAt).getTime() - new Date(a.loggedAt).getTime()) : [], [selectedDay, logsByDate], ); return (
{/* Month nav */}
{calMonth.toLocaleDateString("en-US", { month: "long", year: "numeric" })}
{/* DOW headers */}
{["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map(d => (
{d}
))}
{/* Day cells */}
{cells.map((day, i) => { if (!day) return
; const key = dayKey(day); const dayLogs = logsByDate[key] || []; const isToday = key === today; const isSel = key === selectedDay; const types = [...new Set(dayLogs.map(l => l.type))] as LogType[]; return ( ); })}
{/* Legend */}
{(["feed", "sleep", "diaper"] as LogType[]).map(t => (
{t}
))}
{/* Selected day detail */} {selectedDay && (

{new Date(selectedDay + "T12:00:00").toLocaleDateString("en-US", { weekday: "long", month: "short", day: "numeric", })}

{selectedLogs.length} {selectedLogs.length === 1 ? "entry" : "entries"}
{selectedLogs.length === 0 ? (

No activity logged

) : (
{selectedLogs.map(log => (
{getIcon(log.type)}
{log.type}
{[ log.subType?.replace(/_/g, " "), log.amount ? `${log.amount}ml` : null, log.notes, ].filter(Boolean).join(" ยท ")}
{fmtTime(log.loggedAt)}
))}
)}
)}
); }