use super::*;
pub(crate) const TIMING_DEBOUNCE_MS: u32 = 300;
pub(crate) const TIMING_THROTTLE_MS: u32 = 250;
pub(crate) const TIMING_TICK_MS: i32 = 50;
pub(crate) const TIMING_INPUT_PLACEHOLDER: &str = "Type here…";
pub(crate) const TIMING_DEBOUNCE_INPUT_ID: &str = "timing-debounce-input";
pub(crate) const TIMING_THROTTLE_INPUT_ID: &str = "timing-throttle-input";
pub(crate) fn timing_now_ms() -> u64 {
let Some(window_value): Option<Window> = window() else {
return 0;
};
let Some(performance): Option<Performance> = window_value.performance() else {
return 0;
};
performance.now() as u64
}
pub(crate) fn timing_debounce_on_input(
live: Signal<String>,
debounced: DebouncedValue<String>,
current: Signal<String>,
previous: Previous<String>,
) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |event: Event| {
if let Some(value) = timing_read_input(&event) {
live.set(value.clone());
debounced.set(value.clone(), timing_now_ms());
let snapshot: Option<String> = previous_step(previous, value.clone());
let next_current: String = match snapshot {
Some(prev) => format!("{prev} → {value}"),
None => value,
};
current.set(next_current);
}
}))
}
pub(crate) fn timing_throttle_on_input(
live: Signal<String>,
throttled: ThrottledValue<String>,
current: Signal<String>,
previous: Previous<String>,
) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |event: Event| {
if let Some(value) = timing_read_input(&event) {
live.set(value.clone());
throttled.set(value.clone(), timing_now_ms());
let snapshot: Option<String> = previous_step(previous, value.clone());
let next_current: String = match snapshot {
Some(prev) => format!("{prev} → {value}"),
None => value,
};
current.set(next_current);
}
}))
}
fn timing_read_input(event: &Event) -> Option<String> {
let target: JsValue = event.target()?.into();
let input: HtmlInputElement = target.dyn_into::<HtmlInputElement>().ok()?;
Some(input.value())
}
pub(crate) fn timing_previous_snapshot(previous: Previous<String>) -> String {
match previous.get_previous_snapshot() {
Some(value) => value,
None => String::from("—"),
}
}
pub(crate) fn timing_signal_to_string(signal: &Signal<String>) -> String {
signal.get()
}