import type { DateFormat, DateRange } from '@smallwebco/tinypivot-core' import { formatDate, getDatePlaceholder, parseDateInput } from '@smallwebco/tinypivot-core' import React, { useCallback, useEffect, useMemo, useState } from 'react' interface DateRangeFilterProps { dataMin: string // ISO date string dataMax: string // ISO date string currentRange: DateRange | null onChange: (range: DateRange | null) => void dateFormat?: DateFormat } export function DateRangeFilter({ dataMin, dataMax, currentRange, onChange, dateFormat = 'iso', }: DateRangeFilterProps) { const [localMinText, setLocalMinText] = useState('') const [localMaxText, setLocalMaxText] = useState('') const [minError, setMinError] = useState(false) const [maxError, setMaxError] = useState(false) const formattedMin = useMemo(() => formatDate(dataMin, dateFormat), [dataMin, dateFormat]) const formattedMax = useMemo(() => formatDate(dataMax, dateFormat), [dataMax, dateFormat]) const isFilterActive = localMinText !== '' || localMaxText !== '' const emitChange = useCallback(() => { const min = localMinText ? parseDateInput(localMinText, dateFormat) : null const max = localMaxText ? parseDateInput(localMaxText, dateFormat) : null if (min === null && max === null) { onChange(null) } else { onChange({ min, max }) } }, [localMinText, localMaxText, dateFormat, onChange]) const handleMinBlur = useCallback(() => { if (localMinText === '') { setMinError(false) emitChange() return } const parsed = parseDateInput(localMinText, dateFormat) setMinError(parsed === null) if (parsed !== null) emitChange() }, [localMinText, dateFormat, emitChange]) const handleMaxBlur = useCallback(() => { if (localMaxText === '') { setMaxError(false) emitChange() return } const parsed = parseDateInput(localMaxText, dateFormat) setMaxError(parsed === null) if (parsed !== null) emitChange() }, [localMaxText, dateFormat, emitChange]) const clearFilter = useCallback(() => { setLocalMinText('') setLocalMaxText('') setMinError(false) setMaxError(false) onChange(null) }, [onChange]) const setFullRange = useCallback(() => { setLocalMinText(formatDate(dataMin, dateFormat)) setLocalMaxText(formatDate(dataMax, dateFormat)) setMinError(false) setMaxError(false) onChange({ min: dataMin, max: dataMax }) }, [dataMin, dataMax, dateFormat, onChange]) // Sync with props useEffect(() => { if (currentRange?.min) { setLocalMinText(formatDate(currentRange.min, dateFormat)) } else { setLocalMinText('') } if (currentRange?.max) { setLocalMaxText(formatDate(currentRange.max, dateFormat)) } else { setLocalMaxText('') } setMinError(false) setMaxError(false) }, [currentRange, dateFormat]) const handleKeyDown = useCallback((e: React.KeyboardEvent, handler: () => void) => { if (e.key === 'Enter') handler() }, []) return (