diff options
author | 2025-04-11 02:57:20 +0100 | |
---|---|---|
committer | 2025-04-11 02:57:20 +0100 | |
commit | 1299841ecb5648328a590658c2ea6ad18ecf46e3 (patch) | |
tree | 89932862dab0e59b76de10cf0d9a55413c831338 /src/message_view.rs | |
parent | 78577fb74949c83e3c8196a7310781c15e73bf64 (diff) | |
download | macaw-1299841ecb5648328a590658c2ea6ad18ecf46e3.tar.gz macaw-1299841ecb5648328a590658c2ea6ad18ecf46e3.tar.bz2 macaw-1299841ecb5648328a590658c2ea6ad18ecf46e3.zip |
i hate everything
Diffstat (limited to 'src/message_view.rs')
-rw-r--r-- | src/message_view.rs | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/src/message_view.rs b/src/message_view.rs index 5d27335..4ebda83 100644 --- a/src/message_view.rs +++ b/src/message_view.rs @@ -1,4 +1,9 @@ -use std::borrow::Cow; +use std::{ + borrow::{Borrow, Cow}, + cell::{Ref, RefCell}, + ops::Deref, + rc::Rc, +}; use chrono::NaiveDate; use filamento::chat::Message as ChatMessage; @@ -20,14 +25,30 @@ use jid::JID; use serde::{Deserialize, Serialize}; use uuid::Uuid; +use crate::{MacawChat, MacawMessage}; + pub struct MessageView { pub config: Config, - pub jid: JID, - pub message_history: IndexMap<Uuid, ChatMessage>, + 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, @@ -43,8 +64,8 @@ impl Default for Config { #[derive(Debug, Clone)] pub enum Message { - MessageHistory(Vec<ChatMessage>), - Message(ChatMessage), + // MessageHistory(Vec<Rc<RefCell<MacawMessage>>>), + // Message(Rc<RefCell<MacawMessage>>), MessageCompose(text_editor::Action), SendMessage(String), } @@ -55,11 +76,11 @@ pub enum Action { } impl MessageView { - pub fn new(jid: JID, config: &super::Config) -> Self { + pub fn new(chat: Rc<RefCell<MacawChat>>, config: &super::Config) -> Self { Self { - jid, + chat, // TODO: save position in message history - message_history: IndexMap::new(), + messages: Vec::new(), // TODO: save draft (as part of chat struct?) new_message: Content::new(), config: config.message_view_config.clone(), @@ -70,27 +91,6 @@ impl MessageView { pub fn update(&mut self, message: Message) -> Action { match message { - Message::MessageHistory(messages) => { - if self.message_history.is_empty() { - self.message_history = messages - .into_iter() - .map(|message| (message.id.clone(), message)) - .collect(); - } - Action::None - } - Message::Message(message) => { - let i = self - .message_history - .iter() - .position(|(_id, m)| m.timestamp > message.timestamp); - if let Some(i) = i { - self.message_history.insert_before(i, message.id, message); - } else { - self.message_history.insert(message.id, message); - } - Action::None - } Message::MessageCompose(a) => { match &a { text_editor::Action::Edit(edit) => match edit { @@ -126,7 +126,7 @@ impl MessageView { pub fn view(&self) -> Element<Message> { let mut messages_view = column![].spacing(8).padding(8); let mut latest_date = NaiveDate::MIN; - for (_id, message) in &self.message_history { + for message in self.messages() { let message_date = message.timestamp.naive_local().date(); if message_date > latest_date { latest_date = message_date; @@ -154,15 +154,18 @@ impl MessageView { .into() } - pub fn message<'a>(&'a self, message: &'a ChatMessage) -> Element<'a, Message> { + pub fn message<'a, 'b, M>(&'a self, message: M) -> Element<'b, Message> + where + M: Deref<Target = MacawMessage> + 'b, + { let timestamp = message.timestamp.naive_local(); let timestamp = timestamp.time().format("%H:%M").to_string(); - if self.jid == message.from.as_bare() { + if self.chat().user().jid == message.user().jid { container( container( column![ - text(message.body.body.as_str()).wrapping(text::Wrapping::WordOrGlyph), + text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph), container(text(timestamp).wrapping(text::Wrapping::None).size(12)) // .align_right(Fill) ] .width(Shrink) @@ -187,7 +190,7 @@ impl MessageView { let element: Element<Message> = container( container( column![ - text(message.body.body.as_str()).wrapping(text::Wrapping::WordOrGlyph), + text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph), container(text(timestamp).wrapping(text::Wrapping::None).size(12)) .align_right(Fill) // row![ // // horizontal_space(), |