summaryrefslogtreecommitdiffstats
path: root/src/components/chats_list.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/chats_list.rs')
-rw-r--r--src/components/chats_list.rs93
1 files changed, 70 insertions, 23 deletions
diff --git a/src/components/chats_list.rs b/src/components/chats_list.rs
index a5ecc9b..73ffdff 100644
--- a/src/components/chats_list.rs
+++ b/src/components/chats_list.rs
@@ -1,10 +1,23 @@
+// SPDX-FileCopyrightText: 2025 cel <cel@bunny.garden>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
use chats_list_item::ChatsListItem;
use indexmap::IndexMap;
use jid::BareJID;
-use leptos::prelude::*;
+use js_sys::{wasm_bindgen::UnwrapThrowExt, Object, Reflect, JSON};
+use leptos::{html::Div, prelude::*};
+use overlay_scrollbars::OverlayScrollbars;
use tracing::debug;
-use crate::{chat::{ArcMacawChat, MacawChat}, client::Client, components::{icon::IconComponent, new_chat::NewChatWidget, overlay::Overlay}, icon::Icon, message::{ArcMacawMessage, MacawMessage}, message_subscriptions::MessageSubscriptions};
+use crate::{
+ chat::{ArcMacawChat, MacawChat},
+ client::Client,
+ components::{icon::IconComponent, new_chat::NewChatWidget, overlay::Overlay},
+ icon::Icon,
+ message::{ArcMacawMessage, MacawMessage},
+ message_subscriptions::MessageSubscriptions,
+};
mod chats_list_item;
@@ -20,18 +33,16 @@ pub fn ChatsList() -> impl IntoView {
.map_err(|e| e.to_string());
match chats {
Ok(c) => {
- let chats = c
- .into_iter()
- .map(|((chat, chat_user), (message, message_user))| {
+ let mut chats = IndexMap::new();
+ for ((chat, chat_user), (message, message_user)) in c {
+ chats.insert(
+ chat.correspondent.clone(),
(
- chat.correspondent.clone(),
- (
- ArcMacawChat::got_chat_and_user(chat, chat_user),
- ArcMacawMessage::got_message_and_user(message, message_user),
- ),
- )
- })
- .collect::<IndexMap<BareJID, _>>();
+ ArcMacawChat::got_chat_and_user(chat, chat_user).await,
+ ArcMacawMessage::got_message_and_user(message, message_user).await,
+ ),
+ );
+ }
set_chats.set(chats);
}
Err(_) => {
@@ -55,7 +66,10 @@ pub fn ChatsList() -> impl IntoView {
if let Some((chat, _latest_message)) = chats.shift_remove(&to) {
// TODO: check if new message is actually latest message
debug!("chat existed");
- debug!("new message: {}", new_message.message.get().read().body.body);
+ debug!(
+ "new message: {}",
+ new_message.message.get().read().body.body
+ );
chats.insert_before(0, to, (chat.clone(), new_message));
debug!("done setting");
} else {
@@ -64,7 +78,7 @@ pub fn ChatsList() -> impl IntoView {
let chat = client.get_chat(to.clone()).await.unwrap();
let user = client.get_user(to.clone()).await.unwrap();
debug!("before got chat");
- let chat = ArcMacawChat::got_chat_and_user(chat, user);
+ let chat = ArcMacawChat::got_chat_and_user(chat, user).await;
debug!("after got chat");
chats.insert_before(0, to, (chat, new_message));
debug!("done setting");
@@ -78,32 +92,65 @@ pub fn ChatsList() -> impl IntoView {
}
});
+ let chats_list: NodeRef<Div> = NodeRef::new();
+ let chats_list_viewport: NodeRef<Div> = NodeRef::new();
+
+ let _scrollbars = Effect::new(move |_| {
+ if let Some(buffer) = chats_list.get() {
+ if let Some(viewport) = chats_list_viewport.get() {
+ let scrollbars_obj = Object::new();
+ // Reflect::set(&scrollbars_obj, &"theme".into(), &"os-macaw".into()).unwrap_throw();
+ // Reflect::set(&scrollbars_obj, &"autoHide".into(), &"leave".into()).unwrap_throw();
+ let options_obj = Object::new();
+ // Reflect::set(&options_obj, &"scrollbars".into(), &scrollbars_obj).unwrap_throw();
+
+ let elements_obj = Object::new();
+ Reflect::set(&elements_obj, &"viewport".into(), &viewport.into()).unwrap_throw();
+ let element_obj = Object::new();
+ Reflect::set(&elements_obj, &"elements".into(), &elements_obj).unwrap_throw();
+ Reflect::set(&element_obj, &"target".into(), &buffer.into()).unwrap_throw();
+ // let element = Object::define_property(&Object::define_property(&Object::new(), &"target".into(), &buffer.into()), &"elements".into(), &Object::define_property(&Object::new(), &"viewport".into(), &viewport.into()));
+ debug!("scrollable element: {}", JSON::stringify(&element_obj.clone().into()).unwrap_throw());
+ OverlayScrollbars(element_obj, options_obj);
+ }
+ }
+ });
+
view! {
<div class="chats-list panel">
// TODO: update icon, tooltip on hover.
<div class="header">
<h2>Chats</h2>
- <div class="new-chat header-icon" class:open=open_new_chat >
- <IconComponent icon=Icon::NewBubble24 on:click=move |_| set_open_new_chat.update(|state| *state = !*state)/>
+ <div class="new-chat header-icon" class:open=open_new_chat>
+ <IconComponent
+ icon=Icon::NewBubble24
+ on:click=move |_| set_open_new_chat.update(|state| *state = !*state)
+ />
{move || {
if *open_new_chat.read() {
view! {
<Overlay set_open=set_open_new_chat>
<NewChatWidget set_open_new_chat />
</Overlay>
- }.into_any()
+ }
+ .into_any()
} else {
view! {}.into_any()
}
}}
</div>
</div>
- <div class="chats-list-chats">
- <For each=move || chats.get() key=|chat| chat.1.1.message.get().read().id let(chat)>
- <ChatsListItem chat=chat.1.0.into() message=chat.1.1.into() />
- </For>
+ <div class="overlay-scroll" node_ref=chats_list>
+ <div class="chats-list-chats" node_ref=chats_list_viewport>
+ <For
+ each=move || chats.get()
+ key=|chat| chat.1.1.message.get().read().id
+ let(chat)
+ >
+ <ChatsListItem chat=chat.1.0.into() message=chat.1.1.into() />
+ </For>
+ </div>
</div>
</div>
}
}
-