yew_hooks/hooks/
use_scrolling.rs

1use yew::prelude::*;
2
3use super::{use_debounce, use_event};
4
5/// A sensor hook that tracks whether HTML element is scrolling.
6///
7/// # Example
8///
9/// ```rust
10/// # use yew::prelude::*;
11/// #
12/// use yew_hooks::prelude::*;
13///
14/// #[function_component(UseScrolling)]
15/// fn scrolling() -> Html {
16///     let node = use_node_ref();
17///     let state = use_scrolling(node.clone());
18///     
19///     html! {
20///         <div ref={node}>
21///             <b>{ " Scrolling: " }</b>
22///             { state }
23///         </div>
24///     }
25/// }
26/// ```
27#[hook]
28pub fn use_scrolling(node: NodeRef) -> bool {
29    let state = use_state_eq(|| false);
30
31    let debounce = {
32        let state = state.clone();
33        use_debounce(
34            move || {
35                state.set(false);
36            },
37            150,
38        )
39    };
40
41    {
42        let state = state.clone();
43        use_event(node, "scroll", move |_: Event| {
44            state.set(true);
45            debounce.run();
46        });
47    }
48
49    *state
50}