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 moderation;
|
||||||
pub mod post;
|
pub mod post;
|
||||||
pub mod posts;
|
pub mod posts;
|
||||||
|
pub mod private_message;
|
||||||
pub mod search;
|
pub mod search;
|
||||||
pub mod site;
|
pub mod site;
|
||||||
pub mod user;
|
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_ {
|
EditorOutput::EditRequest(post, type_) => match type_ {
|
||||||
EditorType::Post => PostInput::EditPostRequest(post),
|
EditorType::Post => PostInput::EditPostRequest(post),
|
||||||
EditorType::Comment => PostInput::EditCommentRequest(post),
|
EditorType::Comment => PostInput::EditCommentRequest(post),
|
||||||
|
_ => unreachable!(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
let voting_row = VotingRowModel::builder()
|
let voting_row = VotingRowModel::builder()
|
||||||
|
|
|
@ -3,6 +3,12 @@ use lemmy_api_common::person::GetPersonDetailsResponse;
|
||||||
use relm4::{factory::FactoryVecDeque, prelude::*};
|
use relm4::{factory::FactoryVecDeque, prelude::*};
|
||||||
use relm4_components::web_image::WebImage;
|
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::get_web_image_msg;
|
||||||
use crate::util::markdown_to_pango_markup;
|
use crate::util::markdown_to_pango_markup;
|
||||||
|
|
||||||
|
@ -12,11 +18,14 @@ pub struct ProfilePage {
|
||||||
info: GetPersonDetailsResponse,
|
info: GetPersonDetailsResponse,
|
||||||
avatar: Controller<WebImage>,
|
avatar: Controller<WebImage>,
|
||||||
posts: FactoryVecDeque<PostRow>,
|
posts: FactoryVecDeque<PostRow>,
|
||||||
|
editor_dialog: Controller<EditorDialog>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ProfileInput {
|
pub enum ProfileInput {
|
||||||
UpdatePerson(GetPersonDetailsResponse),
|
UpdatePerson(GetPersonDetailsResponse),
|
||||||
|
SendMessageRequest,
|
||||||
|
SendMessage(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component(pub)]
|
#[relm4::component(pub)]
|
||||||
|
@ -58,11 +67,16 @@ impl SimpleComponent for ProfilePage {
|
||||||
|
|
||||||
gtk::Label {
|
gtk::Label {
|
||||||
#[watch]
|
#[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 {
|
if settings::get_current_account().jwt.is_some() {
|
||||||
#[watch]
|
gtk::Button {
|
||||||
set_text: &format!("{} comments", model.info.person_view.counts.comment_count),
|
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> {
|
) -> relm4::ComponentParts<Self> {
|
||||||
let avatar = WebImage::builder().launch("".to_string()).detach();
|
let avatar = WebImage::builder().launch("".to_string()).detach();
|
||||||
let posts = FactoryVecDeque::new(gtk::Box::default(), sender.output_sender());
|
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 {
|
let model = ProfilePage {
|
||||||
info: init,
|
info: init,
|
||||||
avatar,
|
avatar,
|
||||||
posts,
|
posts,
|
||||||
|
editor_dialog,
|
||||||
};
|
};
|
||||||
let avatar = model.avatar.widget();
|
let avatar = model.avatar.widget();
|
||||||
let posts = model.posts.widget();
|
let posts = model.posts.widget();
|
||||||
|
@ -107,6 +129,13 @@ impl SimpleComponent for ProfilePage {
|
||||||
self.posts.guard().push_back(post);
|
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 {
|
pub enum EditorType {
|
||||||
Post,
|
Post,
|
||||||
Comment,
|
Comment,
|
||||||
|
PrivateMessage,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -76,7 +77,7 @@ impl SimpleComponent for EditorDialog {
|
||||||
gtk::Label {
|
gtk::Label {
|
||||||
set_halign: gtk::Align::Center,
|
set_halign: gtk::Align::Center,
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_label: "Post content",
|
set_label: "Post",
|
||||||
add_css_class: "font-bold"
|
add_css_class: "font-bold"
|
||||||
},
|
},
|
||||||
gtk::Entry {
|
gtk::Entry {
|
||||||
|
@ -98,7 +99,17 @@ impl SimpleComponent for EditorDialog {
|
||||||
gtk::Label {
|
gtk::Label {
|
||||||
set_halign: gtk::Align::Center,
|
set_halign: gtk::Align::Center,
|
||||||
set_valign: 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"
|
add_css_class: "font-bold"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue