From 838e99fd1577c52121e148efabcd624114a8b9ad Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Wed, 11 Jun 2025 02:54:27 +0100 Subject: fmt: everything --- src/components/avatar.rs | 56 ++++-- src/components/chat_header.rs | 8 +- src/components/chats_list.rs | 33 ++- src/components/chats_list/chats_list_item.rs | 48 +++-- src/components/icon.rs | 11 +- src/components/message.rs | 46 ++++- src/components/message_composer.rs | 24 +-- src/components/message_history_buffer.rs | 67 +++---- src/components/mod.rs | 16 +- src/components/modal.rs | 19 +- src/components/new_chat.rs | 23 ++- src/components/overlay.rs | 12 +- src/components/personal_status.rs | 216 +++++++++++++------- src/components/roster_list.rs | 29 ++- .../roster_list/contact_request_manager.rs | 221 +++++++++++++-------- src/components/roster_list/roster_list_item.rs | 48 +++-- src/components/sidebar.rs | 157 ++++++++------- 17 files changed, 646 insertions(+), 388 deletions(-) (limited to 'src/components') diff --git a/src/components/avatar.rs b/src/components/avatar.rs index 292173e..7ab7544 100644 --- a/src/components/avatar.rs +++ b/src/components/avatar.rs @@ -2,34 +2,48 @@ use filamento::{presence::PresenceType, user::User}; use leptos::prelude::*; use reactive_stores::Store; -use crate::{components::icon::{show_to_icon, IconComponent}, icon::Icon, user::{get_avatar, MacawUser}, user_presences::UserPresences}; +use crate::{ + components::icon::{IconComponent, show_to_icon}, + icon::Icon, + user::{MacawUser, get_avatar}, + user_presences::UserPresences, +}; #[component] pub fn AvatarWithPresence(user: MacawUser) -> impl IntoView { let user_presences: Store = use_context().expect("no user presences in context"); - let presence = move || user_presences.write().get_user_presences(&user.get().read().jid).read().presence(); - let show_icon = move || presence().map(|(_, presence)| { - match presence.presence { - PresenceType::Online(online) => if let Some(show) = online.show { - Some(show_to_icon(show)) - } else { - Some(Icon::Available16Color) - }, - PresenceType::Offline(offline) => None, - } - }).unwrap_or_default(); + let presence = move || { + user_presences + .write() + .get_user_presences(&user.get().read().jid) + .read() + .presence() + }; + let show_icon = move || { + presence() + .map(|(_, presence)| match presence.presence { + PresenceType::Online(online) => { + if let Some(show) = online.show { + Some(show_to_icon(show)) + } else { + Some(Icon::Available16Color) + } + } + PresenceType::Offline(offline) => None, + }) + .unwrap_or_default() + }; view! {
- - {move || if let Some(icon) = show_icon() { - view!{ - - }.into_any() - } else { - view! {}.into_any() - }} + + {move || { + if let Some(icon) = show_icon() { + view! { }.into_any() + } else { + view! {}.into_any() + } + }}
} } - diff --git a/src/components/chat_header.rs b/src/components/chat_header.rs index fe4e8d9..47367dc 100644 --- a/src/components/chat_header.rs +++ b/src/components/chat_header.rs @@ -12,15 +12,11 @@ pub fn ChatViewHeader(chat: MacawChat) -> impl IntoView { view! {
{move || { - view! { - - } - }} - } } - diff --git a/src/components/chats_list.rs b/src/components/chats_list.rs index f958ebe..43ee53e 100644 --- a/src/components/chats_list.rs +++ b/src/components/chats_list.rs @@ -4,7 +4,14 @@ use jid::BareJID; use leptos::prelude::*; 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; @@ -22,11 +29,13 @@ pub fn ChatsList() -> impl IntoView { Ok(c) => { let mut chats = IndexMap::new(); for ((chat, chat_user), (message, message_user)) in c { - chats.insert(chat.correspondent.clone(), ( + chats.insert( + chat.correspondent.clone(), + ( ArcMacawChat::got_chat_and_user(chat, chat_user).await, ArcMacawMessage::got_message_and_user(message, message_user).await, - - )); + ), + ); } set_chats.set(chats); } @@ -51,7 +60,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 { @@ -79,15 +91,19 @@ pub fn ChatsList() -> impl IntoView { // TODO: update icon, tooltip on hover.

Chats

-
- +
+ {move || { if *open_new_chat.read() { view! { - }.into_any() + } + .into_any() } else { view! {}.into_any() } @@ -102,4 +118,3 @@ pub fn ChatsList() -> impl IntoView {
} } - diff --git a/src/components/chats_list/chats_list_item.rs b/src/components/chats_list/chats_list_item.rs index ae01288..e61bf45 100644 --- a/src/components/chats_list/chats_list_item.rs +++ b/src/components/chats_list/chats_list_item.rs @@ -1,12 +1,21 @@ use std::ops::Deref; use chrono::Local; -use filamento::{chat::{Chat, ChatStoreFields, Message, MessageStoreFields}, user::User}; +use filamento::{ + chat::{Chat, ChatStoreFields, Message, MessageStoreFields}, + user::User, +}; use leptos::prelude::*; use reactive_stores::{ArcStore, Store}; use tracing::debug; -use crate::{chat::MacawChat, components::{avatar::AvatarWithPresence, sidebar::Open}, message::MacawMessage, open_chats::{OpenChatsPanel, OpenChatsPanelStoreFields}, user::get_name}; +use crate::{ + chat::MacawChat, + components::{avatar::AvatarWithPresence, sidebar::Open}, + message::MacawMessage, + open_chats::{OpenChatsPanel, OpenChatsPanelStoreFields}, + user::get_name, +}; #[component] pub fn ChatsListItem(chat: MacawChat, message: MacawMessage) -> impl IntoView { @@ -44,23 +53,36 @@ pub fn ChatsListItem(chat: MacawChat, message: MacawMessage) -> impl IntoView { let date = move || message.get().timestamp().read().naive_local(); let now = move || Local::now().naive_local(); - let timeinfo = move || if date().date() == now().date() { - // TODO: localisation/config - date().time().format("%H:%M").to_string() - } else { - date().date().format("%d/%m").to_string() + let timeinfo = move || { + if date().date() == now().date() { + // TODO: localisation/config + date().time().format("%H:%M").to_string() + } else { + date().date().format("%d/%m").to_string() + } }; view! { -
+
{move || { - view! { - - } + view! { } }}
-

{name}

{timeinfo}

-

{latest_message_body}

+
+

{name}

+

{timeinfo}

+
+
+

{latest_message_body}

+

+ +

+
} diff --git a/src/components/icon.rs b/src/components/icon.rs index 7eaa52f..307d367 100644 --- a/src/components/icon.rs +++ b/src/components/icon.rs @@ -1,5 +1,5 @@ -use leptos::prelude::*; use filamento::{chat::Delivery, presence::Show}; +use leptos::prelude::*; use crate::icon::Icon; @@ -7,7 +7,12 @@ use crate::icon::Icon; #[component] pub fn IconComponent(icon: Icon) -> impl IntoView { view! { - + } } @@ -53,5 +58,3 @@ pub fn Delivery(delivery: Delivery) -> impl IntoView { } } } - - diff --git a/src/components/message.rs b/src/components/message.rs index 78ebeb6..9eb0b09 100644 --- a/src/components/message.rs +++ b/src/components/message.rs @@ -2,7 +2,10 @@ use filamento::chat::MessageStoreFields; use leptos::prelude::*; use reactive_stores::{ArcStore, Store}; -use crate::{message::MacawMessage, user::{get_avatar, get_name, NO_AVATAR}}; +use crate::{ + message::MacawMessage, + user::{NO_AVATAR, get_avatar, get_name}, +}; use super::icon::Delivery; @@ -16,33 +19,54 @@ pub fn Message(message: MacawMessage, major: bool, r#final: bool) -> impl IntoVi if major { view! {
-
- } > +
+ }> -
+
{name}
-
{move || message.get().timestamp().read().format("%H:%M").to_string()}
+
+ {move || message.get().timestamp().read().format("%H:%M").to_string()} +
{move || message.get().body().read().body.clone()}
-
{move || message.get().delivery().get().map(|delivery| view! { } ) }
+
+ {move || { + message + .get() + .delivery() + .get() + .map(|delivery| view! { }) + }} +
- }.into_any() + } + .into_any() } else { view! {
{move || message.get().timestamp().read().format("%H:%M").to_string()}
-
{move || message.get().body().read().body.clone()}
-
{move || message.get().delivery().get().map(|delivery| view! { } ) }
+
+ {move || message.get().body().read().body.clone()} +
+
+ {move || { + message + .get() + .delivery() + .get() + .map(|delivery| view! { }) + }} +
- }.into_any() + } + .into_any() } } - diff --git a/src/components/message_composer.rs b/src/components/message_composer.rs index 3876a5a..09e5f80 100644 --- a/src/components/message_composer.rs +++ b/src/components/message_composer.rs @@ -62,36 +62,34 @@ pub fn ChatViewMessageComposer(chat: BareJID) -> impl IntoView { // TODO: placeholder view! { -
+
set_shift_pressed.set(true), - 13 => if !shift_pressed.get() { - ev.prevent_default(); - send_message(); + 13 => { + if !shift_pressed.get() { + ev.prevent_default(); + send_message(); + } } _ => {} - // debug!("shift pressed down"); } } on:keyup=move |ev| { - match ev.key_code() { + match ev.key_code() { 16 => set_shift_pressed.set(false), _ => {} - // debug!("shift released"); } } >
- // + //
} } - - diff --git a/src/components/message_history_buffer.rs b/src/components/message_history_buffer.rs index dc93054..cf4c328 100644 --- a/src/components/message_history_buffer.rs +++ b/src/components/message_history_buffer.rs @@ -1,5 +1,8 @@ use chrono::{NaiveDateTime, TimeDelta}; -use filamento::{chat::{Chat, ChatStoreFields, MessageStoreFields}, user::User}; +use filamento::{ + chat::{Chat, ChatStoreFields, MessageStoreFields}, + user::User, +}; use indexmap::IndexMap; use jid::BareJID; use leptos::prelude::*; @@ -7,7 +10,13 @@ use reactive_stores::{ArcStore, Store}; use tracing::{debug, error}; use uuid::Uuid; -use crate::{chat::MacawChat, client::Client, components::message::Message, message::{ArcMacawMessage, MacawMessage}, message_subscriptions::MessageSubscriptions}; +use crate::{ + chat::MacawChat, + client::Client, + components::message::Message, + message::{ArcMacawMessage, MacawMessage}, + message_subscriptions::MessageSubscriptions, +}; #[component] pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { @@ -26,7 +35,10 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { Ok(m) => { let mut messages = IndexMap::new(); for (message, message_user) in m { - messages.insert(message.id, ArcMacawMessage::got_message_and_user(message, message_user).await); + messages.insert( + message.id, + ArcMacawMessage::got_message_and_user(message, message_user).await, + ); } load_set_messages.set(messages); } @@ -54,30 +66,16 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { debug!("got new message in let message buffer"); let mut messages = load_new_messages_set.write(); if let Some((_, last)) = messages.last() { - if *last.get() - .timestamp() - .read() - < *new_message.get() - .timestamp() - .read() - { - messages.insert( - new_message.get() - .id() - .get(), - new_message, - ); + if *last.get().timestamp().read() < *new_message.get().timestamp().read() { + messages.insert(new_message.get().id().get(), new_message); debug!("set the new message in message buffer"); } else { let index = match messages.binary_search_by(|_, value| { - value.get() + value + .get() .timestamp() .read() - .cmp( - &new_message.get() - .timestamp() - .read(), - ) + .cmp(&new_message.get().timestamp().read()) }) { Ok(i) => i, Err(i) => i, @@ -85,21 +83,13 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { messages.insert_before( // TODO: check if this logic is correct index, - - new_message.get() - .id() - .get(), + new_message.get().id().get(), new_message, ); debug!("set the new message in message buffer"); } } else { - messages.insert( - new_message.get() - .id() - .get(), - new_message, - ); + messages.insert(new_message.get().id().get(), new_message); debug!("set the new message in message buffer"); } } @@ -120,11 +110,7 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { .get() .into_iter() .map(|(id, message)| { - let message_timestamp = - message.message.get() - .timestamp() - .read() - .naive_local(); + let message_timestamp = message.message.get().timestamp().read().naive_local(); // TODO: mark new day // if message_timestamp.date() > last_timestamp.date() { // messages_view = messages_view.push(date(message_timestamp.date())); @@ -136,11 +122,7 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { } else { false }; - last_user = Some( - message.get() - .from() - .get(), - ); + last_user = Some(message.get().from().get()); last_timestamp = message_timestamp; (id, (message, major, false)) }) @@ -159,4 +141,3 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView {
} } - diff --git a/src/components/mod.rs b/src/components/mod.rs index 879f99e..0e2ffce 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,13 +1,13 @@ -pub mod sidebar; -mod chats_list; -mod new_chat; -mod roster_list; mod avatar; +pub mod chat_header; +mod chats_list; +pub mod icon; mod message; -pub mod message_history_buffer; pub mod message_composer; -pub mod chat_header; -mod overlay; +pub mod message_history_buffer; pub mod modal; -pub mod icon; +mod new_chat; +mod overlay; mod personal_status; +mod roster_list; +pub mod sidebar; diff --git a/src/components/modal.rs b/src/components/modal.rs index 62e1fac..f0fd68a 100644 --- a/src/components/modal.rs +++ b/src/components/modal.rs @@ -1,16 +1,21 @@ -use leptos::prelude::*; use leptos::ev::MouseEvent; +use leptos::prelude::*; #[component] -pub fn Modal(on_background_click: impl Fn(MouseEvent) + 'static, children: Children) -> impl IntoView { +pub fn Modal( + on_background_click: impl Fn(MouseEvent) + 'static, + children: Children, +) -> impl IntoView { view! { - } } - diff --git a/src/components/new_chat.rs b/src/components/new_chat.rs index 2f9b943..3e7a261 100644 --- a/src/components/new_chat.rs +++ b/src/components/new_chat.rs @@ -1,12 +1,22 @@ use std::str::FromStr; -use filamento::{chat::Chat, error::{CommandError, DatabaseError}, user::User}; +use filamento::{ + chat::Chat, + error::{CommandError, DatabaseError}, + user::User, +}; use jid::{BareJID, JID}; use leptos::{html::Input, prelude::*}; use reactive_stores::{ArcStore, Store}; use thiserror::Error; -use crate::{chat::{ArcMacawChat, MacawChat}, client::Client, open_chats::OpenChatsPanel, state_store::StateStore, user::{fetch_avatar, ArcMacawUser, MacawUser}}; +use crate::{ + chat::{ArcMacawChat, MacawChat}, + client::Client, + open_chats::OpenChatsPanel, + state_store::StateStore, + user::{ArcMacawUser, MacawUser, fetch_avatar}, +}; #[derive(Clone, Debug, Error)] pub enum NewChatError { @@ -34,7 +44,7 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { }) }; let (new_chat_pending, set_new_chat_pending) = signal(false); - + let open_chats: Store = use_context().expect("no open chats panel store in context"); let client = use_context::().expect("client not in context"); @@ -72,7 +82,7 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { set_error.set(Some(e.into())); set_new_chat_pending.set(false); return; - }, + } }; let chat = { @@ -80,7 +90,9 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { // let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); let old_user = user_state_store.get_listener(user.jid.clone()); let user = if let Some(old_user) = old_user { - old_user.update(|(old_user, _avatar)| { old_user.set(user); }); + old_user.update(|(old_user, _avatar)| { + old_user.set(user); + }); old_user } else { let avatar = fetch_avatar(user.avatar.as_deref()).await; @@ -129,4 +141,3 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView {
} } - diff --git a/src/components/overlay.rs b/src/components/overlay.rs index d4ff1bf..396e885 100644 --- a/src/components/overlay.rs +++ b/src/components/overlay.rs @@ -5,12 +5,14 @@ use tracing::debug; pub fn Overlay(set_open: WriteSignal, children: Children) -> impl IntoView { view! {
-
+
{children()}
} } - diff --git a/src/components/personal_status.rs b/src/components/personal_status.rs index eb7f6e1..59ffa47 100644 --- a/src/components/personal_status.rs +++ b/src/components/personal_status.rs @@ -1,39 +1,57 @@ -use filamento::{presence::{Offline, Online, PresenceType, Show}, user::{User, UserStoreFields}}; +use filamento::{ + presence::{Offline, Online, PresenceType, Show}, + user::{User, UserStoreFields}, +}; use leptos::{html, prelude::*}; use reactive_stores::{ArcStore, Store}; use tracing::{debug, error}; -use crate::{client::Client, components::{avatar::AvatarWithPresence, overlay::Overlay}, user::{get_name, MacawUser}, user_presences::UserPresences, views::{macaw::settings::SettingsPage, AppState}}; +use crate::{ + client::Client, + components::{avatar::AvatarWithPresence, overlay::Overlay}, + user::{MacawUser, get_name}, + user_presences::UserPresences, + views::{AppState, macaw::settings::SettingsPage}, +}; #[component] pub fn PersonalStatus() -> impl IntoView { let user: LocalResource = use_context().expect("no local user in context"); let (open, set_open) = signal(false); - move || if let Some(user) = user.get() { - view! { -
- -
-
- {move || { - let open = open.get(); - debug!("open = {:?}", open); - if open { - view! { - - - - }.into_any() - } else { - view! {}.into_any() - }}} - }.into_any() - } else { - view! {}.into_any() + move || { + if let Some(user) = user.get() { + view! { +
+ +
+
+ {move || { + let open = open.get(); + debug!("open = {:?}", open); + if open { + view! { + + + + } + .into_any() + } else { + view! {}.into_any() + } + }} + } + .into_any() + } else { + view! {}.into_any() + } } } @@ -42,24 +60,30 @@ pub fn PersonalStatusMenu(user: MacawUser, set_open: WriteSignal) -> impl let set_app: WriteSignal = use_context().unwrap(); let show_settings: RwSignal> = use_context().unwrap(); let user_presences: Store = use_context().expect("no user presence store"); - + let client = use_context::().expect("client not in context"); let client1 = client.clone(); let (show_value, set_show_value) = signal({ - let show = match user_presences.write().get_user_presences(&user.get().jid().read()).write().resource_presence(client.resource.read().clone().unwrap_or_default()).presence { - PresenceType::Online(online) => match online.show { - Some(s) => match s { - Show::Away => 3, - Show::Chat => 0, - Show::DoNotDisturb => 2, - Show::ExtendedAway => 4, + let show = match user_presences + .write() + .get_user_presences(&user.get().jid().read()) + .write() + .resource_presence(client.resource.read().clone().unwrap_or_default()) + .presence + { + PresenceType::Online(online) => match online.show { + Some(s) => match s { + Show::Away => 3, + Show::Chat => 0, + Show::DoNotDisturb => 2, + Show::ExtendedAway => 4, + }, + None => 1, }, - None => 1, - }, - PresenceType::Offline(_offline) => 5, - }; - debug!("initial show = {show}"); - show + PresenceType::Offline(_offline) => 5, + }; + debug!("initial show = {show}"); + show }); let show_select: NodeRef = NodeRef::new(); @@ -71,7 +95,7 @@ pub fn PersonalStatusMenu(user: MacawUser, set_open: WriteSignal) -> impl } }); let set_status = Action::new_local(move |show_value: &i32| { - let show_value = show_value.to_owned(); + let show_value = show_value.to_owned(); let client = client1.clone(); async move { if let Err(e) = match show_value { @@ -79,46 +103,71 @@ pub fn PersonalStatusMenu(user: MacawUser, set_open: WriteSignal) -> impl if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; - client.set_status(Online { show: Some(Show::Chat), ..Default::default() }).await - }, + client + .set_status(Online { + show: Some(Show::Chat), + ..Default::default() + }) + .await + } 1 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; - client.set_status(Online { show: None, ..Default::default() }).await - }, + client + .set_status(Online { + show: None, + ..Default::default() + }) + .await + } 2 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; - client.set_status(Online { show: Some(Show::DoNotDisturb), ..Default::default() }).await - }, + client + .set_status(Online { + show: Some(Show::DoNotDisturb), + ..Default::default() + }) + .await + } 3 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; - client.set_status(Online { show: Some(Show::Away), ..Default::default() }).await - }, + client + .set_status(Online { + show: Some(Show::Away), + ..Default::default() + }) + .await + } 4 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; - client.set_status(Online { show: Some(Show::ExtendedAway), ..Default::default() }).await - }, + client + .set_status(Online { + show: Some(Show::ExtendedAway), + ..Default::default() + }) + .await + } 5 => { if let Ok(_) = client.disconnect(Offline::default()).await { client.resource.set(None) } set_show_value.set(5); - return + return; } _ => { error!("invalid availability select"); - return + return; } } { error!("show set error: {e}"); - return + return; } set_show_value.set(show_value); } @@ -142,36 +191,55 @@ pub fn PersonalStatusMenu(user: MacawUser, set_open: WriteSignal) -> impl } prop:show_value=move || show_value.get().to_string() > - - - - - - + + + + + +

-