import { useRef, useState } from 'react'; import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { DateTimePicker, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID, } from '@/ui/input/components/internal/date/components/InternalDatePicker'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { Nullable } from 'twenty-ui/utilities'; export type DateInputProps = { value: Nullable; onEnter: (newDate: Nullable) => void; onEscape: (newDate: Nullable) => void; onClickOutside: ( event: MouseEvent | TouchEvent, newDate: Nullable, ) => void; clearable?: boolean; onChange?: (newDate: Nullable) => void; isDateTimeInput?: boolean; onClear?: () => void; onSubmit?: (newDate: Nullable) => void; hideHeaderInput?: boolean; hotkeyScope: string; }; export const DateInput = ({ value, onEnter, onEscape, onClickOutside, clearable, onChange, isDateTimeInput, onClear, onSubmit, hideHeaderInput, hotkeyScope, }: DateInputProps) => { const [internalValue, setInternalValue] = useState(value); const wrapperRef = useRef(null); const handleChange = (newDate: Date | null) => { setInternalValue(newDate); onChange?.(newDate); }; const handleClear = () => { setInternalValue(null); onClear?.(); }; const handleClose = (newDate: Date | null) => { setInternalValue(newDate); onSubmit?.(newDate); }; const { closeDropdown: closeDropdownMonthSelect } = useDropdown( MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, ); const { closeDropdown: closeDropdownYearSelect } = useDropdown( MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID, ); const handleEnter = () => { closeDropdownYearSelect(); closeDropdownMonthSelect(); onEnter(internalValue); }; const handleEscape = () => { closeDropdownYearSelect(); closeDropdownMonthSelect(); onEscape(internalValue); }; const handleClickOutside = (event: MouseEvent | TouchEvent) => { event.stopImmediatePropagation(); closeDropdownYearSelect(); closeDropdownMonthSelect(); onEscape(internalValue); onClickOutside(event, internalValue); }; useRegisterInputEvents({ inputRef: wrapperRef, inputValue: internalValue, onEnter: handleEnter, onEscape: handleEscape, onClickOutside: handleClickOutside, hotkeyScope: hotkeyScope, }); return (
); };