diff options
author | 2025-04-11 08:32:50 +0100 | |
---|---|---|
committer | 2025-04-11 08:32:50 +0100 | |
commit | 4deb7470413a9d53323f6bedf26882ad2b0844a6 (patch) | |
tree | 2a3ca1b69a02300bbf0db40cd7e7fe410b8e938a /src/message_view.rs | |
parent | 1299841ecb5648328a590658c2ea6ad18ecf46e3 (diff) | |
download | macaw-4deb7470413a9d53323f6bedf26882ad2b0844a6.tar.gz macaw-4deb7470413a9d53323f6bedf26882ad2b0844a6.tar.bz2 macaw-4deb7470413a9d53323f6bedf26882ad2b0844a6.zip |
feat: nicks and avatars
Diffstat (limited to 'src/message_view.rs')
-rw-r--r-- | src/message_view.rs | 93 |
1 files changed, 51 insertions, 42 deletions
diff --git a/src/message_view.rs b/src/message_view.rs index 4ebda83..e936b69 100644 --- a/src/message_view.rs +++ b/src/message_view.rs @@ -1,54 +1,27 @@ -use std::{ - borrow::{Borrow, Cow}, - cell::{Ref, RefCell}, - ops::Deref, - rc::Rc, -}; - use chrono::NaiveDate; -use filamento::chat::Message as ChatMessage; use iced::{ - alignment::Horizontal::{self, Right}, border::Radius, - color, - theme::Palette, - widget::{ - button, column, container, horizontal_space, row, scrollable, text, text_editor, - text_editor::Content, text_input, Column, - }, + widget::{button, column, container, row, scrollable, text, text_editor, text_editor::Content}, Border, Color, Element, Length::{Fill, Shrink}, Theme, }; use indexmap::IndexMap; -use jid::JID; use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::{MacawChat, MacawMessage}; pub struct MessageView { + // references chats, users + pub chat: MacawChat, + // references users, messages + pub messages: IndexMap<Uuid, MacawMessage>, pub config: Config, - pub chat: Rc<RefCell<MacawChat>>, - pub messages: Vec<Rc<RefCell<MacawMessage>>>, pub new_message: Content, pub shift_pressed: bool, } -impl MessageView { - pub fn chat(&self) -> Ref<'_, MacawChat> { - self.chat.as_ref().borrow() - } - - pub fn messages( - &self, - ) -> impl Iterator<Item = impl Deref<Target = MacawMessage> + use<'_>> + use<'_> { - self.messages - .iter() - .map(|message| message.as_ref().borrow()) - } -} - #[derive(Serialize, Deserialize, Clone)] pub struct Config { pub send_on_enter: bool, @@ -64,8 +37,8 @@ impl Default for Config { #[derive(Debug, Clone)] pub enum Message { - // MessageHistory(Vec<Rc<RefCell<MacawMessage>>>), - // Message(Rc<RefCell<MacawMessage>>), + MessageHistory(Vec<MacawMessage>), + Message(MacawMessage), MessageCompose(text_editor::Action), SendMessage(String), } @@ -76,11 +49,11 @@ pub enum Action { } impl MessageView { - pub fn new(chat: Rc<RefCell<MacawChat>>, config: &super::Config) -> Self { + pub fn new(chat: MacawChat, config: &super::Config) -> Self { Self { chat, // TODO: save position in message history - messages: Vec::new(), + messages: IndexMap::new(), // TODO: save draft (as part of chat struct?) new_message: Content::new(), config: config.message_view_config.clone(), @@ -120,13 +93,52 @@ impl MessageView { self.new_message = Content::new(); Action::SendMessage(m) } + Message::MessageHistory(macaw_messages) => { + if self.messages.is_empty() { + self.messages = macaw_messages + .into_iter() + .map(|message| (message.id, message)) + .collect() + } else { + for message in macaw_messages { + let index = match self + .messages + .binary_search_by(|_, value| value.timestamp.cmp(&message.timestamp)) + { + Ok(i) => i, + Err(i) => i, + }; + self.messages.insert_before(index, message.id, message); + } + } + Action::None + } + Message::Message(macaw_message) => { + if let Some((_, last)) = self.messages.last() { + if last.timestamp < macaw_message.timestamp { + self.messages.insert(macaw_message.id, macaw_message); + } else { + let index = match self.messages.binary_search_by(|_, value| { + value.timestamp.cmp(&macaw_message.timestamp) + }) { + Ok(i) => i, + Err(i) => i, + }; + self.messages + .insert_before(index, macaw_message.id, macaw_message); + } + } else { + self.messages.insert(macaw_message.id, macaw_message); + } + Action::None + } } } pub fn view(&self) -> Element<Message> { let mut messages_view = column![].spacing(8).padding(8); let mut latest_date = NaiveDate::MIN; - for message in self.messages() { + for (_id, message) in &self.messages { let message_date = message.timestamp.naive_local().date(); if message_date > latest_date { latest_date = message_date; @@ -154,14 +166,11 @@ impl MessageView { .into() } - pub fn message<'a, 'b, M>(&'a self, message: M) -> Element<'b, Message> - where - M: Deref<Target = MacawMessage> + 'b, - { + pub fn message<'a>(&'a self, message: &MacawMessage) -> Element<'a, Message> { let timestamp = message.timestamp.naive_local(); let timestamp = timestamp.time().format("%H:%M").to_string(); - if self.chat().user().jid == message.user().jid { + if self.chat.user.jid == message.from.jid { container( container( column![ |