From 572b1992b1310ad7d0b8f2b4db561a53e1795114 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 11 Jul 2023 09:42:37 +0200 Subject: [PATCH] support for bookmarking posts --- src/api/post.rs | 11 +++++++++++ src/components/post_page.rs | 23 ++++++++++++++++++++++- src/components/post_row.rs | 21 +++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/api/post.rs b/src/api/post.rs index 96fc2b3..847f6c1 100644 --- a/src/api/post.rs +++ b/src/api/post.rs @@ -9,8 +9,10 @@ use lemmy_api_common::{ lemmy_db_views::structs::CommentView, post::{ CreatePost, CreatePostLike, DeletePost, EditPost, GetPost, GetPostResponse, PostResponse, + SavePost, }, }; +use std::result::Result; pub fn get_post(id: PostId) -> Result { let params = GetPost { @@ -109,3 +111,12 @@ pub fn delete_post(post_id: PostId) -> Result { }; super::post("/post/delete", ¶ms) } + +pub fn save_post(post_id: PostId, save: bool) -> Result { + let params = SavePost { + auth: settings::get_current_account().jwt.unwrap(), + post_id, + save, + }; + super::put("/post/save", ¶ms) +} diff --git a/src/components/post_page.rs b/src/components/post_page.rs index f2bceb2..488f9a2 100644 --- a/src/components/post_page.rs +++ b/src/components/post_page.rs @@ -42,6 +42,8 @@ pub enum PostPageInput { EditPostRequest(EditorData), CreatedComment(CommentView), OpenEditPostDialog, + ToggleSaved, + UpdateSaved(bool), DeletePost, DoneEditPost(PostView), PassAppMessage(crate::AppMsg), @@ -173,7 +175,15 @@ impl SimpleComponent for PostPage { connect_clicked => PostPageInput::OpenCreateCommentDialog, #[watch] 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] @@ -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 => { let post_id = self.info.post_view.post.id; std::thread::spawn(move || { diff --git a/src/components/post_row.rs b/src/components/post_row.rs index 454e4e0..69aea89 100644 --- a/src/components/post_row.rs +++ b/src/components/post_row.rs @@ -21,7 +21,9 @@ pub enum PostRowMsg { OpenPost, OpenCommunity, OpenPerson, + ToggleSaved, DeletePost, + UpdateSaved(bool), } #[relm4::factory(pub)] @@ -98,6 +100,14 @@ impl FactoryComponent for PostRow { set_halign: gtk::Align::Start, 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 { set_icon_name: "edit-delete", connect_clicked => PostRowMsg::DeletePost, @@ -161,6 +171,17 @@ impl FactoryComponent for PostRow { PostRowMsg::OpenPost => { 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 => { let post_id = self.post.post.id; std::thread::spawn(move || {