yew_hooks/hooks/
use_debounce_state.rs1use std::ops::Deref;
2use std::rc::Rc;
3
4use yew::prelude::*;
5
6use super::use_debounce;
7
8pub struct UseDebounceStateHandle<T> {
10 inner: UseStateHandle<T>,
11 set: Rc<dyn Fn(T)>,
12}
13
14impl<T> UseDebounceStateHandle<T> {
15 pub fn set(&self, value: T) {
17 (self.set)(value);
18 }
19}
20
21impl<T> Deref for UseDebounceStateHandle<T> {
22 type Target = T;
23
24 fn deref(&self) -> &Self::Target {
25 &self.inner
26 }
27}
28
29impl<T> Clone for UseDebounceStateHandle<T> {
30 fn clone(&self) -> Self {
31 Self {
32 inner: self.inner.clone(),
33 set: self.set.clone(),
34 }
35 }
36}
37
38impl<T> PartialEq for UseDebounceStateHandle<T>
39where
40 T: PartialEq,
41{
42 fn eq(&self, other: &Self) -> bool {
43 *self.inner == *other.inner
44 }
45}
46
47#[hook]
79pub fn use_debounce_state<T, F>(init_fn: F, millis: u32) -> UseDebounceStateHandle<T>
80where
81 T: 'static,
82 F: FnOnce() -> T,
83{
84 let value = use_mut_ref(|| None);
85 let inner = use_state(init_fn);
86 let debounce = {
87 let value = value.clone();
88 let inner = inner.clone();
89 use_debounce(
90 move || {
91 let value = (*value.borrow_mut()).take();
92 if let Some(value) = value {
93 inner.set(value);
94 }
95 },
96 millis,
97 )
98 };
99
100 let set = {
101 Rc::new(move |new_value: T| {
102 *value.borrow_mut() = Some(new_value);
103 debounce.run();
104 })
105 };
106
107 UseDebounceStateHandle { inner, set }
108}