import { useRef, useState } from 'react'; import styled from '@emotion/styled'; 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 { useListenClickOutsideV2 } from '@/ui/utilities/pointer-event/hooks/useListenClickOutsideV2'; const StyledCalendarContainer = styled.div` background: ${({ theme }) => theme.background.secondary}; border: 1px solid ${({ theme }) => theme.border.color.light}; border-radius: ${({ theme }) => theme.border.radius.md}; box-shadow: ${({ theme }) => theme.boxShadow.strong}; top: 0; position: absolute; `; 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; }; export const DateInput = ({ value, onEnter, onEscape, onClickOutside, clearable, onChange, isDateTimeInput, onClear, }: 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 { 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, ); useListenClickOutsideV2({ refs: [wrapperRef], listenerId: 'DateInput', callback: (event) => { event.stopImmediatePropagation(); closeDropdownYearSelect(); closeDropdownMonthSelect(); closeDropdown(); onClickOutside(event, internalValue); }, }); return (
{ onEnter(newDate); }} clearable={clearable ? clearable : false} isDateTimeInput={isDateTimeInput} onEnter={onEnter} onEscape={onEscape} onClear={handleClear} />
); };