// components/ui/date-picker.tsx
import * as React from 'react';
import { Pressable } from 'react-native';
import { cva } from 'class-variance-authority';
import { cn } from '@/lib/utils';
import { Text } from './text';
import { Dialog, DialogContent } from './dialog';
import { Calendar } from './calendar';
import { CalendarDays } from 'lucide-react-native';
import { useThemeColors } from '@/hooks/useThemeColors';
import dayjs from 'dayjs';
type DatePickerVariant = 'date' | 'month' | 'year';
// Date Picker Trigger Variants
const datePickerTriggerVariants = cva(
'flex-row items-center justify-between rounded-lg border',
{
variants: {
variant: {
default: 'border-input bg-background',
outline: 'border-input bg-transparent',
filled: 'border-transparent bg-muted',
},
size: {
sm: 'px-3 py-2',
md: 'px-4 py-3',
lg: 'px-5 py-4',
},
},
defaultVariants: {
variant: 'default',
size: 'md',
},
}
);
type TriggerVariant = 'default' | 'outline' | 'filled';
type TriggerSize = 'sm' | 'md' | 'lg';
interface DatePickerProps {
value?: Date;
onValueChange?: (date: Date) => void;
children: React.ReactNode;
variant?: DatePickerVariant;
minDate?: Date;
maxDate?: Date;
triggerVariant?: TriggerVariant;
triggerSize?: TriggerSize;
}
interface DatePickerTriggerProps {
className?: string;
children: React.ReactNode;
}
interface DatePickerContentProps {
className?: string;
}
const DatePickerContext = React.createContext<{
value?: Date;
onValueChange?: (date: Date) => void;
open: boolean;
setOpen: (open: boolean) => void;
variant: DatePickerVariant;
minDate?: Date;
maxDate?: Date;
triggerVariant: TriggerVariant;
triggerSize: TriggerSize;
} | null>(null);
function useDatePicker() {
const context = React.useContext(DatePickerContext);
if (!context) {
throw new Error('DatePicker components must be used within DatePicker');
}
return context;
}
export function DatePicker({
value,
onValueChange,
children,
variant = 'date',
minDate,
maxDate,
triggerVariant = 'default',
triggerSize = 'md',
}: DatePickerProps) {
const [open, setOpen] = React.useState(false);
return (
);
}
export function DatePickerTrigger({ className, children }: DatePickerTriggerProps) {
const { setOpen, triggerVariant, triggerSize } = useDatePicker();
return (
setOpen(true)}
className={cn(
datePickerTriggerVariants({
variant: triggerVariant,
size: triggerSize
}),
className
)}
>
{children}
);
}
export function DatePickerContent({ className }: DatePickerContentProps) {
const { value, onValueChange, setOpen, variant, minDate, maxDate } = useDatePicker();
const handleValueChange = (date: Date) => {
onValueChange?.(date);
setOpen(false);
};
return (
);
}
export function DatePickerValue({
placeholder = 'Select date',
format = 'MMM DD, YYYY',
className,
showIcon = true,
}: {
placeholder?: string;
format?: string;
className?: string;
showIcon?: boolean;
}) {
const { value } = useDatePicker();
const { colors } = useThemeColors();
const hasValue = !!value;
return (
<>
{value ? dayjs(value).format(format) : placeholder}
{showIcon && (
)}
>
);
}