import { useForm } from "react-hook-form"; import { render } from 'preact'; import {useEffect, useState} from "preact/hooks"; import { yupResolver } from "@hookform/resolvers/yup" import * as yup from "yup"; import {convertTime, minsToTime, timeRe, timeToMins} from "./time.js"; import 'xp.css/dist/XP.css'; import './style.css'; import {convertDuration, durationRe} from "./duration.js"; import Duration from "./Duration.jsx"; import calculateRemaining from "./calc.js"; const schema = yup.object({ startTime: yup.string().matches(timeRe, {message: '12 or 24 hr time format required'}).required(), target: yup.string().matches(durationRe, {message: 'duration in hh:mm or hrs and mins required'}).required(), break: yup.string().matches(durationRe, {message: 'duration in hh:mm or hrs and mins required'}).required(), breakTaken: yup.bool().required(), recorded: yup.string().matches(durationRe, {message: 'duration in hh:mm or hrs and mins required'}).required() }).required(); export function App() { const { handleSubmit, register, formState: { errors }, watch } = useForm({ defaultValues: { startTime: '09:00', target: '7.5h', break: '1h', recorded: '' }, resolver: yupResolver(schema) }); const [currentData, setCurrentData] = useState(null); const [remaining, setRemaining] = useState(0); const onSubmit = (data) => { setCurrentData({...data}); }; // update remaining when data changes and re-calc every minute useEffect(() => { if (!currentData) { return; } setRemaining(calculateRemaining(currentData)); const interval = setInterval(() => { setRemaining(calculateRemaining(currentData)); }, 60000); return () => clearInterval(interval); }, [currentData]); // submit form when field changes useEffect(() => { const sub = watch(handleSubmit(onSubmit)); return () => sub.unsubscribe(); }, [handleSubmit, watch]); return (
Daily Time Tracking
{errors?.startTime &&

{errors.startTime.message}

}

); } render(, document.getElementById('app'));