import React, { useState } from "react"; import { useDebouncedCallback } from "use-debounce"; import type { RangeValue } from "@/components/ui/range-slider/range-slider"; import { RangeSlider } from "@/components/ui/range-slider/range-slider"; const TIME_SEPARATOR = ":"; export interface TimeRangeValue { start: string; // This is a string time value with TIME_SEPARATOR = : (e.g. 01:00) end: string; // This is a string time value TIME_SEPARATOR = : (e.g. 20:00) } interface TimeRangeProps { /** * Step time in minutes. Default is 15 minutes. */ stepTime: number; initialValue?: TimeRangeValue; onChange: (value: TimeRangeValue) => void; } // This function generates calculated values for the range slider as string time value. function generateTimeValues(stepTime: number, val: number): string { const hours = Math.floor(val / (60 / stepTime)); const minutes = (val % (60 / stepTime)) * stepTime; const time = `${hours.toString().padStart(2, "0")}${TIME_SEPARATOR}${minutes .toString() .padStart(2, "0")}`; return time; } // refactor this function according to generateTimeValues reverse function generateInitialValue(stepTime: number, value: string): number { const [hours, minutes] = value.split(TIME_SEPARATOR); const time = Number(hours || "00") * (60 / stepTime) + Number(minutes || "00") / stepTime; return time; } const TimeText = ({ time }: { time: string }) => ( {time} ); function TimeRange({ stepTime = 15, initialValue, onChange }: TimeRangeProps) { const debounceChange = useDebouncedCallback(onChange, 1000); const endValue = (60 / stepTime) * 24; const [val, setVal] = useState({ start: initialValue?.start ? generateInitialValue(stepTime, initialValue.start) : 0, end: initialValue?.end ? generateInitialValue(stepTime, initialValue.end) : endValue, }); const handleChange = (value: RangeValue) => { setVal(value as unknown as RangeValue); debounceChange({ start: generateTimeValues(stepTime, value.start), end: generateTimeValues(stepTime, value.end), }); }; return ( handleChange(arg as unknown as RangeValue)} /> ); } export default TimeRange;