aboutsummaryrefslogtreecommitdiffstats
path: root/src/message_view.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 08:32:50 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 08:32:50 +0100
commit4deb7470413a9d53323f6bedf26882ad2b0844a6 (patch)
tree2a3ca1b69a02300bbf0db40cd7e7fe410b8e938a /src/message_view.rs
parent1299841ecb5648328a590658c2ea6ad18ecf46e3 (diff)
downloadmacaw-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.rs93
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![