'use client' import type { DatePickerRef } from 'react-multi-date-picker' import { useRef, type ReactNode } from 'react' import DatePicker from 'react-multi-date-picker' import TimePicker from 'react-multi-date-picker/plugins/time_picker' import persian from 'react-date-object/calendars/persian' import persianFa from 'react-date-object/locales/persian_fa' import { Controller, type Control } from 'react-hook-form' import { cn } from '@/lib/cn' import { buildOutsideLabel } from '@/components/formElements/input/inputUtils' import CalendarIcon from '@/components/icons/CalendarIcon' import { convertMinutesToTime, convertTimeToMinutes } from '@/helpers' import { convertToISOFormat } from '@/helpers/dates' type Variant = 'flat' | 'bordered' | 'faded' | 'underlined' interface Props { autoFocus?: boolean className?: string control: Control description?: ReactNode disabled?: boolean finalInputWrapper: string kind: 'datePicker' | 'datePickerPro' | 'timePicker' label?: string labelIcon?: ReactNode maxDate?: string minDate: string name: string onlyYearPicker?: boolean placeholder?: string radius: 'none' | 'sm' | 'md' | 'lg' | 'full' readonly?: boolean required?: boolean size?: 'sm' | 'md' | 'lg' variant: Variant viewportWidth: number } function pickerStyles(size: Props['size'], variant: Variant, invalid = false) { const height = size === 'sm' ? '36px' : size === 'lg' ? '48px' : '40px' const error = 'var(--color-fourth)' const border = invalid ? error : '#e4e4e7' const base = { width: '100%', boxSizing: 'border-box' as const, height, borderRadius: '12px', color: 'black', padding: '0 12px' } if (variant === 'bordered') return { ...base, background: 'transparent', border: `1px solid ${border}`, borderColor: border } if (variant === 'faded') return { ...base, background: '#f4f4f5', border: `1px solid ${border}`, borderColor: border } if (variant === 'underlined') return { ...base, background: 'transparent', border: 'none', borderBottom: `1px solid ${border}`, borderRadius: '0', borderColor: border, } return { ...base, background: '#f4f4f5', border: invalid ? `1px solid ${error}` : 'none', borderColor: invalid ? error : '#f4f4f5' } } export default function DateFieldControl(props: Props) { const pickerRef = useRef(null) return ( { if (props.kind === 'timePicker') { const time = convertMinutesToTime(field.value) return (
{buildOutsideLabel(props.label, null, props.required)}
, ]} readOnly={props.readonly} style={pickerStyles(props.size, props.variant)} value={new Date().setHours(Number(time.hours), Number(time.minutes), 0, 0)} onChange={(value) => { field.onChange(convertTimeToMinutes(`${value?.hour}:${value?.minute}`)) pickerRef.current?.closeCalendar() }} /> {error && {error.message}} {props.description &&

{props.description}

}
) } const raw = field.value const valid = typeof raw === 'string' && raw.trim() !== '' && !Number.isNaN(new Date(raw).getTime()) return (
{buildOutsideLabel(props.label, props.labelIcon ?? , props.required, 0)}
(date.weekDay.index === 6 ? { className: 'highlight highlight-red' } : {})} maxDate={props.maxDate} minDate={props.minDate} onlyYearPicker={props.onlyYearPicker} placeholder={props.placeholder} readOnly={props.readonly} style={pickerStyles(props.size, props.variant, !!error)} value={valid ? new Date(raw) : null} onChange={(value) => { field.onChange(value ? convertToISOFormat(value) : '') pickerRef.current?.closeCalendar() }} />
{error &&

{error.message}

} {props.description &&

{props.description}

}
) }} /> ) }