Support for writing private messages

This commit is contained in:
Bnyro 2023-06-28 10:20:19 +02:00
parent 6112f2a492
commit babfa15e30
5 changed files with 92 additions and 6 deletions

View File

@ -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;

View File

@ -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<PrivateMessageResponse, reqwest::Error> {
let params = CreatePrivateMessage {
auth: crate::settings::get_current_account().jwt.unwrap(),
recipient_id,
content,
};
super::post("/private_message", &params)
}
pub fn edit_private_message(
content: String,
private_message_id: PrivateMessageId,
) -> std::result::Result<PrivateMessageResponse, reqwest::Error> {
let params = EditPrivateMessage {
auth: crate::settings::get_current_account().jwt.unwrap(),
private_message_id,
content,
};
super::put("/private_message", &params)
}
pub fn list_private_messages(
unread_only: bool,
page: i64,
) -> std::result::Result<PrivateMessagesResponse, reqwest::Error> {
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", &params)
}

View File

@ -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()

View File

@ -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<WebImage>,
posts: FactoryVecDeque<PostRow>,
editor_dialog: Controller<EditorDialog>,
}
#[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<Self> {
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);
});
}
}
}
}

View File

@ -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"
},
}