"use client"; import * as React from "react"; import { cn } from "./lib/utils"; export interface MonthPickerProps { value?: number; // 0-11 defaultValue?: number; onValueChange?: (value: number) => void; year?: number; onYearChange?: (year: number) => void; className?: string; } const MONTHS = [ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER", ]; export function MonthPicker({ value: controlledValue, defaultValue = new Date().getMonth(), onValueChange, year: controlledYear, onYearChange, className, }: MonthPickerProps) { const year = controlledYear ?? new Date().getFullYear(); const month = controlledValue ?? defaultValue; const [internalMonth, setInternalMonth] = React.useState(month); const [internalYear, setInternalYear] = React.useState(year); const isControlled = controlledValue !== undefined; React.useEffect(() => { if (isControlled) { setInternalMonth(controlledValue!); setInternalYear(controlledYear ?? new Date().getFullYear()); } }, [isControlled, controlledValue, controlledYear]); const prevYear = internalYear - 1; const nextYear = internalYear + 1; const handleMonthSelect = (m: number) => { setInternalMonth(m); onValueChange?.(m); }; const handleYearChange = (y: number) => { setInternalYear(y); onYearChange?.(y); }; return (
{MONTHS[internalMonth]} / {internalYear}
{Array.from({ length: 12 }, (_, i) => i).map((monthIdx) => { const isSelected = internalMonth === monthIdx; const handleClick = () => { setInternalMonth(monthIdx); onValueChange?.(monthIdx); }; const bgClass = cn( "rounded-sm px-3 py-1.5 cursor-pointer select-none", isSelected && "bg-accent text-accent-foreground", "hover:bg-accent/20 transition-colors" ); return (
{MONTHS[monthIdx]}
); })}
); } MonthPicker.displayName = "MonthPicker";