import { useRef, useState } from 'react'; import { Nullable } from 'twenty-ui'; import { InternalDatePicker, MONTH_AND_YEAR_DROPDOWN_ID, 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 { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; 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; }; export const DateInput = ({ value, onEnter, onEscape, onClickOutside, clearable, onChange, isDateTimeInput, onClear, onSubmit, hideHeaderInput, }: 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 handleMouseSelect = (newDate: Date | null) => { setInternalValue(newDate); onSubmit?.(newDate); }; const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID); const { closeDropdown: closeDropdownMonthSelect } = useDropdown( MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, ); const { closeDropdown: closeDropdownYearSelect } = useDropdown( MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID, ); useListenClickOutside({ refs: [wrapperRef], listenerId: 'DateInput', callback: (event) => { event.stopImmediatePropagation(); closeDropdownYearSelect(); closeDropdownMonthSelect(); closeDropdown(); onClickOutside(event, internalValue); }, }); return (
); };