From 0d8855bee79cc493f40b5092434bce724a3adb55 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Thu, 8 May 2025 03:31:04 +0100 Subject: feat/fix: highlight open chat in chats list, clear message composer on new chat opened --- src/lib.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index f16e4da..a6dd648 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -169,7 +169,7 @@ fn LoginPage(set_app: WriteSignal, set_client: RwSignal
- +

Macaw Instant Messenger

{error_message} @@ -464,11 +464,32 @@ fn Macaw( }); view! { + } } +#[component] +pub fn Dock() -> impl IntoView { + view! { +
+
+
+ +
+
+ +
+
+
+
+
+
+
+ } +} + #[component] pub fn OpenChatsPanelView() -> impl IntoView { let open_chats: Store = use_context().expect("no open chats panel in context"); @@ -805,6 +826,8 @@ pub fn ChatViewMessageComposer(chat: JID) -> impl IntoView { let _focus = Effect::new(move |_| { if let Some(input) = message_input.get() { let _ = input.focus(); + // TODO: set the last draft + input.set_text_content(Some("")); // input.style("height: 0"); // let height = input.scroll_height(); // input.style(format!("height: {}px", height)); @@ -1258,8 +1281,36 @@ pub fn get_name(user: Store) -> String { } } +pub enum Open { + /// Currently on screen + Focused, + /// Open in background somewhere (e.g. in another chat tab) + Open, + /// Closed + Closed, +} + +impl Open { + pub fn is_focused(&self) -> bool { + match self { + Open::Focused => true, + Open::Open => false, + Open::Closed => false, + } + } + + pub fn is_open(&self) -> bool { + match self { + Open::Focused => true, + Open::Open => true, + Open::Closed => false, + } + } +} + #[component] fn ChatsListItem(chat: MacawChat, message: MacawMessage) -> impl IntoView { + let chat_chat: Store = as Clone>::clone(&chat.chat).into(); let chat_user: Store = as Clone>::clone(&chat.user).into(); let avatar = LocalResource::new(move || get_avatar(chat_user)); let name = move || get_name(chat_user); @@ -1273,8 +1324,23 @@ fn ChatsListItem(chat: MacawChat, message: MacawMessage) -> impl IntoView { open_chats.update(|open_chats| open_chats.open(chat.clone())); }; + let open =move || { + if let Some(open_chat) = &*open_chats.chat_view().read() { + debug!("got open chat: {:?}", open_chat); + if *open_chat == *chat_chat.correspondent().read() { + return Open::Focused + } + } + if let Some(_backgrounded_chat) = open_chats.chats().read().get(chat_chat.correspondent().read().deref()) { + return Open::Open + } + Open::Closed + }; + let focused =move || open().is_focused(); + let open=move || open().is_open(); + view! { -
+
} > -- cgit