/* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/no-static-element-interactions */ import './CustomTimePicker.styles.scss'; import { Input, Popover, Tooltip, Typography } from 'antd'; import cx from 'classnames'; import { Options } from 'container/TopNav/DateTimeSelection/config'; import dayjs from 'dayjs'; import debounce from 'lodash-es/debounce'; import { CheckCircle, ChevronDown, Clock } from 'lucide-react'; import { ChangeEvent, useEffect, useState } from 'react'; import { popupContainer } from 'utils/selectPopupContainer'; const maxAllowedMinTimeInMonths = 6; interface CustomTimePickerProps { onSelect: (value: string) => void; onError: (value: boolean) => void; items: any[]; selectedValue: string; selectedTime: string; onValidCustomDateChange: ([t1, t2]: any[]) => void; } function CustomTimePicker({ onSelect, onError, items, selectedValue, selectedTime, onValidCustomDateChange, }: CustomTimePickerProps): JSX.Element { const [open, setOpen] = useState(false); const [ selectedTimePlaceholderValue, setSelectedTimePlaceholderValue, ] = useState('Select / Enter Time Range'); const [inputValue, setInputValue] = useState(''); const [inputStatus, setInputStatus] = useState<'' | 'error' | 'success'>(''); const [inputErrorMessage, setInputErrorMessage] = useState( null, ); const [isInputFocused, setIsInputFocused] = useState(false); const getSelectedTimeRangeLabel = ( selectedTime: string, selectedTimeValue: string, ): string => { if (selectedTime === 'custom') { return selectedTimeValue; } for (let index = 0; index < Options.length; index++) { if (Options[index].value === selectedTime) { return Options[index].label; } } return ''; }; useEffect(() => { const value = getSelectedTimeRangeLabel(selectedTime, selectedValue); setSelectedTimePlaceholderValue(value); }, [selectedTime, selectedValue]); const hide = (): void => { setOpen(false); }; const handleOpenChange = (newOpen: boolean): void => { setOpen(newOpen); }; const debouncedHandleInputChange = debounce((inputValue): void => { const isValidFormat = /^(\d+)([mhdw])$/.test(inputValue); if (isValidFormat) { setInputStatus('success'); onError(false); setInputErrorMessage(null); const match = inputValue.match(/^(\d+)([mhdw])$/); const value = parseInt(match[1], 10); const unit = match[2]; const currentTime = dayjs(); const maxAllowedMinTime = currentTime.subtract( maxAllowedMinTimeInMonths, 'month', ); let minTime = null; switch (unit) { case 'm': minTime = currentTime.subtract(value, 'minute'); break; case 'h': minTime = currentTime.subtract(value, 'hour'); break; case 'd': minTime = currentTime.subtract(value, 'day'); break; case 'w': minTime = currentTime.subtract(value, 'week'); break; default: break; } if (minTime && minTime < maxAllowedMinTime) { setInputStatus('error'); onError(true); setInputErrorMessage('Please enter time less than 6 months'); } else { onValidCustomDateChange([minTime, currentTime]); } } else { setInputStatus('error'); onError(true); setInputErrorMessage(null); } }, 300); const handleInputChange = (event: ChangeEvent): void => { const inputValue = event.target.value; if (inputValue.length > 0) { setOpen(false); } else { setOpen(true); } setInputValue(inputValue); // Call the debounced function with the input value debouncedHandleInputChange(inputValue); }; const content = (
{items.map(({ value, label }) => (
{ onSelect(value); setSelectedTimePlaceholderValue(label); setInputStatus(''); onError(false); setInputErrorMessage(null); setInputValue(''); hide(); }} key={value} className={cx( 'time-options-item', selectedValue === value ? 'active' : '', )} > {label}
))}
); const handleFocus = (): void => { setIsInputFocused(true); }; const handleBlur = (): void => { setIsInputFocused(false); }; return (
) : ( ) } suffix={ { setOpen(!open); }} /> } /> {inputStatus === 'error' && inputErrorMessage && ( {inputErrorMessage} )}
); } export default CustomTimePicker;