use crate::ouia;
use crate::prelude::OuiaComponentType;
use crate::utils::OuiaSafe;
use crate::{prelude::use_prop_id, utils::Ouia};
use std::mem::swap;
use yew::prelude::*;
const OUIA: Ouia = ouia!("Radio");
#[derive(PartialEq, Properties)]
pub struct RadioProperties {
#[prop_or_default]
pub class: Classes,
#[prop_or_default]
pub input_class: Classes,
#[prop_or_default]
pub id: Option<String>,
#[prop_or_default]
pub name: Option<AttrValue>,
#[prop_or_default]
pub value: Option<AttrValue>,
#[prop_or_default]
pub children: Children,
#[prop_or_default]
pub checked: bool,
#[prop_or_default]
pub reversed: bool,
#[prop_or_default]
pub disabled: bool,
#[prop_or_default]
pub description: Option<Html>,
#[prop_or_default]
pub body: Option<Html>,
#[prop_or_default]
pub onchange: Callback<()>,
#[prop_or_default]
pub input_onclick: Option<Callback<MouseEvent>>,
#[prop_or_default]
pub force_label: bool,
#[prop_or_default]
pub ouia_id: Option<String>,
#[prop_or(OUIA.component_type())]
pub ouia_type: OuiaComponentType,
#[prop_or(OuiaSafe::TRUE)]
pub ouia_safe: OuiaSafe,
}
#[function_component(Radio)]
pub fn radio(props: &RadioProperties) -> Html {
let ouia_id = use_memo(props.ouia_id.clone(), |id| {
id.clone().unwrap_or(OUIA.generated_id())
});
let class = classes!("pf-v6-c-radio", props.class.clone());
let id = use_prop_id(props.id.clone());
let mut input_class = classes!(props.input_class.clone(), "pf-v6-c-radio__input");
if props.children.is_empty() && !props.force_label {
input_class.extend(classes!("pf-m-standalone"));
}
let onchange = use_callback(props.onchange.clone(), |_, onchange| {
onchange.emit(());
});
let mut first = html!(
<input
class={input_class}
type="radio"
id={(*id).clone()}
name={&props.name}
checked={props.checked}
disabled={props.disabled}
value={&props.value}
{onchange}
onclick={props.input_onclick.clone()}
data-ouia-component-id={(*ouia_id).clone()}
data-ouia-component-type={props.ouia_type}
data-ouia-safe={props.ouia_safe}
/>
);
let mut label_class = classes!("pf-v6-c-radio__label");
if props.disabled {
label_class.extend(classes!("pf-m-disabled"));
}
let mut second = html!(
<>
if !props.children.is_empty() || props.force_label {
<label class={label_class} for={(*id).clone()}>{ props.children.clone() }</label>
}
</>
);
if props.reversed {
swap(&mut first, &mut second);
}
html!(
<div {class}>
{ first }
{ second }
if let Some(description) = &props.description {
<span class="pf-v6-c-radio__description">{ description.clone() }</span>
}
if let Some(body) = &props.body {
<span class="pf-v6-c-radio__body">{ body.clone() }</span>
}
</div>
)
}