support for bookmarking posts

This commit is contained in:
Bnyro 2023-07-11 09:42:37 +02:00
parent 2442843ce3
commit 572b1992b1
3 changed files with 54 additions and 1 deletions

View File

@ -9,8 +9,10 @@ use lemmy_api_common::{
lemmy_db_views::structs::CommentView, lemmy_db_views::structs::CommentView,
post::{ post::{
CreatePost, CreatePostLike, DeletePost, EditPost, GetPost, GetPostResponse, PostResponse, CreatePost, CreatePostLike, DeletePost, EditPost, GetPost, GetPostResponse, PostResponse,
SavePost,
}, },
}; };
use std::result::Result;
pub fn get_post(id: PostId) -> Result<GetPostResponse, reqwest::Error> { pub fn get_post(id: PostId) -> Result<GetPostResponse, reqwest::Error> {
let params = GetPost { let params = GetPost {
@ -109,3 +111,12 @@ pub fn delete_post(post_id: PostId) -> Result<PostResponse, reqwest::Error> {
}; };
super::post("/post/delete", &params) super::post("/post/delete", &params)
} }
pub fn save_post(post_id: PostId, save: bool) -> Result<PostResponse, reqwest::Error> {
let params = SavePost {
auth: settings::get_current_account().jwt.unwrap(),
post_id,
save,
};
super::put("/post/save", &params)
}

View File

@ -42,6 +42,8 @@ pub enum PostPageInput {
EditPostRequest(EditorData), EditPostRequest(EditorData),
CreatedComment(CommentView), CreatedComment(CommentView),
OpenEditPostDialog, OpenEditPostDialog,
ToggleSaved,
UpdateSaved(bool),
DeletePost, DeletePost,
DoneEditPost(PostView), DoneEditPost(PostView),
PassAppMessage(crate::AppMsg), PassAppMessage(crate::AppMsg),
@ -173,7 +175,15 @@ impl SimpleComponent for PostPage {
connect_clicked => PostPageInput::OpenCreateCommentDialog, connect_clicked => PostPageInput::OpenCreateCommentDialog,
#[watch] #[watch]
set_visible: settings::get_current_account().jwt.is_some(), set_visible: settings::get_current_account().jwt.is_some(),
} },
gtk::ToggleButton {
set_icon_name: "bookmark-new",
set_margin_start: 10,
connect_clicked => PostPageInput::ToggleSaved,
set_visible: settings::get_current_account().jwt.is_some(),
#[watch]
set_active: model.info.post_view.saved,
},
}, },
#[local_ref] #[local_ref]
@ -310,6 +320,17 @@ impl SimpleComponent for PostPage {
}; };
}); });
} }
PostPageInput::ToggleSaved => {
let post_id = self.info.post_view.post.id;
let new_state = !self.info.post_view.saved;
std::thread::spawn(move || match api::post::save_post(post_id, new_state) {
Ok(post) => sender.input(PostPageInput::UpdateSaved(post.post_view.saved)),
Err(err) => println!("{}", err),
});
}
PostPageInput::UpdateSaved(is_saved) => {
self.info.post_view.saved = is_saved;
}
PostPageInput::DeletePost => { PostPageInput::DeletePost => {
let post_id = self.info.post_view.post.id; let post_id = self.info.post_view.post.id;
std::thread::spawn(move || { std::thread::spawn(move || {

View File

@ -21,7 +21,9 @@ pub enum PostRowMsg {
OpenPost, OpenPost,
OpenCommunity, OpenCommunity,
OpenPerson, OpenPerson,
ToggleSaved,
DeletePost, DeletePost,
UpdateSaved(bool),
} }
#[relm4::factory(pub)] #[relm4::factory(pub)]
@ -98,6 +100,14 @@ impl FactoryComponent for PostRow {
set_halign: gtk::Align::Start, set_halign: gtk::Align::Start,
set_text: &format!("{} comments", self.post.counts.comments.clone()), set_text: &format!("{} comments", self.post.counts.comments.clone()),
}, },
gtk::ToggleButton {
set_icon_name: "bookmark-new",
set_margin_start: 10,
connect_clicked => PostRowMsg::ToggleSaved,
set_visible: settings::get_current_account().jwt.is_some(),
#[watch]
set_active: self.post.saved,
},
gtk::Button { gtk::Button {
set_icon_name: "edit-delete", set_icon_name: "edit-delete",
connect_clicked => PostRowMsg::DeletePost, connect_clicked => PostRowMsg::DeletePost,
@ -161,6 +171,17 @@ impl FactoryComponent for PostRow {
PostRowMsg::OpenPost => { PostRowMsg::OpenPost => {
sender.output(crate::AppMsg::OpenPost(self.post.post.id.clone())) sender.output(crate::AppMsg::OpenPost(self.post.post.id.clone()))
} }
PostRowMsg::ToggleSaved => {
let post_id = self.post.post.id;
let new_state = !self.post.saved;
std::thread::spawn(move || match api::post::save_post(post_id, new_state) {
Ok(post) => sender.input(PostRowMsg::UpdateSaved(post.post_view.saved)),
Err(err) => println!("{}", err),
});
}
PostRowMsg::UpdateSaved(is_saved) => {
self.post.saved = is_saved;
}
PostRowMsg::DeletePost => { PostRowMsg::DeletePost => {
let post_id = self.post.post.id; let post_id = self.post.post.id;
std::thread::spawn(move || { std::thread::spawn(move || {