summary refs log tree commit diff stats
path: root/src/components/login_wall.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/login_wall.rs')
-rw-r--r--src/components/login_wall.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/components/login_wall.rs b/src/components/login_wall.rs
new file mode 100644
index 0000000..fd5c64f
--- /dev/null
+++ b/src/components/login_wall.rs
@@ -0,0 +1,42 @@
+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()
+                    }
+                }
+            }
+        }
+    }
+}