use dioxus::prelude::*;
#[derive(Clone, PartialEq)]
pub enum MessageType {
Success,
Warning,
Info,
Error,
}
impl MessageType {
pub fn as_class(&self) -> &'static str {
match self {
MessageType::Success => "el-message--success",
MessageType::Warning => "el-message--warning",
MessageType::Info => "el-message--info",
MessageType::Error => "el-message--error",
}
}
pub fn as_icon(&self) -> &'static str {
match self {
MessageType::Success => "el-icon-success",
MessageType::Warning => "el-icon-warning",
MessageType::Info => "el-icon-info",
MessageType::Error => "el-icon-error",
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct MessageProps {
pub message: String,
#[props(default = MessageType::Info)]
pub message_type: MessageType,
#[props(default = false)]
pub closable: bool,
#[props(default = true)]
pub show_icon: bool,
#[props(default = false)]
pub center: bool,
#[props(default = 3000)]
pub duration: u64,
#[props(default)]
pub on_close: Option<EventHandler<()>>,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn Message(props: MessageProps) -> Element {
let mut class_names = vec!["el-message".to_string()];
class_names.push(props.message_type.as_class().to_string());
if props.center { class_names.push("is-center".to_string()); }
if let Some(ref c) = props.class { class_names.push(c.clone()); }
rsx! {
div {
class: "{class_names.join(\" \")}",
style: props.style.clone().unwrap_or_default(),
role: "alert",
if props.show_icon {
i { class: "{props.message_type.as_icon()} el-message__icon" }
}
p {
class: "el-message__content",
"{props.message}"
}
if props.closable {
button {
class: "el-message__closeBtn",
onclick: move |_| {
if let Some(handler) = props.on_close {
handler.call(());
}
},
"×"
}
}
}
}
}