Support for viewing the next pages of a profile

This commit is contained in:
Bnyro 2023-07-02 11:30:04 +02:00
parent f8f5c80450
commit 41e84f0995
3 changed files with 45 additions and 28 deletions

View File

@ -14,7 +14,6 @@ use crate::util;
use crate::util::get_web_image_url; use crate::util::get_web_image_url;
use crate::util::markdown_to_pango_markup; use crate::util::markdown_to_pango_markup;
use super::post_page::PostPageInput;
use super::voting_row::VotingRowModel; use super::voting_row::VotingRowModel;
use super::voting_row::VotingStats; use super::voting_row::VotingStats;

View File

@ -1,5 +1,5 @@
use gtk::prelude::*; use gtk::prelude::*;
use lemmy_api_common::person::GetPersonDetailsResponse; use lemmy_api_common::{person::GetPersonDetailsResponse, lemmy_db_schema::newtypes::PersonId};
use relm4::{factory::FactoryVecDeque, prelude::*}; use relm4::{factory::FactoryVecDeque, prelude::*};
use relm4_components::web_image::WebImage; use relm4_components::web_image::WebImage;
@ -23,11 +23,13 @@ pub struct ProfilePage {
comments: FactoryVecDeque<CommentRow>, comments: FactoryVecDeque<CommentRow>,
communities: FactoryVecDeque<CommunityRow>, communities: FactoryVecDeque<CommunityRow>,
editor_dialog: Controller<EditorDialog>, editor_dialog: Controller<EditorDialog>,
current_profile_page: i64,
} }
#[derive(Debug)] #[derive(Debug)]
pub enum ProfileInput { pub enum ProfileInput {
UpdatePerson(GetPersonDetailsResponse), FetchPerson(Option<PersonId>),
UpdatePerson(GetPersonDetailsResponse, bool),
SendMessageRequest, SendMessageRequest,
SendMessage(String), SendMessage(String),
} }
@ -116,6 +118,12 @@ impl SimpleComponent for ProfilePage {
} -> { } -> {
set_title: "Moderates", set_title: "Moderates",
}, },
},
gtk::Button {
set_label: "More",
set_margin_all: 10,
connect_clicked => ProfileInput::FetchPerson(None),
} }
} }
@ -145,6 +153,7 @@ impl SimpleComponent for ProfilePage {
comments, comments,
communities, communities,
editor_dialog, editor_dialog,
current_profile_page: 1,
}; };
let avatar = model.avatar.widget(); let avatar = model.avatar.widget();
let posts = model.posts.widget(); let posts = model.posts.widget();
@ -155,16 +164,20 @@ impl SimpleComponent for ProfilePage {
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) { fn update(&mut self, message: Self::Input, sender: ComponentSender<Self>) {
match message { match message {
ProfileInput::UpdatePerson(person) => { ProfileInput::UpdatePerson(person, clear) => {
self.info = person.clone(); sender.output_sender().emit(crate::AppMsg::UpdateState(crate::AppState::Person));
self.avatar
.emit(get_web_image_msg(person.person_view.person.avatar));
self.posts.guard().clear(); if clear {
self.comments.guard().clear(); self.info = person.clone();
self.communities.guard().clear(); self.avatar
.emit(get_web_image_msg(person.person_view.person.avatar));
self.posts.guard().clear();
self.comments.guard().clear();
self.communities.guard().clear();
}
for post in person.posts { for post in person.posts {
self.posts.guard().push_back(post); self.posts.guard().push_back(post);
@ -180,6 +193,25 @@ impl SimpleComponent for ProfilePage {
let _ = api::private_message::create_private_message(content, profile_id); let _ = api::private_message::create_private_message(content, profile_id);
}); });
} }
ProfileInput::FetchPerson(person_id) => {
let page = if person_id.is_some() {
1
} else {
self.current_profile_page + 1
};
self.current_profile_page = page;
let person_id = person_id.unwrap_or(self.info.person_view.person.id);
std::thread::spawn(move || {
match api::user::get_user(person_id, page) {
Ok(person) => {
sender.input(ProfileInput::UpdatePerson(person, page == 1));
},
Err(err) => {
sender.output_sender().emit(crate::AppMsg::ShowMessage(err.to_string()));
},
};
});
}
} }
} }
} }

View File

@ -13,7 +13,7 @@ use components::{
instances_page::{InstancesPage, InstancesPageInput}, instances_page::{InstancesPage, InstancesPageInput},
post_page::{self, PostPage}, post_page::{self, PostPage},
post_row::PostRow, post_row::PostRow,
profile_page::{self, ProfilePage}, profile_page::{ProfilePage, ProfileInput},
}; };
use dialogs::about::AboutDialog; use dialogs::about::AboutDialog;
use gtk::prelude::*; use gtk::prelude::*;
@ -24,7 +24,6 @@ use lemmy_api_common::{
ListingType, ListingType,
}, },
lemmy_db_views::structs::PostView, lemmy_db_views::structs::PostView,
person::GetPersonDetailsResponse,
post::GetPostResponse, post::GetPostResponse,
}; };
use relm4::{ use relm4::{
@ -80,7 +79,6 @@ pub enum AppMsg {
OpenCommunity(CommunityId), OpenCommunity(CommunityId),
DoneFetchCommunity(GetCommunityResponse), DoneFetchCommunity(GetCommunityResponse),
OpenPerson(PersonId), OpenPerson(PersonId),
DoneFetchPerson(GetPersonDetailsResponse),
OpenPost(PostId), OpenPost(PostId),
DoneFetchPost(GetPostResponse), DoneFetchPost(GetPostResponse),
OpenInbox, OpenInbox,
@ -354,7 +352,7 @@ impl SimpleComponent for App {
match msg { match msg {
AppMsg::OpenCommunities AppMsg::OpenCommunities
| AppMsg::DoneFetchCommunity(_) | AppMsg::DoneFetchCommunity(_)
| AppMsg::DoneFetchPerson(_) | AppMsg::OpenPerson(_)
| AppMsg::DoneFetchPost(_) | AppMsg::DoneFetchPost(_)
| AppMsg::DoneFetchPosts(_) | AppMsg::DoneFetchPosts(_)
| AppMsg::ShowMessage(_) => self.back_queue.push(msg.clone()), | AppMsg::ShowMessage(_) => self.back_queue.push(msg.clone()),
@ -408,19 +406,7 @@ impl SimpleComponent for App {
} }
AppMsg::OpenPerson(person_id) => { AppMsg::OpenPerson(person_id) => {
self.state = AppState::Loading; self.state = AppState::Loading;
std::thread::spawn(move || { self.profile_page.sender().emit(ProfileInput::FetchPerson(Some(person_id)));
let message = match api::user::get_user(person_id, 1) {
Ok(person) => AppMsg::DoneFetchPerson(person),
Err(err) => AppMsg::ShowMessage(err.to_string()),
};
sender.input(message);
});
}
AppMsg::DoneFetchPerson(person) => {
self.profile_page
.sender()
.emit(profile_page::ProfileInput::UpdatePerson(person));
self.state = AppState::Person;
} }
AppMsg::OpenCommunity(community_id) => { AppMsg::OpenCommunity(community_id) => {
self.state = AppState::Loading; self.state = AppState::Loading;