summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-10 22:58:26 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-10 22:58:26 +0100
commit089005c8d2f94d5ca42366fdd82cb4429fcc2dfa (patch)
tree1639a5ebb6dd77821f579fd7284aaed7a0d327e1 /src
parentba82a162009ebf72fa67bc43f54b8f4d17563316 (diff)
downloadmacaw-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.rs68
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>
}