Skip to main content

dxc_components/icon/
icon.rs

1use super::props::IconProps;
2use dioxus::prelude::*;
3use dxc_hooks::UseNamespace;
4use dxc_icons::spawn_icon;
5use dxc_macros::classes;
6use dxc_types::namespace::Block;
7
8/// Use icons from iconfont.
9///
10/// see [iconfont](https://www.iconfont.cn/)
11///
12/// # Example
13/// ```
14/// use dxc::prelude::*;
15///
16/// rsx! {
17///   DxcIcon {
18///     Apple { }
19///   }
20/// }
21/// ```
22#[component]
23pub fn DxcIcon(props: IconProps) -> Element {
24    let id = use_signal(|| props.id());
25
26    let ns = UseNamespace::new(Block::Icon, None);
27
28    let classes = classes! {ns.b(), props.class()};
29
30    let style = use_signal(|| props.style());
31
32    rsx! {
33      i {
34        id: id(),
35        class: classes,
36        style: style(),
37        onclick: move |evt| {
38            if let Some(onclick) = props.onclick.as_ref() {
39                onclick.call(evt);
40            }
41        },
42
43        match props.icon {
44          Some(icon) => {
45            spawn_icon(&icon)
46          },
47          None => {
48            props.children
49          }
50        }
51      }
52    }
53}