dioxus_bootstrap/
toast.rs

1use dioxus::prelude::*;
2
3#[derive(Clone, Props, PartialEq)]
4pub struct ToastProps {
5    #[props(optional)]
6    id: String,
7    #[props(optional, default = "".to_string())]
8    class: String,
9    #[props(optional, default = false)]
10    fade: bool,
11    #[props(optional, default = false)]
12    show: bool,
13    children: Element,
14}
15
16#[component]
17pub fn Toast(props: ToastProps) -> Element {
18    let mut class_list = vec!["toast".to_string()];
19    
20    if props.fade {
21        class_list.push("fade".to_string());
22    }
23    
24    if props.show {
25        class_list.push("show".to_string());
26    }
27    
28    if !props.class.is_empty() {
29        class_list.push(props.class.clone());
30    }
31    
32    let class_list = class_list.join(" ");
33    
34    rsx! {
35        div {
36            id: props.id,
37            class: class_list,
38            role: "alert",
39            "aria-live": "assertive",
40            "aria-atomic": "true",
41            {props.children}
42        }
43    }
44}
45
46#[derive(Clone, Props, PartialEq)]
47pub struct ToastHeaderProps {
48    #[props(optional)]
49    id: String,
50    #[props(optional, default = "".to_string())]
51    class: String,
52    #[props(optional, default = true)]
53    close_button: bool,
54    children: Element,
55}
56
57#[component]
58pub fn ToastHeader(props: ToastHeaderProps) -> Element {
59    let mut class_list = vec!["toast-header".to_string()];
60    
61    if !props.class.is_empty() {
62        class_list.push(props.class.clone());
63    }
64    
65    let class_list = class_list.join(" ");
66    
67    rsx! {
68        div {
69            id: props.id,
70            class: class_list,
71            {props.children}
72            if props.close_button {
73                button {
74                    r#type: "button",
75                    class: "btn-close",
76                    "data-bs-dismiss": "toast",
77                    "aria-label": "Close",
78                }
79            }
80        }
81    }
82}
83
84#[derive(Clone, Props, PartialEq)]
85pub struct ToastBodyProps {
86    #[props(optional)]
87    id: String,
88    #[props(optional, default = "".to_string())]
89    class: String,
90    children: Element,
91}
92
93#[component]
94pub fn ToastBody(props: ToastBodyProps) -> Element {
95    let mut class_list = vec!["toast-body".to_string()];
96    
97    if !props.class.is_empty() {
98        class_list.push(props.class.clone());
99    }
100    
101    let class_list = class_list.join(" ");
102    
103    rsx! {
104        div {
105            id: props.id,
106            class: class_list,
107            {props.children}
108        }
109    }
110}
111
112#[derive(Clone, Props, PartialEq)]
113pub struct ToastContainerProps {
114    #[props(optional)]
115    id: String,
116    #[props(optional, default = "".to_string())]
117    class: String,
118    children: Element,
119}
120
121#[component]
122pub fn ToastContainer(props: ToastContainerProps) -> Element {
123    let mut class_list = vec!["toast-container".to_string()];
124    
125    if !props.class.is_empty() {
126        class_list.push(props.class.clone());
127    }
128    
129    let class_list = class_list.join(" ");
130    
131    rsx! {
132        div {
133            id: props.id,
134            class: class_list,
135            {props.children}
136        }
137    }
138}