diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/sidebar.rs | 68 |
1 files changed, 37 insertions, 31 deletions
diff --git a/src/components/sidebar.rs b/src/components/sidebar.rs index ca753ef..487fb76 100644 --- a/src/components/sidebar.rs +++ b/src/components/sidebar.rs @@ -1,7 +1,8 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use jid::BareJID; use leptos::prelude::*; +use reactive_stores::Store; use crate::components::{ personal_status::PersonalStatus, @@ -9,12 +10,18 @@ use crate::components::{ roster_list::RosterList, }; -#[derive(PartialEq, Eq, Clone, Copy)] +#[derive(PartialEq, Eq, Clone, Copy, Hash)] pub enum SidebarOpen { Roster, Chats, } +#[derive(Store)] +pub struct Drawer { + open: SidebarOpen, + hovering: bool, +} + pub enum Open { /// Currently on screen Focused, @@ -68,8 +75,22 @@ pub fn Sidebar() -> impl IntoView { // 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 (hovered, set_hovered) = signal(None::<SidebarOpen>); + let hovered = Memo::new(move |_| hovered.get()); let (just_closed, set_just_closed) = signal(false); + let just_closed = Memo::new(move |_| just_closed.get()); + + let pages = Memo::new(move |_| { + let mut pages = HashSet::new(); + if let Some(hovered) = *hovered.read() { + pages.insert(hovered); + } + if let Some(opened) = *open.read() { + pages.insert(opened); + } + pages + }); view! { <div class="sidebar" on:mouseleave=move |_| { @@ -129,46 +150,31 @@ pub fn Sidebar() -> impl IntoView { <PersonalStatus /> </div> </div> - {move || if let Some(hovered) = *hovered.read() { - if Some(hovered) != *open.read() { - if !just_closed.get() { - match hovered { + {move || { + 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 sidebar-hovering-drawer"> + <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 sidebar-hovering-drawer"> + <div class:sidebar-drawer=true class:sidebar-hovering-drawer=move || { + !(*open.read() == Some(SidebarOpen::Chats)) && (*hovered.read() == Some(SidebarOpen::Chats)) + }> <ChatsList /> </div> }.into_any(), - } - } else { - - view! {}.into_any() - } + }} + </For> + }.into_any() } else { view! {}.into_any() } - } else { - view! {}.into_any() - }} - {move || if let Some(opened) = *open.read() { - match opened { - SidebarOpen::Roster => view! { - <div class="sidebar-drawer"> - <RosterList /> - </div> - }.into_any(), - SidebarOpen::Chats => view! { - <div class="sidebar-drawer"> - <ChatsList /> - </div> - }.into_any(), - } - } else { - view! {}.into_any() }} </div> } |