aboutsummaryrefslogtreecommitdiffstats
path: root/src/message_view.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 16:29:53 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 16:29:53 +0100
commit70532f715f93164fef4313a1bb5064a467811408 (patch)
treedff79fb375f2aeb4a97433345307899c2fcd91eb /src/message_view.rs
parent80524e515406007915cb9978f403407a98c44e1e (diff)
downloadmacaw-70532f715f93164fef4313a1bb5064a467811408.tar.gz
macaw-70532f715f93164fef4313a1bb5064a467811408.tar.bz2
macaw-70532f715f93164fef4313a1bb5064a467811408.zip
feat: new message style
Diffstat (limited to 'src/message_view.rs')
-rw-r--r--src/message_view.rs128
1 files changed, 61 insertions, 67 deletions
diff --git a/src/message_view.rs b/src/message_view.rs
index fdb1a59..8378164 100644
--- a/src/message_view.rs
+++ b/src/message_view.rs
@@ -1,18 +1,24 @@
-use chrono::NaiveDate;
+use std::{path::PathBuf, time::Duration};
+
+use chrono::{NaiveDate, NaiveDateTime, TimeDelta};
use iced::{
border::Radius,
- widget::{button, column, container, row, scrollable, text, text_editor, text_editor::Content},
+ widget::{
+ button, column, container, image, 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::{icons::Icon, MacawChat, MacawMessage};
pub struct MessageView {
+ pub file_root: PathBuf,
// references chats, users
pub chat: MacawChat,
// references users, messages
@@ -49,7 +55,7 @@ pub enum Action {
}
impl MessageView {
- pub fn new(chat: MacawChat, config: &super::Config) -> Self {
+ pub fn new(chat: MacawChat, config: &super::Config, file_root: PathBuf) -> Self {
Self {
chat,
// TODO: save position in message history
@@ -59,6 +65,7 @@ impl MessageView {
config: config.message_view_config.clone(),
// TODO: have centralised modifier state location?
shift_pressed: false,
+ file_root,
}
}
@@ -137,14 +144,22 @@ impl MessageView {
pub fn view(&self) -> Element<Message> {
let mut messages_view = column![].spacing(8).padding(8);
- let mut latest_date = NaiveDate::MIN;
+ let mut last_timestamp = NaiveDateTime::MIN;
+ let mut last_user: Option<JID> = None;
for (_id, message) in &self.messages {
- let message_date = message.timestamp.naive_local().date();
- if message_date > latest_date {
- latest_date = message_date;
- messages_view = messages_view.push(date(latest_date));
+ let message_timestamp = message.timestamp.naive_local();
+ if message_timestamp.date() > last_timestamp.date() {
+ messages_view = messages_view.push(date(message_timestamp.date()));
+ }
+ if last_user.as_ref() != Some(&message.from.jid)
+ || message_timestamp - last_timestamp > TimeDelta::minutes(3)
+ {
+ messages_view = messages_view.push(self.message(message, true));
+ } else {
+ messages_view = messages_view.push(self.message(message, false));
}
- messages_view = messages_view.push(self.message(message));
+ last_user = Some(message.from.jid.clone());
+ last_timestamp = message_timestamp;
}
let text_editor = text_editor(&self.new_message)
.placeholder("new message")
@@ -166,68 +181,47 @@ impl MessageView {
.into()
}
- pub fn message<'a>(&'a self, message: &MacawMessage) -> Element<'a, Message> {
+ pub fn message<'a>(&'a self, message: &'a MacawMessage, major: bool) -> Element<'a, Message> {
let timestamp = message.timestamp.naive_local();
let timestamp = timestamp.time().format("%H:%M").to_string();
- if self.chat.user.jid == message.from.jid {
- container(
- container(
- column![
- text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph),
- container(text(timestamp).wrapping(text::Wrapping::None).size(12)) // .align_right(Fill)
- ]
- .width(Shrink)
- .max_width(500),
- )
- .padding(16)
- .style(|theme: &Theme| {
- let palette = theme.extended_palette();
- container::Style::default()
- .background(palette.primary.weak.color)
- .border(Border {
- color: Color::BLACK,
- width: 0.,
- // width: 4.,
- radius: Radius::new(16),
- })
- }),
- )
- .align_left(Fill)
- .into()
+ if major {
+ let nick: String = if let Some(nick) = &message.from.nick {
+ nick.to_string()
+ } else {
+ message.from.jid.as_bare().to_string()
+ };
+ let mut header = row![text(nick), text(timestamp)];
+ if let Some(delivery) = message.delivery {
+ let icon = match delivery {
+ filamento::chat::Delivery::Sending => Some(Icon::Sending16),
+ filamento::chat::Delivery::Written => None,
+ filamento::chat::Delivery::Sent => Some(Icon::Sent16),
+ filamento::chat::Delivery::Delivered => Some(Icon::Delivered16),
+ filamento::chat::Delivery::Read => Some(Icon::Delivered16),
+ filamento::chat::Delivery::Failed => Some(Icon::Error16Color),
+ filamento::chat::Delivery::Queued => Some(Icon::Sending16),
+ };
+ if let Some(icon) = icon {
+ header = header.push(icon);
+ }
+ }
+ let message_right = column![header, text(&message.body.body)];
+ let mut major_message = row([]);
+ if let Some(avatar) = &message.from.avatar {
+ let mut path = self.file_root.join(avatar);
+ path.set_extension("jpg");
+ // info!("got avatar: {:?}", path);
+ major_message = major_message.push(image(path).width(48).height(48));
+ }
+ major_message = major_message.push(message_right);
+ major_message.into()
} else {
- let element: Element<Message> = container(
- container(
- column![
- text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph),
- container(text(timestamp).wrapping(text::Wrapping::None).size(12))
- .align_right(Fill) // row![
- // // horizontal_space(),
- // // horizontal_space(),
- // text(timestamp).wrapping(text::Wrapping::None).size(12)
- // ] // container(text(timestamp).wrapping(text::Wrapping::None).size(12))
- // .align_right(Fill)
- ]
- .width(Shrink)
- .max_width(500),
- )
- .padding(16)
- .style(|theme: &Theme| {
- let palette = theme.extended_palette();
- container::Style::default()
- .background(palette.primary.base.color)
- .border(Border {
- color: Color::BLACK,
- width: 0.,
- // width: 4.,
- radius: Radius::new(16),
- })
- }),
- )
- .align_right(Fill)
- .into();
- // element.explain(Color::BLACK)
- element
+ row![
+ container(text(timestamp)).width(48),
+ text(&message.body.body)
+ ]
+ .into()
}
}
}