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