//! Fullstack router intigration #![allow(non_snake_case)] use dioxus::prelude::*; /// Used by the launch macro #[doc(hidden)] pub fn RouteWithCfg(cx: Scope>) -> Element where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { use dioxus_router::prelude::RouterConfig; #[cfg(feature = "ssr")] let context: crate::prelude::DioxusServerContext = cx .consume_context() .expect("RouteWithCfg should be served by dioxus fullstack"); let cfg = *cx.props; render! { dioxus_router::prelude::GenericRouter:: { config: move || { RouterConfig::default() .failure_external_navigation(cfg.failure_external_navigation) .history({ #[cfg(feature = "ssr")] let history = dioxus_router::prelude::MemoryHistory::with_initial_path( context .request_parts() .uri .to_string() .parse() .unwrap_or_else(|err| { log::error!("Failed to parse uri: {}", err); "/" .parse() .unwrap_or_else(|err| { panic!("Failed to parse uri: {}", err); }) }), ); #[cfg(not(feature = "ssr"))] let history = dioxus_router::prelude::WebHistory::new( None, cfg.scroll_restoration, ); history }) }, } } } fn default_external_navigation_handler() -> fn(Scope) -> Element where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { dioxus_router::prelude::FailureExternalNavigation:: } /// The configeration for the router #[derive(Props, serde::Serialize, serde::Deserialize)] pub struct FullstackRouterConfig where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { #[serde(skip)] #[serde(default = "default_external_navigation_handler::")] failure_external_navigation: fn(Scope) -> Element, scroll_restoration: bool, #[serde(skip)] phantom: std::marker::PhantomData, } impl Clone for FullstackRouterConfig where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { fn clone(&self) -> Self { Self { failure_external_navigation: self.failure_external_navigation, scroll_restoration: self.scroll_restoration, phantom: std::marker::PhantomData, } } } impl Copy for FullstackRouterConfig where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { } impl Default for FullstackRouterConfig where R: dioxus_router::prelude::Routable, ::Err: std::fmt::Display, { fn default() -> Self { Self { failure_external_navigation: dioxus_router::prelude::FailureExternalNavigation::, scroll_restoration: true, phantom: std::marker::PhantomData, } } }