app.rs
⎇
Raw
1use leptos::prelude::*;
2use wasm_bindgen_futures::spawn_local;
3
4use crate::api::{self, Me};
5
6#[derive(Clone, Copy, PartialEq, Debug)]
7pub enum AuthPhase {
8 Loading,
9 Setup,
10 Login,
11 Authed,
12}
13
14#[component]
15pub fn App() -> impl IntoView {
16 let (phase, set_phase) = signal(AuthPhase::Loading);
17 let (me, set_me) = signal(Option::<Me>::None);
18
19 // Initial /me probe: first boot, signed in, or needs login.
20 spawn_local(async move {
21 match api::me().await {
22 Ok(m) => {
23 let first_boot = m.first_boot;
24 set_me.set(Some(m));
25 set_phase.set(if first_boot {
26 AuthPhase::Setup
27 } else {
28 AuthPhase::Authed
29 });
30 }
31 Err(_) => set_phase.set(AuthPhase::Login),
32 }
33 });
34
35 view! {
36 {move || {
37 match phase.get() {
38 AuthPhase::Loading => view! {
39 <div class="center-screen">
40 <p class="muted">"Loading…"</p>
41 </div>
42 }
43 .into_view()
44 .into_any(),
45 AuthPhase::Setup => view! {
46 <crate::views::setup::SetupView set_me=set_me set_phase=set_phase/>
47 }
48 .into_view()
49 .into_any(),
50 AuthPhase::Login => view! {
51 <crate::views::login::LoginView set_me=set_me set_phase=set_phase/>
52 }
53 .into_view()
54 .into_any(),
55 AuthPhase::Authed => view! {
56 <crate::views::shell::ShellView me=me set_me=set_me set_phase=set_phase/>
57 }
58 .into_view()
59 .into_any(),
60 }
61 }}
62 }
63}
64