'use client'; /* IMPORT */ import { format } from 'date-fns'; import { Button, type ButtonProps } from '@/components/ui/button'; import { Calendar } from '@/components/ui/calendar'; import { CalendarIcon, X } from 'lucide-react'; import { cn } from '@/lib/utils'; import { parseAsString, useQueryStates } from 'nuqs'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { type ComponentPropsWithoutRef, type MouseEvent, useMemo } from 'react'; import { type DateRange } from 'react-day-picker'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ interface RisksDateRangePickerProps extends ComponentPropsWithoutRef { defaultDateRange?: DateRange; placeholder?: string; triggerVariant?: Exclude; triggerSize?: Exclude; triggerClassName?: string; shallow?: boolean; showClearButton?: boolean; } // ---------------------------------------------------------------------------------------------------- /* RISKS DATE RANGE PICKER COMPONENT */ function RisksDateRangePicker(props: RisksDateRangePickerProps) { const { defaultDateRange, placeholder = '날짜를 선택하십시오.', triggerVariant = 'outline', triggerSize = 'default', triggerClassName, showClearButton = false, shallow = true, className, ...otherProps } = props; const [dateParams, setDateParams] = useQueryStates( { from: parseAsString.withDefault( defaultDateRange?.from?.toISOString() ?? '' ), to: parseAsString.withDefault(defaultDateRange?.to?.toISOString() ?? ''), }, { clearOnDefault: true, shallow, } ) const date = useMemo(() => { function parseDate(dateString: string | null) { if (!dateString) { return undefined; } const parsedDate = new Date(dateString); return isNaN(parsedDate.getTime()) ? undefined : parsedDate; } return { from: parseDate(dateParams.from) ?? defaultDateRange?.from, to: parseDate(dateParams.to) ?? defaultDateRange?.to, }; }, [dateParams, defaultDateRange]); const clearDates = (e: MouseEvent) => { e.stopPropagation(); void setDateParams({ from: "", to: "", }); }; const hasSelectedDate = Boolean(date?.from || date?.to); return (
)} { const from = newDateRange?.from; const to = newDateRange?.to; if (from && to && from > to) { void setDateParams({ from: to.toISOString(), to: from.toISOString(), }); } else { void setDateParams({ from: from?.toISOString() ?? '', to: to?.toISOString() ?? '', }); } }} numberOfMonths={2} />
) } // ---------------------------------------------------------------------------------------------------- export default RisksDateRangePicker;