Fix cargo test and a number of little cleanup bugs
This commit is contained in:
49 files changed
+307
-309
No files matched your search
@@ -81,6 +81,9 @@ impl From<&Url> for IntoRoutable {
|
||||
/// The properties for a [`Link`].
|
||||
#[derive(Props, Clone, PartialEq)]
|
||||
pub struct LinkProps {
|
||||
/// The class attribute for the `a` tag.
|
||||
pub class: Option<String>,
|
||||
|
||||
/// A class to apply to the generate HTML anchor tag if the `target` route is active.
|
||||
pub active_class: Option<String>,
|
||||
|
||||
@@ -204,6 +207,7 @@ pub fn Link(props: LinkProps) -> Element {
|
||||
onclick_only,
|
||||
rel,
|
||||
to,
|
||||
class,
|
||||
..
|
||||
} = props;
|
||||
|
||||
@@ -226,9 +230,19 @@ pub fn Link(props: LinkProps) -> Element {
|
||||
IntoRoutable::Route(route) => router.any_route_to_string(&**route),
|
||||
};
|
||||
let parsed_route: NavigationTarget<Rc<dyn Any>> = router.resolve_into_routable(to.clone());
|
||||
let class = active_class
|
||||
.and_then(|active_class| (href == current_url).then(|| format!(" {active_class}")))
|
||||
.unwrap_or_default();
|
||||
|
||||
let mut class_ = String::new();
|
||||
if let Some(c) = class {
|
||||
class_.push_str(&c);
|
||||
}
|
||||
if let Some(c) = active_class {
|
||||
if href == current_url {
|
||||
if !class_.is_empty() {
|
||||
class_.push(' ');
|
||||
}
|
||||
class_.push_str(&c);
|
||||
}
|
||||
}
|
||||
|
||||
let tag_target = new_tab.then_some("_blank").unwrap_or_default();
|
||||
|
||||
@@ -254,10 +268,10 @@ pub fn Link(props: LinkProps) -> Element {
|
||||
rsx! {
|
||||
a {
|
||||
onclick: action,
|
||||
href: "{href}",
|
||||
prevent_default: "{prevent_default}",
|
||||
class: "{class}",
|
||||
rel: "{rel}",
|
||||
href,
|
||||
prevent_default,
|
||||
class: class_,
|
||||
rel,
|
||||
target: "{tag_target}",
|
||||
..attributes,
|
||||
{children}
|
||||
|
||||
@@ -157,7 +157,7 @@ impl RouterContext {
|
||||
/// Will fail silently if there is no previous location to go to.
|
||||
pub fn go_back(&self) {
|
||||
{
|
||||
self.inner.write().history.go_back();
|
||||
self.inner.clone().write().history.go_back();
|
||||
}
|
||||
|
||||
self.change_route();
|
||||
@@ -168,7 +168,7 @@ impl RouterContext {
|
||||
/// Will fail silently if there is no next location to go to.
|
||||
pub fn go_forward(&self) {
|
||||
{
|
||||
self.inner.write().history.go_forward();
|
||||
self.inner.clone().write().history.go_forward();
|
||||
}
|
||||
|
||||
self.change_route();
|
||||
@@ -179,7 +179,7 @@ impl RouterContext {
|
||||
target: NavigationTarget<Rc<dyn Any>>,
|
||||
) -> Option<ExternalNavigationFailure> {
|
||||
{
|
||||
let mut write = self.inner.write();
|
||||
let mut write = self.inner.clone().write();
|
||||
match target {
|
||||
NavigationTarget::Internal(p) => write.history.push(p),
|
||||
NavigationTarget::External(e) => return write.external(e),
|
||||
@@ -195,7 +195,7 @@ impl RouterContext {
|
||||
pub fn push(&self, target: impl Into<IntoRoutable>) -> Option<ExternalNavigationFailure> {
|
||||
let target = self.resolve_into_routable(target.into());
|
||||
{
|
||||
let mut write = self.inner.write();
|
||||
let mut write = self.inner.clone().write();
|
||||
match target {
|
||||
NavigationTarget::Internal(p) => write.history.push(p),
|
||||
NavigationTarget::External(e) => return write.external(e),
|
||||
@@ -212,7 +212,7 @@ impl RouterContext {
|
||||
let target = self.resolve_into_routable(target.into());
|
||||
|
||||
{
|
||||
let mut state = self.inner.write();
|
||||
let mut state = self.inner.clone().write();
|
||||
match target {
|
||||
NavigationTarget::Internal(p) => state.history.replace(p),
|
||||
NavigationTarget::External(e) => return state.external(e),
|
||||
@@ -276,14 +276,14 @@ impl RouterContext {
|
||||
|
||||
/// Clear any unresolved errors
|
||||
pub fn clear_error(&self) {
|
||||
let mut write_inner = self.inner.write();
|
||||
let mut write_inner = self.inner.clone().write();
|
||||
write_inner.unresolved_error = None;
|
||||
|
||||
write_inner.update_subscribers();
|
||||
}
|
||||
|
||||
pub(crate) fn render_error(&self) -> Element {
|
||||
let inner_read = self.inner.write();
|
||||
let inner_read = self.inner.clone().write();
|
||||
inner_read
|
||||
.unresolved_error
|
||||
.as_ref()
|
||||
@@ -297,7 +297,7 @@ impl RouterContext {
|
||||
let callback = callback.clone();
|
||||
drop(self_read);
|
||||
if let Some(new) = callback(myself) {
|
||||
let mut self_write = self.inner.write();
|
||||
let mut self_write = self.inner.clone().write();
|
||||
match new {
|
||||
NavigationTarget::Internal(p) => self_write.history.replace(p),
|
||||
NavigationTarget::External(e) => return self_write.external(e),
|
||||
|
||||
@@ -33,7 +33,7 @@ use crate::utils::use_router_internal::use_router_internal;
|
||||
///
|
||||
/// #[component]
|
||||
/// fn Index() -> Element {
|
||||
/// let path: Route = use_route(&cx).unwrap();
|
||||
/// let path: Route = use_route();
|
||||
/// rsx! {
|
||||
/// h2 { "Current Path" }
|
||||
/// p { "{path}" }
|
||||
@@ -45,14 +45,12 @@ use crate::utils::use_router_internal::use_router_internal;
|
||||
/// # assert_eq!(dioxus_ssr::render(&vdom), "<h1>App</h1><h2>Current Path</h2><p>/</p>")
|
||||
/// ```
|
||||
#[must_use]
|
||||
pub fn use_route<R: Routable + Clone>() -> Option<R> {
|
||||
pub fn use_route<R: Routable + Clone>() -> R {
|
||||
match use_router_internal() {
|
||||
Some(r) => Some(r.current()),
|
||||
Some(r) => r.current(),
|
||||
None => {
|
||||
#[cfg(debug_assertions)]
|
||||
panic!("`use_route` must have access to a parent router");
|
||||
#[allow(unreachable_code)]
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user