dioxus_tw_components/components/
radio.rs1use 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}