Support for writing private messages
This commit is contained in:
parent
6112f2a492
commit
babfa15e30
|
@ -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;
|
||||
|
|
|
@ -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", ¶ms)
|
||||
}
|
||||
|
||||
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", ¶ms)
|
||||
}
|
||||
|
||||
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", ¶ms)
|
||||
}
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue