feat: indicate and mark posts as read/unread (closes #32)

This commit is contained in:
Bnyro 2023-12-14 13:46:41 +01:00
parent 7dc4841e2d
commit 545b7bc313
4 changed files with 603 additions and 439 deletions

1002
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -4,8 +4,8 @@ version = "0.4.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
relm4 = { version = "0.6.0", features = ["libadwaita"] } relm4 = { version = "0.6.2", features = ["libadwaita"] }
relm4-components = { version = "0.6.0", features = ["web"] } relm4-components = { version = "0.6.2", features = ["web"] }
reqwest = { version = "0.11", features = ["json", "blocking", "multipart"] } reqwest = { version = "0.11", features = ["json", "blocking", "multipart"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"

View File

@ -9,7 +9,7 @@ use lemmy_api_common::{
lemmy_db_views::structs::CommentView, lemmy_db_views::structs::CommentView,
post::{ post::{
CreatePost, CreatePostLike, CreatePostReport, DeletePost, EditPost, GetPost, CreatePost, CreatePostLike, CreatePostReport, DeletePost, EditPost, GetPost,
GetPostResponse, PostReportResponse, PostResponse, SavePost, GetPostResponse, MarkPostAsRead, PostReportResponse, PostResponse, SavePost,
}, },
}; };
use std::result::Result; use std::result::Result;
@ -129,3 +129,12 @@ pub fn report_post(post_id: PostId, reason: String) -> Result<PostReportResponse
}; };
super::post("/post/report", &params) super::post("/post/report", &params)
} }
pub fn mark_post_as_read(post_id: PostId, read: bool) -> Result<PostResponse, reqwest::Error> {
let params = MarkPostAsRead {
post_id,
read,
auth: settings::get_current_account().jwt.unwrap(),
};
super::post("/post/mark_as_read", &params)
}

View File

@ -24,8 +24,10 @@ pub enum PostRowMsg {
OpenCommunity, OpenCommunity,
OpenPerson, OpenPerson,
ToggleSaved, ToggleSaved,
ToggleRead,
DeletePost, DeletePost,
UpdateSaved(bool), UpdateSaved(bool),
UpdateRead(bool),
} }
#[relm4::factory(pub)] #[relm4::factory(pub)]
@ -128,6 +130,14 @@ impl FactoryComponent for PostRow {
#[watch] #[watch]
set_active: self.post.saved, set_active: self.post.saved,
}, },
gtk::ToggleButton {
set_icon_name: "mail-mark-read",
set_margin_start: 10,
connect_clicked => PostRowMsg::ToggleRead,
set_visible: settings::get_current_account().jwt.is_some(),
#[watch]
set_active: self.post.read,
},
gtk::Button { gtk::Button {
set_icon_name: "edit-delete", set_icon_name: "edit-delete",
connect_clicked => PostRowMsg::DeletePost, connect_clicked => PostRowMsg::DeletePost,
@ -207,13 +217,26 @@ impl FactoryComponent for PostRow {
let post_id = self.post.post.id; let post_id = self.post.post.id;
let new_state = !self.post.saved; let new_state = !self.post.saved;
std::thread::spawn(move || match api::post::save_post(post_id, new_state) { std::thread::spawn(move || match api::post::save_post(post_id, new_state) {
Ok(post) => sender.input(PostRowMsg::UpdateSaved(post.post_view.saved)), Ok(_) => sender.input(PostRowMsg::UpdateSaved(new_state)),
Err(err) => println!("{}", err), Err(err) => println!("{}", err),
}); });
} }
PostRowMsg::ToggleRead => {
let post_id = self.post.post.id;
let new_state = !self.post.read;
std::thread::spawn(move || {
match api::post::mark_post_as_read(post_id, new_state) {
Ok(_) => sender.input(PostRowMsg::UpdateRead(new_state)),
Err(err) => println!("{}", err),
}
});
}
PostRowMsg::UpdateSaved(is_saved) => { PostRowMsg::UpdateSaved(is_saved) => {
self.post.saved = is_saved; self.post.saved = is_saved;
} }
PostRowMsg::UpdateRead(is_read) => {
self.post.read = is_read;
}
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 || {