use dioxus::prelude::*;
#[derive(Clone, PartialEq)]
pub(crate) struct ResolvedLink {
pub(crate) href: Option<String>,
#[cfg_attr(not(feature = "router"), allow(dead_code))]
route: Option<String>,
pub(crate) current: bool,
}
impl ResolvedLink {
#[cfg_attr(not(feature = "router"), allow(clippy::unused_self))]
pub(crate) fn follow(&self, event: &MouseEvent) -> bool {
#[cfg(feature = "router")]
if let (Some(route), Some(router)) = (&self.route, dioxus::router::try_router()) {
let plain = event.modifiers().is_empty()
&& event.trigger_button() == Some(dioxus::html::input_data::MouseButton::Primary);
if plain {
event.prevent_default();
router.push(route.clone());
return true;
}
}
let _ = event;
false
}
}
pub(crate) fn use_link(href: Option<String>) -> ResolvedLink {
#[cfg(feature = "router")]
if let (Some(path), Some(router)) = (&href, dioxus::router::try_router()) {
if !path.starts_with('#') {
let target: dioxus::router::NavigationTarget = path.clone().into();
if let dioxus::router::NavigationTarget::Internal(route) = target {
let current = router.full_route_string() == route;
return ResolvedLink {
href: Some(router.prefix().unwrap_or_default() + &route),
route: Some(route),
current,
};
}
}
}
ResolvedLink {
href,
route: None,
current: false,
}
}