diff options
Diffstat (limited to 'src/components/sidebar.rs')
-rw-r--r-- | src/components/sidebar.rs | 157 |
1 files changed, 90 insertions, 67 deletions
diff --git a/src/components/sidebar.rs b/src/components/sidebar.rs index 487fb76..0be31fd 100644 --- a/src/components/sidebar.rs +++ b/src/components/sidebar.rs @@ -5,9 +5,7 @@ use leptos::prelude::*; use reactive_stores::Store; use crate::components::{ - personal_status::PersonalStatus, - chats_list::ChatsList, - roster_list::RosterList, + chats_list::ChatsList, personal_status::PersonalStatus, roster_list::RosterList, }; #[derive(PartialEq, Eq, Clone, Copy, Hash)] @@ -62,20 +60,21 @@ pub fn toggle_open(state: &mut Option<SidebarOpen>, open: SidebarOpen) -> bool { } } None => { - *state = Some(open); - true - }, + *state = Some(open); + true + } } } #[component] pub fn Sidebar() -> impl IntoView { - let requests: ReadSignal<HashSet<BareJID>> = use_context().expect("no pending subscriptions in context"); + let requests: ReadSignal<HashSet<BareJID>> = + use_context().expect("no pending subscriptions in context"); // for what has been clicked open (in the background) let (open, set_open) = signal(None::<SidebarOpen>); // for what is just in the hovered state (not clicked to be pinned open yet necessarily) - let open= Memo::new(move |_| open.get()); + let open = Memo::new(move |_| open.get()); let (hovered, set_hovered) = signal(None::<SidebarOpen>); let hovered = Memo::new(move |_| hovered.get()); let (just_closed, set_just_closed) = signal(false); @@ -93,59 +92,69 @@ pub fn Sidebar() -> impl IntoView { }); view! { - <div class="sidebar" on:mouseleave=move |_| { - set_hovered.set(None); - set_just_closed.set(false); - }> + <div + class="sidebar" + on:mouseleave=move |_| { + set_hovered.set(None); + set_just_closed.set(false); + } + > <div class="dock panel"> <div class="shortcuts"> - <div class="roster-tab dock-item" class:focused=move || *open.read() == Some(SidebarOpen::Roster) class:hovering=move || *hovered.read() == Some(SidebarOpen::Roster) - on:mouseenter=move |_| { - set_just_closed.set(false); - set_hovered.set(Some(SidebarOpen::Roster)) - } - on:click=move |_| { - set_open.update(|state| { - if !toggle_open(state, SidebarOpen::Roster) { - set_just_closed.set(true); - } - }) - }> + <div + class="roster-tab dock-item" + class:focused=move || *open.read() == Some(SidebarOpen::Roster) + class:hovering=move || *hovered.read() == Some(SidebarOpen::Roster) + on:mouseenter=move |_| { + set_just_closed.set(false); + set_hovered.set(Some(SidebarOpen::Roster)) + } + on:click=move |_| { + set_open + .update(|state| { + if !toggle_open(state, SidebarOpen::Roster) { + set_just_closed.set(true); + } + }) + } + > <div class="dock-pill"></div> <div class="dock-icon"> <div class="icon-with-badge"> - <img src="/assets/caw.png" /> - {move || { - let len = requests.read().len(); - if len > 0 { - view! { - <div class="badge">{len}</div> - }.into_any() - } else { - view! {}.into_any() - } - }} + <img src="/assets/caw.png" /> + {move || { + let len = requests.read().len(); + if len > 0 { + view! { <div class="badge">{len}</div> }.into_any() + } else { + view! {}.into_any() + } + }} </div> </div> </div> - <div class="chats-tab dock-item" class:focused=move || *open.read() == Some(SidebarOpen::Chats) class:hovering=move || *hovered.read() == Some(SidebarOpen::Chats) - on:mouseenter=move |_| { - set_just_closed.set(false); - set_hovered.set(Some(SidebarOpen::Chats)) - } - on:click=move |_| { - set_open.update(|state| { - if !toggle_open(state, SidebarOpen::Chats) { - set_just_closed.set(true); - } - }) - }> + <div + class="chats-tab dock-item" + class:focused=move || *open.read() == Some(SidebarOpen::Chats) + class:hovering=move || *hovered.read() == Some(SidebarOpen::Chats) + on:mouseenter=move |_| { + set_just_closed.set(false); + set_hovered.set(Some(SidebarOpen::Chats)) + } + on:click=move |_| { + set_open + .update(|state| { + if !toggle_open(state, SidebarOpen::Chats) { + set_just_closed.set(true); + } + }) + } + > <div class="dock-pill"></div> <img src="/assets/bubble.png" /> </div> </div> - <div class="pins"> - </div> + <div class="pins"></div> <div class="personal"> <PersonalStatus /> </div> @@ -154,24 +163,39 @@ pub fn Sidebar() -> impl IntoView { if !just_closed.get() { view! { <For each=move || pages.get() key=|page| *page let(page)> - {move || match page { - SidebarOpen::Roster => view! { - <div class:sidebar-drawer=true class:sidebar-hovering-drawer=move || { - !(*open.read() == Some(SidebarOpen::Roster)) && (*hovered.read() == Some(SidebarOpen::Roster)) - }> - <RosterList /> - </div> - }.into_any(), - SidebarOpen::Chats => view! { - <div class:sidebar-drawer=true class:sidebar-hovering-drawer=move || { - !(*open.read() == Some(SidebarOpen::Chats)) && (*hovered.read() == Some(SidebarOpen::Chats)) - }> - <ChatsList /> - </div> - }.into_any(), - }} + {move || match page { + SidebarOpen::Roster => { + view! { + <div + class:sidebar-drawer=true + class:sidebar-hovering-drawer=move || { + !(*open.read() == Some(SidebarOpen::Roster)) + && (*hovered.read() == Some(SidebarOpen::Roster)) + } + > + <RosterList /> + </div> + } + .into_any() + } + SidebarOpen::Chats => { + view! { + <div + class:sidebar-drawer=true + class:sidebar-hovering-drawer=move || { + !(*open.read() == Some(SidebarOpen::Chats)) + && (*hovered.read() == Some(SidebarOpen::Chats)) + } + > + <ChatsList /> + </div> + } + .into_any() + } + }} </For> - }.into_any() + } + .into_any() } else { view! {}.into_any() } @@ -179,4 +203,3 @@ pub fn Sidebar() -> impl IntoView { </div> } } - |