Skip to main content

dioxus_tw_components/components/
radio.rs

1use dioxus::prelude::*;
2
3#[derive(Clone, Copy)]
4struct RadioGroupCtx {
5    value: Signal<String>,
6    onchange: EventHandler<MouseEvent>,
7}
8
9#[derive(Clone, PartialEq, Props)]
10pub struct RadioGroupProps {
11    #[props(extends = div, extends = GlobalAttributes)]
12    attributes: Vec<Attribute>,
13    children: Element,
14
15    #[props(optional)]
16    default_value: String,
17
18    #[props(optional)]
19    value: Signal<String>,
20
21    #[props(optional)]
22    onchange: EventHandler<MouseEvent>,
23}
24
25#[component]
26pub fn RadioGroup(mut props: RadioGroupProps) -> Element {
27    use_context_provider(|| RadioGroupCtx {
28        value: props.value,
29        onchange: props.onchange,
30    });
31
32    let default_classes = "radio";
33    crate::setup_class_attribute(&mut props.attributes, default_classes);
34
35    rsx! {
36        div { ..props.attributes, {props.children} }
37    }
38}
39
40#[derive(Clone, PartialEq, Props)]
41pub struct RadioItemProps {
42    #[props(extends = input, extends = GlobalAttributes)]
43    attributes: Vec<Attribute>,
44    value: String,
45}
46
47#[component]
48pub fn RadioItem(mut props: RadioItemProps) -> Element {
49    let mut state = use_context::<RadioGroupCtx>();
50
51    let default_classes = "radio-input";
52    crate::setup_class_attribute(&mut props.attributes, default_classes);
53
54    let value = props.value.clone();
55    let checked = use_memo(move || (state.value)() == value);
56
57    rsx! {
58        input {
59            r#type: "radio",
60            checked,
61            onclick: move |event| {
62                state.value.set(props.value.clone());
63                state.onchange.call(event);
64            },
65            ..props.attributes,
66        }
67    }
68}