"use client"; import { useState } from "react"; import type { DateRange } from "react-day-picker"; import { Kbd } from "@/components/common/kbd"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { formatDateForInput } from "@/lib/formatter"; import { endOfDay } from "date-fns"; type DatePickerProps = { range: DateRange; onSelect: (range: DateRange) => void; presets: { id: string; label: string; values: DateRange; shortcut: string }[]; }; export function DatePicker({ range, onSelect, presets }: DatePickerProps) { const [today] = useState(new Date()); const disableBefore = presets[presets.length - 1]?.values?.from; return (
Presets
{presets.map((preset) => { const isSelected = range.from?.getTime() === preset.values.from?.getTime() && range.to?.getTime() === preset.values.to?.getTime(); return ( ); })}
{ if (newDate) { onSelect({ ...newDate, to: newDate.to ? endOfDay(newDate.to) : undefined, }); } }} className="p-2" disabled={[ { after: today }, // Dates before today { before: disableBefore ?? today }, // Dates before last action ]} />

Custom Range

{ const newDate = new Date(e.target.value); if (!Number.isNaN(newDate.getTime())) { onSelect({ ...range, from: newDate }); } }} disabled={!range.from} />
{ const newDate = new Date(e.target.value); if (!Number.isNaN(newDate.getTime())) { onSelect({ ...range, to: newDate }); } }} disabled={!range.to} />
); }