(null);
const prev_focus = usePrevious(focus);
const onClickOutside = React.useCallback(
e => {
if (!mainRef.current?.contains(e.target) && is_datepicker_visible) {
setIsDatepickerVisible(false);
if (disableFocus) {
disableFocus();
}
}
},
[is_datepicker_visible, disableFocus]
);
React.useEffect(() => {
document.addEventListener('click', onClickOutside, true);
return () => {
document.removeEventListener('click', onClickOutside, true);
};
}, [onClickOutside]);
React.useEffect(() => {
if (focus && focus !== prev_focus && is_datepicker_visible !== focus) {
setIsDatepickerVisible(!is_datepicker_visible);
}
}, [focus, prev_focus, is_datepicker_visible]);
const handleVisibility = () => {
setIsDatepickerVisible(!is_datepicker_visible);
};
const onSelectCalendar = (selected_date: string, _is_datepicker_visible = false) => {
let _selected_date = selected_date;
if (!moment.utc(_selected_date).isValid) {
_selected_date = '';
}
if (mode === 'duration') {
updateDatePickerValue(daysFromTodayTo(_selected_date), 'duration');
} else {
updateDatePickerValue(_selected_date);
}
setIsDatepickerVisible(_is_datepicker_visible);
};
// TODO: handle cases where user inputs date before min_date and date after max_date
const updateDatePickerValue = (_value: string, _mode?: string) => {
setValue(_value, updateStore);
// update Calendar
const new_date = _mode === 'duration' ? moment.utc().add(_value, 'days').format(date_format) : _value;
if (calendarRef.current && (moment.utc(new_date, date_format).isValid() || !new_date)) {
if (!new_date) {
const current_date = moment.utc(start_date).format(date_format);
calendarRef.current.setCalendarDate(current_date);
calendarRef.current.setSelectedDate(current_date);
} else {
calendarRef.current.setCalendarDate(formatDate(new_date));
calendarRef.current.setSelectedDate(formatDate(new_date));
}
}
};
// update MobX store
const updateStore = (_value: string) => {
if (typeof onChange === 'function') {
onChange(_value);
}
};
if (is_nativepicker) {
return (
{
// fix for ios issue: clear button doesn't work
// https://github.com/facebook/react/issues/8938
const target = e.nativeEvent.target;
function iosClearDefault() {
(target as HTMLInputElement).defaultValue = '';
}
window.setTimeout(iosClearDefault, 0);
onSelectCalendar(e.target.value);
}}
/>
);
}
return (
);
});
export default DatePicker;