From d8322fa8e9add5e332bb0bb46de2c678d0520e3c Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Mon, 15 Nov 2021 11:35:08 -0600 Subject: [PATCH] Add ability to count down --- pomo/Cargo.lock | 1 + pomo/Cargo.toml | 1 + pomo/src/components.rs | 44 ++++++++++++++++++++++++++++++++++++++++++ pomo/src/interval.rs | 9 +++++++++ pomo/src/main.rs | 12 +++++++++++- 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 pomo/src/components.rs create mode 100644 pomo/src/interval.rs diff --git a/pomo/Cargo.lock b/pomo/Cargo.lock index f04d742..924efed 100644 --- a/pomo/Cargo.lock +++ b/pomo/Cargo.lock @@ -172,6 +172,7 @@ name = "pomo" version = "0.1.0" dependencies = [ "sycamore", + "wasm-bindgen", ] [[package]] diff --git a/pomo/Cargo.toml b/pomo/Cargo.toml index fc50738..2885948 100644 --- a/pomo/Cargo.toml +++ b/pomo/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] sycamore = "0.6.3" +wasm-bindgen = "0.2.78" diff --git a/pomo/src/components.rs b/pomo/src/components.rs new file mode 100644 index 0000000..9cae37a --- /dev/null +++ b/pomo/src/components.rs @@ -0,0 +1,44 @@ +use sycamore::prelude::*; +use crate::interval::{set_interval, clear_interval}; +use wasm_bindgen::closure::Closure; + +#[component(WorkingView)] +pub fn working_view() -> Template { + let time_left = Signal::new(1500); + let id = Signal::new(0i32); + + let cb = Closure::wrap(Box::new(cloned!((time_left) => move || { + let time = *time_left.get(); + time_left.set(time - 1); + })) as Box); + + id.set(set_interval(&cb, 1_000)); + + on_cleanup(cloned!((id) => move || { + clear_interval(*id.get()); + })); + + cb.forget(); + + template! { + p { + (format_time(*time_left.get())) + } + } +} + +fn format_time(seconds_left: u32) -> String { + let minutes = (seconds_left / 60) % 60; + let seconds = seconds_left % 60; + + format!("{}:{}", add_leading_zeroes(minutes), add_leading_zeroes(seconds)) +} + +fn add_leading_zeroes(num: u32) -> String { + if num < 10 { + format!("0{}", num) + } else { + // quick and easy string making + format!("{}", num) + } +} diff --git a/pomo/src/interval.rs b/pomo/src/interval.rs new file mode 100644 index 0000000..f831a2c --- /dev/null +++ b/pomo/src/interval.rs @@ -0,0 +1,9 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_name = setInterval)] + pub fn set_interval(closure: &Closure, time: u32) -> i32; + #[wasm_bindgen(js_name = clearInterval)] + pub fn clear_interval(id: i32); +} diff --git a/pomo/src/main.rs b/pomo/src/main.rs index 900022a..984bbd7 100644 --- a/pomo/src/main.rs +++ b/pomo/src/main.rs @@ -1,9 +1,19 @@ +mod components; +mod interval; + use sycamore::prelude::*; +#[allow(unused)] +enum AppMode { + Working, + Break +} + fn main() { sycamore::render(|| template! { div(class="wrapper") { - h1(style="text-align: center") { "Hello, World!" } + h1(style="text-align: center") { "Pomo" } + components::WorkingView() } }); }