leptos_use/
use_toggle.rs

1use crate::core::MaybeRwSignal;
2use leptos::prelude::*;
3
4/// A boolean switcher with utility functions.
5///
6/// ## Demo
7///
8/// [Link to Demo](https://github.com/Synphonyte/leptos-use/tree/main/examples/use_toggle)
9///
10/// ## Usage
11///
12/// ```
13/// # use leptos::*;
14/// # use leptos_use::{use_toggle, UseToggleReturn};
15/// #
16/// # #[component]
17/// # fn Demo() -> impl IntoView {
18/// let UseToggleReturn { toggle, value, set_value } = use_toggle(true);
19/// #
20/// # view! { }
21/// # }
22/// ```
23///
24/// ## See also
25///
26/// * [`fn@crate::use_cycle_list`]
27// #[doc(cfg(feature = "use_toggle"))]
28pub fn use_toggle(
29    initial_value: impl Into<MaybeRwSignal<bool>>,
30) -> UseToggleReturn<impl Fn() + Clone + Send + Sync + 'static> {
31    let initial_value = initial_value.into();
32    let (value, set_value) = initial_value.into_signal();
33
34    let toggle = move || {
35        set_value.update(|v| *v = !*v);
36    };
37
38    UseToggleReturn {
39        toggle,
40        value,
41        set_value,
42    }
43}
44
45/// Return type of [`fn@crate::use_toggle`].
46// #[doc(cfg(feature = "use_toggle"))]
47pub struct UseToggleReturn<F>
48where
49    F: Fn() + Clone + Send + Sync + 'static,
50{
51    /// Toggles the value between `true` and `false`.
52    pub toggle: F,
53    /// The current value as signal.
54    pub value: Signal<bool>,
55    /// Sets the current value to the given value.
56    pub set_value: WriteSignal<bool>,
57}