//! Extensions to the incremental renderer to support pre-caching static routes. use core::pin::Pin; use std::future::Future; use std::str::FromStr; use crate::prelude::*; use dioxus_lib::prelude::*; /// Pre-cache all static routes. pub async fn pre_cache_static_routes( renderer: &mut IncrementalRenderer, wrapper: &R, ) -> Result<(), IncrementalRendererError> where Rt: Routable, ::Err: std::fmt::Display, { for route in Rt::static_routes() { render_route( renderer, route, &mut tokio::io::sink(), |vdom| { Box::pin(async move { vdom.rebuild_in_place(); vdom.wait_for_suspense().await; }) }, wrapper, ) .await?; } Ok(()) } /// Render a route to a writer. pub async fn render_route< R: WrapBody + Send + Sync, Rt, W, F: FnOnce(&mut VirtualDom) -> Pin + '_>>, >( renderer: &mut IncrementalRenderer, route: Rt, writer: &mut W, modify_vdom: F, wrapper: &R, ) -> Result where Rt: Routable, ::Err: std::fmt::Display, W: tokio::io::AsyncWrite + Unpin + Send, { #[derive(Clone)] struct RootProps(Rt); impl PartialEq for RootProps { fn eq(&self, _: &Self) -> bool { true } } fn RenderPath(props: RootProps) -> Element where R: Routable, ::Err: std::fmt::Display, { let path = props.0; rsx! { Router:: { config: || RouterConfig::default().history(MemoryHistory::with_initial_path(path)) } } } renderer .render( route.to_string(), || VirtualDom::new_with_props(RenderPath, RootProps(route)), writer, modify_vdom, wrapper, ) .await }