'use client'; import React, { useState, useCallback, useMemo } from 'react'; import { View, Pressable, TextInput } from 'react-native'; import { Calendar } from '../calendar'; import { PrimitiveIcon } from '@gluestack-ui/core/icon/creator'; type DateTimePickerMode = 'date' | 'time' | 'datetime'; interface DateTimePickerProps { value?: Date; onChange?: (date: Date | undefined) => void; mode?: DateTimePickerMode; minimumDate?: Date; maximumDate?: Date; disabled?: boolean; placeholder?: string; className?: string; style?: any; } const DateTimePicker = React.forwardRef< React.ComponentRef, DateTimePickerProps >(function DateTimePicker( { value, onChange, mode = 'datetime', minimumDate, maximumDate, disabled, placeholder = 'Select date/time', className, style, }, ref ) { const [isOpen, setIsOpen] = useState(false); const [tempDate, setTempDate] = useState(value); const [tempTime, setTempTime] = useState( value ? formatTimeForInput(value) : '' ); const handleDateSelect = useCallback( (date: Date | Date[] | { from: Date; to: Date }) => { if (date instanceof Date) { setTempDate(date); if (mode === 'date') { onChange?.(date); setIsOpen(false); } } }, [mode, onChange] ); const handleTimeChange = useCallback( (e: React.ChangeEvent) => { setTempTime(e.target.value); }, [] ); const handleConfirm = useCallback(() => { if (mode === 'time' && tempTime) { const [hours, minutes] = tempTime.split(':').map(Number); const newDate = new Date(); newDate.setHours(hours, minutes, 0, 0); onChange?.(newDate); } else if (tempDate) { if (mode === 'datetime' && tempTime) { const [hours, minutes] = tempTime.split(':').map(Number); const combinedDate = new Date(tempDate); combinedDate.setHours(hours, minutes, 0, 0); onChange?.(combinedDate); } else { onChange?.(tempDate); } } setIsOpen(false); }, [mode, tempDate, tempTime, onChange]); const handleCancel = useCallback(() => { setTempDate(value); setTempTime(value ? formatTimeForInput(value) : ''); setIsOpen(false); }, [value]); const displayValue = useMemo(() => { if (!value) return ''; if (mode === 'time') return formatTimeForInput(value); if (mode === 'date') return formatDate(value); return `${formatDate(value)} ${formatTimeForInput(value)}`; }, [value, mode]); return ( {/* Trigger Input */} !disabled && setIsOpen(true)} className="w-full" > {/* Modal/Dropdown */} {isOpen && ( {/* Date Picker */} {(mode === 'date' || mode === 'datetime') && ( )} {/* Time Picker */} {(mode === 'time' || mode === 'datetime') && ( )} {/* Actions */} Cancel Confirm )} ); }); // Helper functions function formatDate(date: Date): string { return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', }); } function formatTimeForInput(date: Date): string { const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); return `${hours}:${minutes}`; } // Export additional components (simplified versions) const DateTimePickerTrigger = React.forwardRef< React.ComponentRef, React.ComponentProps >(function DateTimePickerTrigger({ children, ...props }, ref) { return ( {children} ); }); const DateTimePickerInput = React.forwardRef< React.ComponentRef, React.ComponentProps >(function DateTimePickerInput(props, ref) { return ; }); const DateTimePickerIcon = React.forwardRef< React.ComponentRef, React.ComponentProps >(function DateTimePickerIcon(props, ref) { return ; }); export { DateTimePicker, DateTimePickerTrigger, DateTimePickerInput, DateTimePickerIcon, }; export type { DateTimePickerProps, DateTimePickerMode };