dxc_components/link/
link.rs

1use super::props::LinkProps;
2use dioxus::prelude::*;
3use dxc_hooks::UseNamespace;
4use dxc_macros::classes;
5use dxc_types::{namespace::Block, components::link::*};
6
7#[component]
8pub fn DxcLink(props: LinkProps) -> Element {
9    let link_type = use_signal(|| props.type_().to_string());
10    let underline_mode = use_signal(|| props.underline());
11    let disabled = use_signal(|| props.disabled());
12    let href = use_signal(|| props.href());
13    let target = use_signal(|| props.target());
14
15    let ns = UseNamespace::new(Block::Link, None);
16
17    let classes = classes! {
18        ns.b(),
19        ns.m_(link_type()),
20        ns.is_(String::from("disabled"), Some(disabled())),
21        ns.is_(String::from("underline"), Some(underline_mode() == Underline::Always)),
22        ns.is_(String::from("hover-underline"), Some(underline_mode() == Underline::Hover && !disabled())),
23    };
24
25    rsx! {
26        a {
27            class: classes,
28            href: (!disabled()).then_some(href()),
29            target: (!disabled()).then_some(target()),
30            onclick: move |e| {
31                if disabled() {
32                    e.prevent_default();
33                }
34            },
35            span {
36                {props.children}
37            }
38        }
39    }
40}