import { useCallback, useEffect, useRef, useState } from "preact/hooks"; import { DateTime } from "luxon"; import { useFlash } from "../App/FlashContext"; import { useTimezone } from "../App/TimezoneProvider"; type TimeUpdate = { year?: number | null; month?: number; day?: number; hour?: number; minute?: number; second?: number; }; export const TimeInput = ({ defaultValue, onInput }) => { const ref = useRef(null); const [timezone] = useTimezone(); const [time, setTime] = useState( defaultValue ? DateTime.fromISO(defaultValue).setZone(timezone) : null, ); const updateTime = useCallback( (upd: TimeUpdate) => { if (upd === null) { setTime(null); } let newTime = time; if (newTime === null) { newTime = DateTime.now().setZone(timezone); } setTime(newTime.set(upd)); }, [time, timezone], ); useEffect(() => { onInput(time?.toFormat("yyyy-LL-dd'T'HH:mm:ss")); }, [time]); const flash = useFlash(); return ( <>
{ ev.preventDefault(); const pasteValue = ev.clipboardData.getData("text/plain"); let dt = DateTime.fromISO(pasteValue); if (dt.isValid) { setTime(dt); return; } dt = DateTime.fromSQL(pasteValue); if (dt.isValid) { setTime(dt); return; } flash({ message: "Couldn't parse your clipboard data as a valid date-time", type: "error", }); }} >
- - : :
{ ev.currentTarget.value === "" ? setTime(null) : setTime(DateTime.fromISO(ev.currentTarget.value)); }} > ); };