diff options
| author | 2025-06-10 22:58:26 +0100 | |
|---|---|---|
| committer | 2025-06-10 22:58:26 +0100 | |
| commit | 089005c8d2f94d5ca42366fdd82cb4429fcc2dfa (patch) | |
| tree | 1639a5ebb6dd77821f579fd7284aaed7a0d327e1 /src | |
| parent | ba82a162009ebf72fa67bc43f54b8f4d17563316 (diff) | |
| download | macaw-web-089005c8d2f94d5ca42366fdd82cb4429fcc2dfa.tar.gz macaw-web-089005c8d2f94d5ca42366fdd82cb4429fcc2dfa.tar.bz2 macaw-web-089005c8d2f94d5ca42366fdd82cb4429fcc2dfa.zip  | |
fix: hold drawer state across pinning
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>      }  | 
