From 089005c8d2f94d5ca42366fdd82cb4429fcc2dfa Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Tue, 10 Jun 2025 22:58:26 +0100 Subject: fix: hold drawer state across pinning --- src/components/sidebar.rs | 68 ++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 31 deletions(-) (limited to 'src/components') 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::); // 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::); + 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! { - {move || if let Some(hovered) = *hovered.read() { - if Some(hovered) != *open.read() { - if !just_closed.get() { - match hovered { + {move || { + if !just_closed.get() { + view! { + + {move || match page { SidebarOpen::Roster => view! { -