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::markdown_to_pango_markup;
use super::post_page::PostPageInput;
use super::voting_row::VotingRowModel;
use super::voting_row::VotingStats;

View File

@ -1,5 +1,5 @@
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_components::web_image::WebImage;
@ -23,11 +23,13 @@ pub struct ProfilePage {
comments: FactoryVecDeque<CommentRow>,
communities: FactoryVecDeque<CommunityRow>,
editor_dialog: Controller<EditorDialog>,
current_profile_page: i64,
}
#[derive(Debug)]
pub enum ProfileInput {
UpdatePerson(GetPersonDetailsResponse),
FetchPerson(Option<PersonId>),
UpdatePerson(GetPersonDetailsResponse, bool),
SendMessageRequest,
SendMessage(String),
}
@ -116,6 +118,12 @@ impl SimpleComponent for ProfilePage {
} -> {
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,
communities,
editor_dialog,
current_profile_page: 1,
};
let avatar = model.avatar.widget();
let posts = model.posts.widget();
@ -155,16 +164,20 @@ impl SimpleComponent for ProfilePage {
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 {
ProfileInput::UpdatePerson(person) => {
self.info = person.clone();
self.avatar
.emit(get_web_image_msg(person.person_view.person.avatar));
ProfileInput::UpdatePerson(person, clear) => {
sender.output_sender().emit(crate::AppMsg::UpdateState(crate::AppState::Person));
self.posts.guard().clear();
self.comments.guard().clear();
self.communities.guard().clear();
if clear {
self.info = person.clone();
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 {
self.posts.guard().push_back(post);
@ -180,6 +193,25 @@ impl SimpleComponent for ProfilePage {
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},
post_page::{self, PostPage},
post_row::PostRow,
profile_page::{self, ProfilePage},
profile_page::{ProfilePage, ProfileInput},
};
use dialogs::about::AboutDialog;
use gtk::prelude::*;
@ -24,7 +24,6 @@ use lemmy_api_common::{
ListingType,
},
lemmy_db_views::structs::PostView,
person::GetPersonDetailsResponse,
post::GetPostResponse,
};
use relm4::{
@ -80,7 +79,6 @@ pub enum AppMsg {
OpenCommunity(CommunityId),
DoneFetchCommunity(GetCommunityResponse),
OpenPerson(PersonId),
DoneFetchPerson(GetPersonDetailsResponse),
OpenPost(PostId),
DoneFetchPost(GetPostResponse),
OpenInbox,
@ -354,7 +352,7 @@ impl SimpleComponent for App {
match msg {
AppMsg::OpenCommunities
| AppMsg::DoneFetchCommunity(_)
| AppMsg::DoneFetchPerson(_)
| AppMsg::OpenPerson(_)
| AppMsg::DoneFetchPost(_)
| AppMsg::DoneFetchPosts(_)
| AppMsg::ShowMessage(_) => self.back_queue.push(msg.clone()),
@ -408,19 +406,7 @@ impl SimpleComponent for App {
}
AppMsg::OpenPerson(person_id) => {
self.state = AppState::Loading;
std::thread::spawn(move || {
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;
self.profile_page.sender().emit(ProfileInput::FetchPerson(Some(person_id)));
}
AppMsg::OpenCommunity(community_id) => {
self.state = AppState::Loading;