💄 Open/close ChatPanel on click (Conversations layout/big breakpoint)
This commit is contained in:
@@ -2,7 +2,7 @@ use std::rc::Rc;
|
|||||||
|
|
||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
use futures::join;
|
use futures::join;
|
||||||
use tracing::{error, warn};
|
use tracing::warn;
|
||||||
|
|
||||||
use crate::ui::{
|
use crate::ui::{
|
||||||
components::{
|
components::{
|
||||||
@@ -151,37 +151,52 @@ fn LayoutBig() -> Element {
|
|||||||
let mut first_div = use_signal(|| None::<Rc<MountedData>>);
|
let mut first_div = use_signal(|| None::<Rc<MountedData>>);
|
||||||
let mut last_div = use_signal(|| None::<Rc<MountedData>>);
|
let mut last_div = use_signal(|| None::<Rc<MountedData>>);
|
||||||
|
|
||||||
let conversation_panels_nb = 3;
|
let displayed_room_ids = STORE.read().displayed_room_ids();
|
||||||
let conversation_panels = (0..conversation_panels_nb + 1).map(|i| {
|
|
||||||
if i == 0 {
|
let mut conversation_panels = Vec::new();
|
||||||
rsx! {
|
let mut displayed_room_ids_it = displayed_room_ids.iter().peekable();
|
||||||
div {
|
let mut is_first = true;
|
||||||
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
while let Some(room_id) = displayed_room_ids_it.next() {
|
||||||
onmounted: move |cx| async move {
|
if let Some(room) = STORE.read().rooms().get(room_id) {
|
||||||
let data = cx.data();
|
let room = room.signal();
|
||||||
let _ = data.as_ref().scroll_to(ScrollBehavior::Smooth).await;
|
let room_name_repr = format!("CHAT {}", room.name().unwrap_or(room.id().to_string()));
|
||||||
first_div.set(Some(data));
|
let panel = if is_first {
|
||||||
},
|
is_first = false;
|
||||||
ChatPanel { name: format!("CHAT #{i}") },
|
rsx! {
|
||||||
|
div {
|
||||||
|
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
||||||
|
onmounted: move |cx| async move {
|
||||||
|
let data = cx.data();
|
||||||
|
let _ = data.as_ref().scroll_to(ScrollBehavior::Smooth).await;
|
||||||
|
first_div.set(Some(data));
|
||||||
|
},
|
||||||
|
ChatPanel { name: room_name_repr },
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if displayed_room_ids_it.peek().is_none() {
|
||||||
} else if i == conversation_panels_nb {
|
rsx! {
|
||||||
rsx! {
|
div {
|
||||||
div {
|
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
||||||
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
onmounted: move |cx: Event<MountedData>| last_div.set(Some(cx.data())),
|
||||||
onmounted: move |cx: Event<MountedData>| last_div.set(Some(cx.data())),
|
ChatPanel { name: room_name_repr },
|
||||||
ChatPanel { name: format!("CHAT #{i}") },
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
rsx! {
|
||||||
|
div {
|
||||||
|
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
||||||
|
ChatPanel { name: room_name_repr },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(panel) = panel {
|
||||||
|
conversation_panels.push(panel);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rsx! {
|
warn!("No {} room found", room_id);
|
||||||
div {
|
|
||||||
class: ClassName::CONVERSATIONS_VIEW_BIG_CONVERSATION_PANELS_PANEL,
|
|
||||||
ChatPanel { name: format!("CHAT #{i}") },
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
rsx! {
|
rsx! {
|
||||||
style { {STYLE_SHEET} },
|
style { {STYLE_SHEET} },
|
||||||
@@ -219,7 +234,7 @@ fn LayoutBig() -> Element {
|
|||||||
class: ClassName::CONVERSATIONS_VIEW_HEAD,
|
class: ClassName::CONVERSATIONS_VIEW_HEAD,
|
||||||
}
|
}
|
||||||
|
|
||||||
{conversation_panels}
|
{conversation_panels.iter()}
|
||||||
|
|
||||||
div {
|
div {
|
||||||
class: ClassName::CONVERSATIONS_VIEW_TAIL,
|
class: ClassName::CONVERSATIONS_VIEW_TAIL,
|
||||||
|
Reference in New Issue
Block a user