use crate::{
Pausable, UseIntervalFnOptions, UseIntervalOptions, UseIntervalReturn, sendwrap_fn,
use_interval_fn_with_options,
};
use leptos::prelude::*;
use leptos::reactive::wrappers::read::Signal;
pub fn use_interval<N>(
interval: N,
) -> UseIntervalReturn<
impl Fn() + Clone + Send + Sync,
impl Fn() + Clone + Send + Sync,
impl Fn() + Clone + Send + Sync,
>
where
N: Into<Signal<u64>>,
{
use_interval_with_options(interval, UseIntervalOptions::default())
}
pub fn use_interval_with_options<N>(
interval: N,
options: UseIntervalOptions,
) -> UseIntervalReturn<
impl Fn() + Clone + Send + Sync,
impl Fn() + Clone + Send + Sync,
impl Fn() + Clone + Send + Sync,
>
where
N: Into<Signal<u64>>,
{
let UseIntervalOptions {
immediate,
callback,
} = options;
let (counter, set_counter) = signal(0u64);
let update = move || set_counter.update(|count| *count += 1);
let reset = sendwrap_fn!(move || set_counter.set(0));
let cb = move || {
update();
callback(counter.get());
};
let Pausable {
is_active,
pause,
resume,
} = use_interval_fn_with_options(
cb,
interval,
UseIntervalFnOptions {
immediate,
immediate_callback: false,
},
);
UseIntervalReturn {
counter: counter.into(),
reset,
is_active,
pause,
resume,
}
}