From 25afb0bde9b8a2c064135a534231c232a461b341 Mon Sep 17 00:00:00 2001 From: Joris Date: Sun, 16 Feb 2020 22:45:07 +0100 Subject: Set up a first version of tabata timer --- src/config.ml | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/config.ml (limited to 'src/config.ml') diff --git a/src/config.ml b/src/config.ml new file mode 100644 index 0000000..cc98c38 --- /dev/null +++ b/src/config.ml @@ -0,0 +1,96 @@ +(* Model *) + +type config = { + prepare : int; + tabatas : int; + cycles : int; + work : int; + rest : int; +} + +(* State *) + +(* let config = ref { prepare = 10; tabatas = 4; cycles = 8; work = 20; rest = 10 } *) + +let config = ref { prepare = 5; tabatas = 4; cycles = 8; work = 20; rest = 10 } + +let onStart : (unit -> unit) ref = ref (fun () -> ()) + +(* Elements *) + +let formElt = Document.querySelectorUnsafe "#g-Form" + +let prepareElt = Document.querySelectorUnsafe "#g-Form__Prepare" + +let tabatasElt = Document.querySelectorUnsafe "#g-Form__Tabatas" + +let cyclesElt = Document.querySelectorUnsafe "#g-Form__Cycles" + +let workElt = Document.querySelectorUnsafe "#g-Form__Work" + +let restElt = Document.querySelectorUnsafe "#g-Form__Rest" + +let durationElt = Document.querySelectorUnsafe "#g-Form__DurationValue" + +(* Duration *) + +let getDuration () = + let { prepare; tabatas; cycles; work; rest } = !config in + tabatas * (prepare + (cycles * (work + rest))) + +let writeDuration () = + let duration = getDuration () in + Element.setInnerText durationElt (Duration.prettyPrint duration) + +(* Write to DOM *) + +let writeToDom () = + let () = Element.setValue prepareElt (Js.Int.toString !config.prepare) in + let () = Element.setValue tabatasElt (Js.Int.toString !config.tabatas) in + let () = Element.setValue cyclesElt (Js.Int.toString !config.cycles) in + let () = Element.setValue workElt (Js.Int.toString !config.work) in + let () = Element.setValue restElt (Js.Int.toString !config.rest) in + writeDuration () + +(* Update from DOM *) + +let listenTo inputElt update = + Element.addEventListener inputElt "input" (fun e -> + match + EventTarget.value (Event.target e) |> Option.flatMap Belt.Int.fromString + with + | Some n -> + let () = config := update !config n in + writeDuration () + | None -> ()) + +let listenToChanges () = + let () = listenTo prepareElt (fun config n -> { config with prepare = n }) in + let () = listenTo tabatasElt (fun config n -> { config with tabatas = n }) in + let () = listenTo cyclesElt (fun config n -> { config with cycles = n }) in + let () = listenTo workElt (fun config n -> { config with work = n }) in + listenTo restElt (fun config n -> { config with rest = n }) + +(* Setup *) + +let setup onTimerStart = + let () = onStart := onTimerStart in + let () = writeToDom () in + listenToChanges () + +(* Start *) + +let startTimer () = + let () = Element.setStyle formElt "display: none" in + !onStart () + +(* Hide / show *) + +let show () = Element.setStyle formElt "display: flex" + +let hide () = Element.setStyle formElt "display: none" + +let () = + Element.addEventListener formElt "submit" (fun e -> + let () = Event.preventDefault e in + !onStart ()) -- cgit v1.2.3