From 89fbee7dc0fb891a1a3a43877a38efd43ba24461 Mon Sep 17 00:00:00 2001 From: Bernt Christian Egeland Date: Tue, 17 Jan 2023 00:04:52 +0100 Subject: [PATCH] new timePicker component --- web/src/components/TimePicker.jsx | 93 ++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/web/src/components/TimePicker.jsx b/web/src/components/TimePicker.jsx index 4b95cc62b..38ce2b23f 100644 --- a/web/src/components/TimePicker.jsx +++ b/web/src/components/TimePicker.jsx @@ -1,21 +1,72 @@ import { h } from 'preact'; import { useState } from 'preact/hooks'; -// import './CalendarTimePicker.css'; -const CalendarTimePicker = () => { - const [timeSelector, setTimeSelector] = useState({ After: 0, Before: 0 }); +const CalendarTimePicker = ({ dateRange, onChange }) => { + const [selected, setSelected] = useState([0]); - const handleTime = (name, idx) => { - setTimeSelector({ - ...timeSelector, - [name]: idx, - }); + const timestampHour = (timestamp) => { + if (!timestamp) return undefined; + return new Date(timestamp).getHours(); }; - const renderTimePicker = ({ title, selected }) => { - return ( - - + 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(title, idx)} + className={`w-full font-light border border-transparent hover:border-gray-300 rounded-sm text-center text-lg + ${isSelected(dateRange.after, dateRange.before, idx) ? 'bg-blue-500' : ''}`} + onClick={() => handleTime(idx)} > - {idx}:00 + {idx}:00
))}
- - ); - }; - - return ( -
-
-
{renderTimePicker({ title: 'Before', selected: timeSelector.Before })}
-
{renderTimePicker({ title: 'After', selected: timeSelector.After })}
);