leptos_use/
use_interval.rs1use crate::utils::Pausable;
2use crate::{UseIntervalFnOptions, sendwrap_fn, use_interval_fn_with_options};
3use default_struct_builder::DefaultBuilder;
4use leptos::prelude::*;
5use leptos::reactive::wrappers::read::Signal;
6use std::rc::Rc;
7
8pub fn use_interval<N>(
44 interval: N,
45) -> UseIntervalReturn<
46 impl Fn() + Clone + Send + Sync,
47 impl Fn() + Clone + Send + Sync,
48 impl Fn() + Clone + Send + Sync,
49>
50where
51 N: Into<Signal<u64>>,
52{
53 use_interval_with_options(interval, UseIntervalOptions::default())
54}
55
56pub fn use_interval_with_options<N>(
58 interval: N,
59 options: UseIntervalOptions,
60) -> UseIntervalReturn<
61 impl Fn() + Clone + Send + Sync,
62 impl Fn() + Clone + Send + Sync,
63 impl Fn() + Clone + Send + Sync,
64>
65where
66 N: Into<Signal<u64>>,
67{
68 let UseIntervalOptions {
69 immediate,
70 callback,
71 } = options;
72
73 let (counter, set_counter) = signal(0u64);
74
75 let update = move || set_counter.update(|count| *count += 1);
76 let reset = sendwrap_fn!(move || set_counter.set(0));
77
78 let cb = move || {
79 update();
80 callback(counter.get());
81 };
82
83 let Pausable {
84 is_active,
85 pause,
86 resume,
87 } = use_interval_fn_with_options(
88 cb,
89 interval,
90 UseIntervalFnOptions {
91 immediate,
92 immediate_callback: false,
93 },
94 );
95
96 UseIntervalReturn {
97 counter: counter.into(),
98 reset,
99 is_active,
100 pause,
101 resume,
102 }
103}
104
105#[derive(DefaultBuilder)]
107pub struct UseIntervalOptions {
108 immediate: bool,
110
111 callback: Rc<dyn Fn(u64)>,
113}
114
115impl Default for UseIntervalOptions {
116 fn default() -> Self {
117 Self {
118 immediate: true,
119 callback: Rc::new(|_: u64| {}),
120 }
121 }
122}
123
124#[derive(DefaultBuilder)]
126pub struct UseIntervalReturn<PauseFn, ResumeFn, ResetFn>
127where
128 PauseFn: Fn() + Clone + Send + Sync,
129 ResumeFn: Fn() + Clone + Send + Sync,
130 ResetFn: Fn() + Clone + Send + Sync,
131{
132 pub counter: Signal<u64>,
134
135 pub reset: ResetFn,
137
138 pub is_active: Signal<bool>,
140
141 pub pause: PauseFn,
143
144 pub resume: ResumeFn,
146}