make navigator non-generic

This commit is contained in:
Evan Almloff committed 2023-07-26 11:08:45 -07:00
1 parent 0ebcb5f1be
commit 947a153347
4 files changed
+44 -22

No files matched your search

+9 -11
View File
@@ -1,4 +1,4 @@
use crate::prelude::{ExternalNavigationFailure, NavigationTarget, Routable, RouterContext};
use crate::prelude::{ExternalNavigationFailure, IntoRoutable, RouterContext};
/// A view into the navigation state of a router.
#[derive(Clone)]
@@ -34,20 +34,18 @@ impl GenericNavigator {
/// Push a new location.
///
/// The previous location will be available to go back to.
pub fn push<R: Routable>(
&self,
target: impl Into<NavigationTarget<R>>,
) -> Option<ExternalNavigationFailure> {
self.0.push(target)
pub fn push(&self, target: impl Into<IntoRoutable>) -> Option<ExternalNavigationFailure> {
let target = target.into();
let as_any_navigation_target = self.0.resolve_into_routable(&target);
self.0.push_any(as_any_navigation_target)
}
/// Replace the current location.
///
/// The previous location will **not** be available to go back to.
pub fn replace<R: Routable>(
&self,
target: impl Into<NavigationTarget<R>>,
) -> Option<ExternalNavigationFailure> {
self.0.replace(target)
pub fn replace(&self, target: impl Into<IntoRoutable>) -> Option<ExternalNavigationFailure> {
let target = target.into();
let as_any_navigation_target = self.0.resolve_into_routable(&target);
self.0.replace_any(as_any_navigation_target)
}
}
+33 -1
View File
@@ -7,7 +7,9 @@ use std::{
use dioxus::prelude::*;
use crate::{
navigation::NavigationTarget, prelude::AnyHistoryProvider, routable::Routable,
navigation::NavigationTarget,
prelude::{AnyHistoryProvider, IntoRoutable},
routable::Routable,
router_cfg::RouterConfig,
};
@@ -203,6 +205,21 @@ impl RouterContext {
self.change_route()
}
pub(crate) fn replace_any(
&self,
target: NavigationTarget<Box<dyn Any>>,
) -> Option<ExternalNavigationFailure> {
match target {
NavigationTarget::Internal(p) => {
let mut state = self.state_mut();
state.history.replace(p)
}
NavigationTarget::External(e) => return self.external(e),
}
self.change_route()
}
/// The route that is currently active.
pub fn current<R: Routable>(&self) -> R {
*self
@@ -224,6 +241,21 @@ impl RouterContext {
(self.any_route_to_string)(route)
}
pub(crate) fn resolve_into_routable(
&self,
into_routable: &IntoRoutable,
) -> NavigationTarget<Box<dyn Any>> {
let href = match into_routable {
IntoRoutable::FromStr(url) => url.to_string(),
IntoRoutable::Route(route) => self.any_route_to_string(&**route),
};
let parsed_route: NavigationTarget<Box<dyn Any>> = match self.route_from_str(&href) {
Ok(route) => NavigationTarget::Internal(route.into()),
Err(err) => NavigationTarget::External(err),
};
parsed_route
}
/// The prefix that is currently active.
pub fn prefix(&self) -> Option<String> {
self.state.read().unwrap().prefix.clone()