import { h } from 'preact'; import { useState } from 'preact/hooks'; const CalendarTimePicker = ({ dateRange, onChange }) => { const [selected, setSelected] = useState([0]); const timestampHour = (timestamp) => { if (!timestamp) return undefined; return new Date(timestamp).getHours(); }; const handleTime = (number) => { const currentHour = new Date(); currentHour.setHours(number, 0, 0, 0); // Get current time if dateRange.after or dateRange.before are not set const afterTime = dateRange.after ? dateRange.after : currentHour.getTime(); const beforetime = afterTime + 1; // Update dateRange object with new "before" time and set selected to new number if (selected.length === 1 && number > Math.max(...selected)) { onChange({ after: afterTime / 1000, before: new Date(afterTime).setHours(number + 1) / 1000, }); return setSelected([number]); } // Updating the start of the selected range if (selected.length > 0 && number < selected[0]) { onChange({ after: new Date(afterTime).setHours(number) / 1000, before: dateRange.before / 1000, }); return setSelected([number]); } // Updating the end of the selected range if (selected.length === 2) { onChange({ after: dateRange.after ? dateRange.after / 1000 : 0, before: new Date(beforetime) / 1000, }); return setSelected([number]); } // Update dateRange object with both "after" and "before" times if (selected.length === 1) { onChange({ after: new Date(afterTime).setHours(number) / 1000, before: new Date(afterTime).setHours(number + 1) / 1000, }); return setSelected([Math.min(selected[0], number), Math.max(selected[0], number)]); } setSelected([number]); }; const isSelected = (after, before, idx) => { if (timestampHour(before) === 0 && timestampHour(after) === 0) return false; return timestampHour(after) <= idx && timestampHour(before - 1) >= idx; }; return (

TimePicker

{Array.from({ length: 24 }, (_, idx) => (
handleTime(idx)} > {idx}:00
))}
); }; export default CalendarTimePicker;