From babfa15e307219080fa7e833ba70e8dd133b8c29 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 28 Jun 2023 10:20:19 +0200 Subject: [PATCH] Support for writing private messages --- src/api/mod.rs | 1 + src/api/private_message.rs | 44 ++++++++++++++++++++++++++++++++++ src/components/post_page.rs | 1 + src/components/profile_page.rs | 37 ++++++++++++++++++++++++---- src/dialogs/editor.rs | 15 ++++++++++-- 5 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 src/api/private_message.rs diff --git a/src/api/mod.rs b/src/api/mod.rs index d45d30b..098194d 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -10,6 +10,7 @@ pub mod image; pub mod moderation; pub mod post; pub mod posts; +pub mod private_message; pub mod search; pub mod site; pub mod user; diff --git a/src/api/private_message.rs b/src/api/private_message.rs new file mode 100644 index 0000000..14466e0 --- /dev/null +++ b/src/api/private_message.rs @@ -0,0 +1,44 @@ +use lemmy_api_common::{ + lemmy_db_schema::newtypes::{PersonId, PrivateMessageId}, + private_message::{ + CreatePrivateMessage, EditPrivateMessage, GetPrivateMessages, PrivateMessageResponse, + PrivateMessagesResponse, + }, +}; + +pub fn create_private_message( + content: String, + recipient_id: PersonId, +) -> std::result::Result { + let params = CreatePrivateMessage { + auth: crate::settings::get_current_account().jwt.unwrap(), + recipient_id, + content, + }; + super::post("/private_message", ¶ms) +} + +pub fn edit_private_message( + content: String, + private_message_id: PrivateMessageId, +) -> std::result::Result { + let params = EditPrivateMessage { + auth: crate::settings::get_current_account().jwt.unwrap(), + private_message_id, + content, + }; + super::put("/private_message", ¶ms) +} + +pub fn list_private_messages( + unread_only: bool, + page: i64, +) -> std::result::Result { + let params = GetPrivateMessages { + unread_only: Some(unread_only), + page: Some(page), + auth: crate::settings::get_current_account().jwt.unwrap(), + ..Default::default() + }; + super::get("/private_message/list", ¶ms) +} diff --git a/src/components/post_page.rs b/src/components/post_page.rs index edad8b9..3893d4b 100644 --- a/src/components/post_page.rs +++ b/src/components/post_page.rs @@ -212,6 +212,7 @@ impl SimpleComponent for PostPage { EditorOutput::EditRequest(post, type_) => match type_ { EditorType::Post => PostInput::EditPostRequest(post), EditorType::Comment => PostInput::EditCommentRequest(post), + _ => unreachable!(), }, }); let voting_row = VotingRowModel::builder() diff --git a/src/components/profile_page.rs b/src/components/profile_page.rs index fc35cd6..a69e4aa 100644 --- a/src/components/profile_page.rs +++ b/src/components/profile_page.rs @@ -3,6 +3,12 @@ use lemmy_api_common::person::GetPersonDetailsResponse; use relm4::{factory::FactoryVecDeque, prelude::*}; use relm4_components::web_image::WebImage; +use crate::api; +use crate::dialogs::editor::DialogMsg; +use crate::dialogs::editor::EditorDialog; +use crate::dialogs::editor::EditorOutput; +use crate::dialogs::editor::EditorType; +use crate::settings; use crate::util::get_web_image_msg; use crate::util::markdown_to_pango_markup; @@ -12,11 +18,14 @@ pub struct ProfilePage { info: GetPersonDetailsResponse, avatar: Controller, posts: FactoryVecDeque, + editor_dialog: Controller, } #[derive(Debug)] pub enum ProfileInput { UpdatePerson(GetPersonDetailsResponse), + SendMessageRequest, + SendMessage(String), } #[relm4::component(pub)] @@ -58,11 +67,16 @@ impl SimpleComponent for ProfilePage { gtk::Label { #[watch] - set_text: &format!("{} posts, ", model.info.person_view.counts.post_count), + set_text: &format!("{} posts, {} comments", model.info.person_view.counts.post_count, model.info.person_view.counts.comment_count), }, - gtk::Label { - #[watch] - set_text: &format!("{} comments", model.info.person_view.counts.comment_count), + if settings::get_current_account().jwt.is_some() { + gtk::Button { + set_label: "Send message", + connect_clicked => ProfileInput::SendMessageRequest, + set_margin_start: 10, + } + } else { + gtk::Box {} }, }, @@ -84,10 +98,18 @@ impl SimpleComponent for ProfilePage { ) -> relm4::ComponentParts { let avatar = WebImage::builder().launch("".to_string()).detach(); let posts = FactoryVecDeque::new(gtk::Box::default(), sender.output_sender()); + let editor_dialog = EditorDialog::builder() + .transient_for(root) + .launch(EditorType::PrivateMessage) + .forward(sender.input_sender(), |msg| match msg { + EditorOutput::CreateRequest(data, _) => ProfileInput::SendMessage(data.body), + _ => unreachable!(), + }); let model = ProfilePage { info: init, avatar, posts, + editor_dialog, }; let avatar = model.avatar.widget(); let posts = model.posts.widget(); @@ -107,6 +129,13 @@ impl SimpleComponent for ProfilePage { self.posts.guard().push_back(post); } } + ProfileInput::SendMessageRequest => self.editor_dialog.sender().emit(DialogMsg::Show), + ProfileInput::SendMessage(content) => { + let profile_id = self.info.person_view.person.id; + std::thread::spawn(move || { + let _ = api::private_message::create_private_message(content, profile_id); + }); + } } } } diff --git a/src/dialogs/editor.rs b/src/dialogs/editor.rs index 1bd09a3..e4a929a 100644 --- a/src/dialogs/editor.rs +++ b/src/dialogs/editor.rs @@ -30,6 +30,7 @@ pub struct EditorDialog { pub enum EditorType { Post, Comment, + PrivateMessage, } #[derive(Debug)] @@ -76,7 +77,7 @@ impl SimpleComponent for EditorDialog { gtk::Label { set_halign: gtk::Align::Center, set_valign: gtk::Align::Center, - set_label: "Post content", + set_label: "Post", add_css_class: "font-bold" }, gtk::Entry { @@ -98,7 +99,17 @@ impl SimpleComponent for EditorDialog { gtk::Label { set_halign: gtk::Align::Center, set_valign: gtk::Align::Center, - set_label: "Comment content", + set_label: "Comment", + add_css_class: "font-bold" + }, + } + } + EditorType::PrivateMessage => { + gtk::Box { + gtk::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_label: "Private message", add_css_class: "font-bold" }, }