use dioxus::prelude::*;
#[derive(Clone, PartialEq, Props)]
pub struct ButtonProps {
#[props(extends = button, extends = GlobalAttributes)]
attributes: Vec<Attribute>,
#[props(optional)]
onclick: EventHandler<MouseEvent>,
#[props(optional)]
ondoubleclick: EventHandler<MouseEvent>,
#[props(optional)]
onmousedown: EventHandler<MouseEvent>,
#[props(optional)]
onmouseup: EventHandler<MouseEvent>,
#[props(default = false)]
noclasses: bool,
#[props(default = false)]
loading: bool,
children: Element,
}
#[component]
pub fn Button(mut props: ButtonProps) -> Element {
let default_classes = "button";
crate::setup_class_attribute(&mut props.attributes, default_classes);
let loading = props.loading;
let onclick = move |event| {
if !loading {
props.onclick.call(event);
}
};
let ondoubleclick = move |event| {
if !loading {
props.ondoubleclick.call(event);
}
};
let onmousedown = move |event| {
if !loading {
props.onmousedown.call(event);
}
};
let onmouseup = move |event| {
if !loading {
props.onmouseup.call(event);
}
};
rsx! {
button {
disabled: loading,
onclick,
ondoubleclick,
onmousedown,
onmouseup,
..props.attributes,
if loading {
style { "@keyframes btn-spin {{ from {{ transform: rotate(0deg); }} to {{ transform: rotate(360deg); }} }}" }
span {
class: "inline-flex items-center gap-2 opacity-70 pointer-events-none",
span {
style: "font-family: 'Material Symbols Rounded'; font-size: 1.2em; line-height: 1; animation: btn-spin 1s linear infinite; display: inline-block;",
"progress_activity"
}
"Loading..."
}
} else {
{props.children}
}
}
}
}