shell.rs
⎇
Raw
1use leptos::prelude::*;
2use wasm_bindgen_futures::spawn_local;
3
4use crate::api::{self, Me};
5use crate::components::toast::{provide_toast, ToastView};
6use crate::router::Location;
7use crate::views::browser::Browser;
8
9#[component]
10pub fn ShellView(
11 me: ReadSignal<Option<Me>>,
12 set_me: WriteSignal<Option<Me>>,
13 set_phase: WriteSignal<crate::app::AuthPhase>,
14 loc: ReadSignal<Location>,
15) -> impl IntoView {
16 let toast = provide_toast();
17
18 let on_logout = move |_| {
19 spawn_local(async move {
20 let _ = api::logout().await;
21 set_me.set(None);
22 set_phase.set(crate::app::AuthPhase::Login);
23 });
24 };
25
26 view! {
27 <div class="layout">
28 <header class="topbar">
29 <div class="brand">"📂 filebrowser-ng"</div>
30 <div class="topbar-right">
31 {move || {
32 let Some(m) = me.get() else {
33 return None;
34 };
35 let u = m.user?;
36 let is_admin = u.is_admin;
37 Some(
38 view! {
39 <span class="user-badge">
40 {u.name}
41 <Show when=move || is_admin>
42 <span class="badge">"admin"</span>
43 </Show>
44 </span>
45 }
46 .into_view()
47 .into_any(),
48 )
49 }}
50 <button class="btn" on:click=on_logout>"Log out"</button>
51 </div>
52 </header>
53 <main class="content">
54 <Browser me=me loc=loc/>
55 </main>
56 <ToastView toast=toast/>
57 </div>
58 }
59}
60