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;
8use crate::views::shares::SharesPanel;
9
10#[component]
11pub fn ShellView(
12 me: ReadSignal<Option<Me>>,
13 set_me: WriteSignal<Option<Me>>,
14 set_phase: WriteSignal<crate::app::AuthPhase>,
15 loc: ReadSignal<Location>,
16) -> impl IntoView {
17 let toast = provide_toast();
18 let (show_shares, set_show_shares) = signal(false);
19
20 let on_logout = move |_| {
21 spawn_local(async move {
22 let _ = api::logout().await;
23 set_me.set(None);
24 set_phase.set(crate::app::AuthPhase::Login);
25 });
26 };
27
28 view! {
29 <div class="layout">
30 <header class="topbar">
31 <div class="brand">"📂 filebrowser-ng"</div>
32 <div class="topbar-right">
33 {move || {
34 let Some(m) = me.get() else {
35 return None;
36 };
37 let u = m.user?;
38 let is_admin = u.is_admin;
39 Some(
40 view! {
41 <span class="user-badge">
42 {u.name}
43 <Show when=move || is_admin>
44 <span class="badge">"admin"</span>
45 </Show>
46 </span>
47 }
48 .into_view()
49 .into_any(),
50 )
51 }}
52 <button class="btn" on:click=move |_| set_show_shares.set(true)>"Shares"</button>
53 <button class="btn" on:click=on_logout>"Log out"</button>
54 </div>
55 </header>
56 <main class="content">
57 <Browser me=me loc=loc/>
58 </main>
59 {move || if show_shares.get() {
60 view! {
61 <SharesPanel close=Callback::new(move |_| set_show_shares.set(false))/>
62 }
63 .into_view()
64 .into_any()
65 } else {
66 view! {}.into_any()
67 }}
68 <ToastView toast=toast/>
69 </div>
70 }
71}
72