import clsx from "clsx"; import { forwardRef, Fragment, ReactNode, Ref, RefObject, useEffect, useImperativeHandle, useRef, useState } from "react"; import EntityIcon from "~/components/layouts/icons/EntityIcon"; import HintTooltip from "~/components/ui/tooltips/HintTooltip"; import { Calendar as CalendarIcon } from "~/components/ui/icons/vendor"; import { Popover, PopoverContent, PopoverTrigger } from "../popover"; import { Button } from "../button"; import { Calendar } from "../calendar"; import { useTranslation } from "react-i18next"; import { Input } from "../input"; import { cn } from "~/lib/utils"; import { useLocaleFormatters } from "~/locale/format"; export interface RefInputDate { input: RefObject; } interface Props { display?: "default" | "calendar"; name?: string; title: string; defaultValue?: Date | undefined; value?: Date; onChange?: (date: Date) => void; className?: string; help?: string; disabled?: boolean; readOnly?: boolean; required?: boolean; hint?: ReactNode; icon?: string; darkMode?: boolean; autoFocus?: boolean; classNameInput?: string; } const InputDate = ( { display = "default", name, title, value, defaultValue, onChange, className, help, disabled = false, readOnly = false, required = false, hint, icon, darkMode, autoFocus, classNameInput, }: Props, ref: Ref ) => { const { t } = useTranslation(); const formatters = useLocaleFormatters(); useImperativeHandle(ref, () => ({ input })); const input = useRef(null); const [actualValue, setActualValue] = useState(undefined); useEffect(() => { if (defaultValue) { // setActualValue(defaultValue?.toISOString().split("T")[0]); setActualValue(defaultValue); } }, [defaultValue]); useEffect(() => { if (value) { const date = new Date(value); if (date) { // setActualValue(date.toISOString().split("T")[0]); setActualValue(date); } } }, [value]); useEffect(() => { if (defaultValue) { const date = new Date(defaultValue); if (date) { // setActualValue(date.toISOString().split("T")[0]); setActualValue(date); } } }, [defaultValue]); useEffect(() => { if (onChange && actualValue) { let isDifferent = false; try { if (value && actualValue) { isDifferent = value.toISOString() !== actualValue.toISOString(); } } catch { isDifferent = true; } if (isDifferent) { const date = new Date(actualValue); if (date) { onChange(date); } } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [actualValue]); return (
{icon && (
)} {display === "default" && ( { const date = new Date(e.target.value); if (date) { setActualValue(date); } }} disabled={disabled || readOnly} readOnly={readOnly} autoFocus={autoFocus} className={cn((disabled || readOnly) && "bg-secondary/90 cursor-not-allowed", icon && "pl-10", classNameInput)} /> )} {display === "calendar" && ( {name && ( )} setActualValue(date)} /> )}
); }; export default forwardRef(InputDate);