support for viewing saved posts and comments
This commit is contained in:
parent
900928be71
commit
2f4485620f
|
@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
38
src/main.rs
38
src/main.rs
|
@ -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 = >k::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();
|
||||||
|
|
Loading…
Reference in New Issue