aboutsummaryrefslogtreecommitdiffstats
path: root/src/message_view.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 02:57:20 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 02:57:20 +0100
commit1299841ecb5648328a590658c2ea6ad18ecf46e3 (patch)
tree89932862dab0e59b76de10cf0d9a55413c831338 /src/message_view.rs
parent78577fb74949c83e3c8196a7310781c15e73bf64 (diff)
downloadmacaw-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.rs71
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(),