use leptos::{ IntoView, component, error::Error, prelude::{Children, IntoAny}, view, }; use leptos_router::{NavigateOptions, hooks::use_navigate}; use crate::{ api::{can_be_provisioned_wrapped, is_logged_in_wrapped}, components::async_fetch::{AsyncFetch, AsyncResource}, }; #[component] pub fn LoginWall( back: impl Fn() -> String + Send + Sync + 'static, children: Children, ) -> impl IntoView { view! { { AsyncFetch! { @map_error_in_producer from_resource = AsyncResource!( () -> Result<(bool, bool), Error> { Ok((can_be_provisioned_wrapped().await?, is_logged_in_wrapped().await?)) } ), producer = |(can_be_provisioned, is_logged_in)| { if is_logged_in { children() } else if can_be_provisioned { use_navigate()(format!("/provision/?back={}", back()).as_str(), NavigateOptions::default()); ().into_any() } else { use_navigate()(format!("/login/?back={}", back()).as_str(), NavigateOptions::default()); ().into_any() } } } } } }