From 9baa7f290ae47783d6f056adf97c53b6bf72ac00 Mon Sep 17 00:00:00 2001 From: Adrien Date: Sun, 9 Jun 2024 09:43:46 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=84=20Open/close=20ChatPanel=20on=20cl?= =?UTF-8?q?ick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/components/conversations.rs | 7 +++ src/ui/layouts/conversations.rs | 70 +++++++++++++++++++----------- src/ui/store/mod.rs | 12 +++++ 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/src/ui/components/conversations.rs b/src/ui/components/conversations.rs index 597c2fe..0cc0029 100644 --- a/src/ui/components/conversations.rs +++ b/src/ui/components/conversations.rs @@ -306,6 +306,9 @@ pub fn Space(id: SpaceId) -> Element { let on_selected_conversation = move |room_id: RoomId| { trace!(""); + + STORE.write().on_selected_room(room_id.clone()); + selected_room_id.set(Some(room_id)); }; @@ -380,6 +383,10 @@ pub fn HomeSpace() -> Element { }); let on_selected_conversation = move |room_id: RoomId| { + trace!(""); + + STORE.write().on_selected_room(room_id.clone()); + selected_room_id.set(Some(room_id)); }; diff --git a/src/ui/layouts/conversations.rs b/src/ui/layouts/conversations.rs index 5741189..0c6fbf3 100644 --- a/src/ui/layouts/conversations.rs +++ b/src/ui/layouts/conversations.rs @@ -2,10 +2,14 @@ use std::rc::Rc; use dioxus::prelude::*; use futures::join; +use tracing::{error, warn}; -use crate::ui::components::{ - chat_panel::ChatPanel, conversations::Conversations as ConversationsComponent, - wallpaper::Wallpaper, +use crate::ui::{ + components::{ + chat_panel::ChatPanel, conversations::Conversations as ConversationsComponent, + wallpaper::Wallpaper, + }, + STORE, }; turf::style_sheet!("src/ui/layouts/conversations.scss"); @@ -47,36 +51,50 @@ async fn on_carousel_scroll( } fn LayoutSmall() -> Element { - let mut carousel_div = use_signal(|| None::>); let mut first_div = use_signal(|| None::>); let mut last_div = use_signal(|| None::>); + let mut carousel_div = use_signal(|| None::>); - let conversation_panels_nb = 3; - let conversation_panels = (0..conversation_panels_nb + 1).map(|i| { - let inner = rsx! { - div { - class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL_INNER, - ChatPanel { name: format!("CHAT #{i}") }, - } - }; + let displayed_room_ids = STORE.read().displayed_room_ids(); - if i == conversation_panels_nb { - rsx! { - div { - class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL, - onmounted: move |cx: Event| last_div.set(Some(cx.data())), - {inner} + let mut conversation_panels = Vec::new(); + let mut displayed_room_ids_it = displayed_room_ids.iter().peekable(); + while let Some(room_id) = displayed_room_ids_it.next() { + if let Some(room) = STORE.read().rooms().get(room_id) { + let room = room.signal(); + let room_name_repr = room.name().unwrap_or(room.id().to_string()); + let inner = rsx! { + div { + class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL_INNER, + ChatPanel { name: format!("CHAT {room_name_repr}") }, + } + }; + + // If this is the last iteration + let panel = if displayed_room_ids_it.peek().is_none() { + rsx! { + div { + class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL, + onmounted: move |cx: Event| last_div.set(Some(cx.data())), + {inner} + } } + } else { + rsx! { + div { + class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL, + {inner} + } + } + }; + + if let Some(panel) = panel { + conversation_panels.push(panel); } } else { - rsx! { - div { - class: ClassName::CONVERSATIONS_VIEW_SMALL_PANEL, - {inner} - } - } + warn!("No {} room found", room_id); } - }); + } rsx! { style { {STYLE_SHEET} }, @@ -119,7 +137,7 @@ fn LayoutSmall() -> Element { }, }, - {conversation_panels} + {conversation_panels.iter()} div { class: ClassName::CONVERSATIONS_VIEW_TAIL, diff --git a/src/ui/store/mod.rs b/src/ui/store/mod.rs index 208ae74..c929257 100644 --- a/src/ui/store/mod.rs +++ b/src/ui/store/mod.rs @@ -1,6 +1,7 @@ pub(crate) mod room; pub(crate) mod space; +use std::collections::HashSet; use std::{collections::HashMap, rc::Rc}; use async_trait::async_trait; @@ -21,6 +22,17 @@ use space::Space; pub struct Store { rooms: HashMap>, spaces: HashMap>, + + displayed_room_ids: HashSet, +} + +impl Store { + pub fn on_selected_room(&mut self, room_id: RoomId) { + // Toggle the room_id selection + if !self.displayed_room_ids.write().remove(&room_id) { + self.displayed_room_ids.write().insert(room_id); + } + } } #[async_trait(?Send)]