'use client'; import { useState, useMemo } from 'react'; import { useLocale } from './LocaleProvider'; import { ts, getMonths } from '@/lib/i18n'; import { getMoonEventsForYear, type MoonEvent } from '@/lib/lunar'; const PHASE_EMOJIS: Record = { new_moon: 'πŸŒ‘', first_quarter: 'πŸŒ“', full_moon: 'πŸŒ•', last_quarter: 'πŸŒ—', }; export default function LunarCalendar() { const { locale } = useLocale(); const currentYear = new Date().getFullYear(); const [year, setYear] = useState(currentYear); const [viewMode, setViewMode] = useState<'year' | 'month'>('year'); const [selectedMonth, setSelectedMonth] = useState(new Date().getMonth()); const events = useMemo(() => getMoonEventsForYear(year), [year]); const months = getMonths(locale); const formatTime = (date: Date) => { try { return date.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit', timeZoneName: 'short' }); } catch { return date.toLocaleTimeString('en', { hour: '2-digit', minute: '2-digit' }); } }; const formatDay = (date: Date) => { try { return date.toLocaleDateString(locale, { weekday: 'short', day: 'numeric' }); } catch { return date.toLocaleDateString('en', { weekday: 'short', day: 'numeric' }); } }; const getMonthEvents = (monthIndex: number): MoonEvent[] => { return events.filter(e => e.date.getMonth() === monthIndex); }; const phaseKey = (phase: string) => { return phase as 'new_moon' | 'first_quarter' | 'full_moon' | 'last_quarter'; }; return (

{ts('calendar_title', locale)}

{ts('calendar_subtitle', locale)}

{/* Controls */}
{year}
{/* Month selector (when in month mode) */} {viewMode === 'month' && (
{months.map((m, i) => ( ))}
)} {/* Calendar grid */} {viewMode === 'year' ? (
{months.map((month, i) => { const monthEvents = getMonthEvents(i); return (

{month}

{monthEvents.length === 0 ? (

β€”

) : ( monthEvents.map((event, j) => (
{PHASE_EMOJIS[event.phase]} {ts(phaseKey(event.phase), locale)}
{formatDay(event.date)}
{formatTime(event.date)}
)) )}
); })}
) : (

{months[selectedMonth]} {year}

{getMonthEvents(selectedMonth).length === 0 ? (

β€”

) : ( getMonthEvents(selectedMonth).map((event, j) => (
{PHASE_EMOJIS[event.phase]}

{ts(phaseKey(event.phase), locale)}

{formatDay(event.date)}

{formatTime(event.date)}

)) )}
)} {/* Legend */}
{(['new_moon', 'first_quarter', 'full_moon', 'last_quarter'] as const).map((phase) => (
{PHASE_EMOJIS[phase]} {ts(phase, locale)}
))}
); }