Skip to main content

dioxus_tw_components/components/
toggle.rs

1use dioxus::prelude::*;
2
3#[derive(Clone, PartialEq, Props)]
4pub struct ToggleProps {
5    #[props(extends = button, extends = GlobalAttributes)]
6    attributes: Vec<Attribute>,
7    #[props(optional)]
8    checked: Option<bool>,
9
10    #[props(optional)]
11    onclick: EventHandler<MouseEvent>,
12
13    children: Element,
14}
15
16#[component]
17pub fn Toggle(mut props: ToggleProps) -> Element {
18    let default_classes = "toggle";
19    crate::setup_class_attribute(&mut props.attributes, default_classes);
20
21    let mut interior_sig = use_signal(|| props.checked.unwrap_or_default());
22
23    let onclick = move |event| {
24        interior_sig.toggle();
25        props.onclick.call(event);
26    };
27
28    rsx! {
29        button {
30            "data-state": if interior_sig() { "checked" } else { "unchecked" },
31            r#type: "button",
32            onclick,
33            ..props.attributes,
34            span { class: "toggle-thumb" }
35            {props.children}
36        }
37    }
38}