support for viewing saved posts and comments

This commit is contained in:
Bnyro 2023-07-11 10:30:01 +02:00
parent 900928be71
commit 2f4485620f
3 changed files with 81 additions and 44 deletions

View File

@ -11,11 +11,13 @@ use crate::settings;
pub fn get_user( pub fn get_user(
id: PersonId, id: PersonId,
page: i64, page: i64,
saved_only: bool,
) -> std::result::Result<GetPersonDetailsResponse, reqwest::Error> { ) -> std::result::Result<GetPersonDetailsResponse, reqwest::Error> {
let params = GetPersonDetails { let params = GetPersonDetails {
page: Some(page), page: Some(page),
person_id: Some(id), person_id: Some(id),
auth: settings::get_current_account().jwt, auth: settings::get_current_account().jwt,
saved_only: Some(saved_only),
..Default::default() ..Default::default()
}; };

View File

@ -24,6 +24,7 @@ pub struct ProfilePage {
moderates: FactoryVecDeque<ModeratesRow>, moderates: FactoryVecDeque<ModeratesRow>,
editor_dialog: Controller<EditorDialog>, editor_dialog: Controller<EditorDialog>,
current_profile_page: i64, current_profile_page: i64,
saved_only: bool,
} }
#[derive(Debug)] #[derive(Debug)]
@ -36,7 +37,7 @@ pub enum ProfileInput {
#[relm4::component(pub)] #[relm4::component(pub)]
impl SimpleComponent for ProfilePage { impl SimpleComponent for ProfilePage {
type Init = GetPersonDetailsResponse; type Init = (GetPersonDetailsResponse, bool);
type Input = ProfileInput; type Input = ProfileInput;
type Output = crate::AppMsg; type Output = crate::AppMsg;
@ -47,6 +48,11 @@ impl SimpleComponent for ProfilePage {
set_vexpand: false, set_vexpand: false,
set_margin_all: 10, set_margin_all: 10,
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_vexpand: false,
set_visible: !model.saved_only,
#[local_ref] #[local_ref]
avatar -> gtk::Box { avatar -> gtk::Box {
set_size_request: (150, 150), set_size_request: (150, 150),
@ -87,6 +93,7 @@ impl SimpleComponent for ProfilePage {
}, },
gtk::Separator {}, gtk::Separator {},
},
gtk::StackSwitcher { gtk::StackSwitcher {
set_stack: Some(&stack), set_stack: Some(&stack),
@ -131,7 +138,7 @@ impl SimpleComponent for ProfilePage {
} }
fn init( fn init(
init: Self::Init, (info, saved_only): Self::Init,
root: &Self::Root, root: &Self::Root,
sender: relm4::ComponentSender<Self>, sender: relm4::ComponentSender<Self>,
) -> relm4::ComponentParts<Self> { ) -> relm4::ComponentParts<Self> {
@ -147,13 +154,14 @@ impl SimpleComponent for ProfilePage {
_ => unreachable!(), _ => unreachable!(),
}); });
let model = ProfilePage { let model = ProfilePage {
info: init, info,
avatar, avatar,
posts, posts,
comments, comments,
moderates, moderates,
editor_dialog, editor_dialog,
current_profile_page: 1, current_profile_page: 1,
saved_only,
}; };
let avatar = model.avatar.widget(); let avatar = model.avatar.widget();
let posts = model.posts.widget(); let posts = model.posts.widget();
@ -206,8 +214,9 @@ impl SimpleComponent for ProfilePage {
}; };
self.current_profile_page = page; self.current_profile_page = page;
let person_id = person_id.unwrap_or(self.info.person_view.person.id); let person_id = person_id.unwrap_or(self.info.person_view.person.id);
let saved_only = self.saved_only;
std::thread::spawn(move || { std::thread::spawn(move || {
match api::user::get_user(person_id, page) { match api::user::get_user(person_id, page, saved_only) {
Ok(person) => { Ok(person) => {
sender.input(ProfileInput::UpdatePerson(person, page == 1)); sender.input(ProfileInput::UpdatePerson(person, page == 1));
} }

View File

@ -46,6 +46,7 @@ pub enum AppState {
Login, Login,
Message, Message,
Inbox, Inbox,
Saved,
AccountsPage, AccountsPage,
} }
@ -62,6 +63,7 @@ struct App {
inbox_page: Controller<InboxPage>, inbox_page: Controller<InboxPage>,
login_page: Controller<LoginPage>, login_page: Controller<LoginPage>,
accounts_page: Controller<AccountsPage>, accounts_page: Controller<AccountsPage>,
saved_page: Controller<ProfilePage>,
logged_in: bool, logged_in: bool,
about_dialog: Controller<AboutDialog>, about_dialog: Controller<AboutDialog>,
} }
@ -79,6 +81,7 @@ pub enum AppMsg {
OpenPost(PostId), OpenPost(PostId),
DoneFetchPost(GetPostResponse), DoneFetchPost(GetPostResponse),
OpenInbox, OpenInbox,
OpenSaved,
OpenCommunities, OpenCommunities,
PopBackStack, PopBackStack,
UpdateState(AppState), UpdateState(AppState),
@ -122,13 +125,19 @@ impl SimpleComponent for App {
#[watch] #[watch]
set_visible: model.logged_in, set_visible: model.logged_in,
}, },
pack_start = &gtk::Button {
set_label: "Saved",
connect_clicked => AppMsg::OpenSaved,
#[watch]
set_visible: model.logged_in,
},
}, },
match model.state { match model.state {
AppState::Posts => gtk::Box { AppState::Posts => gtk::Box {
#[local_ref] #[local_ref]
posts_page -> gtk::ScrolledWindow {} posts_page -> gtk::ScrolledWindow {}
}, }
AppState::Loading => gtk::Box { AppState::Loading => gtk::Box {
set_hexpand: true, set_hexpand: true,
set_orientation: gtk::Orientation::Vertical, set_orientation: gtk::Orientation::Vertical,
@ -142,20 +151,19 @@ impl SimpleComponent for App {
gtk::Label { gtk::Label {
set_text: "Loading", set_text: "Loading",
}, },
}, }
AppState::ChooseInstance => gtk::Box { AppState::ChooseInstance => gtk::Box {
#[local_ref] #[local_ref]
instances_page -> gtk::Box {} instances_page -> gtk::Box {}
}, }
AppState::Login => gtk::Box { AppState::Login => gtk::Box {
#[local_ref] #[local_ref]
login_page -> gtk::Box {} login_page -> gtk::Box {}
}, }
AppState::Communities => gtk::Box { AppState::Communities => gtk::Box {
#[local_ref] #[local_ref]
communities_page -> gtk::Box {} communities_page -> gtk::Box {}
} }
AppState::Person => { AppState::Person => {
gtk::Box { gtk::Box {
#[local_ref] #[local_ref]
@ -196,6 +204,12 @@ impl SimpleComponent for App {
inbox_page -> gtk::Box {} inbox_page -> gtk::Box {}
} }
} }
AppState::Saved => {
gtk::Box {
#[local_ref]
saved_page -> gtk::ScrolledWindow {}
}
}
AppState::AccountsPage => { AppState::AccountsPage => {
gtk::Box { gtk::Box {
#[local_ref] #[local_ref]
@ -238,7 +252,7 @@ impl SimpleComponent for App {
.launch(()) .launch(())
.forward(sender.input_sender(), |msg| msg); .forward(sender.input_sender(), |msg| msg);
let profile_page = ProfilePage::builder() let profile_page = ProfilePage::builder()
.launch(default_person()) .launch((default_person(), false))
.forward(sender.input_sender(), |msg| msg); .forward(sender.input_sender(), |msg| msg);
let community_page = CommunityPage::builder() let community_page = CommunityPage::builder()
.launch(default_community().community_view) .launch(default_community().community_view)
@ -261,6 +275,9 @@ impl SimpleComponent for App {
let accounts_page = AccountsPage::builder() let accounts_page = AccountsPage::builder()
.launch(()) .launch(())
.forward(sender.input_sender(), |msg| msg); .forward(sender.input_sender(), |msg| msg);
let saved_page = ProfilePage::builder()
.launch((default_person(), true))
.forward(sender.input_sender(), |msg| msg);
let model = App { let model = App {
state, state,
@ -277,6 +294,7 @@ impl SimpleComponent for App {
accounts_page, accounts_page,
message: None, message: None,
about_dialog, about_dialog,
saved_page,
}; };
// fetch posts if that's the initial page // fetch posts if that's the initial page
@ -294,6 +312,7 @@ impl SimpleComponent for App {
let communities_page = model.communities_page.widget(); let communities_page = model.communities_page.widget();
let login_page = model.login_page.widget(); let login_page = model.login_page.widget();
let accounts_page = model.accounts_page.widget(); let accounts_page = model.accounts_page.widget();
let saved_page = model.saved_page.widget();
let widgets = view_output!(); let widgets = view_output!();
@ -420,6 +439,13 @@ impl SimpleComponent for App {
self.state = AppState::Inbox; self.state = AppState::Inbox;
self.inbox_page.sender().emit(InboxInput::FetchInbox); self.inbox_page.sender().emit(InboxInput::FetchInbox);
} }
AppMsg::OpenSaved => {
let person_id = PersonId(settings::get_current_account().id);
self.state = AppState::Loading;
self.saved_page
.sender()
.emit(ProfileInput::FetchPerson(Some(person_id)));
}
AppMsg::LoggedIn => { AppMsg::LoggedIn => {
self.logged_in = true; self.logged_in = true;
self.back_queue.clear(); self.back_queue.clear();