Support for viewing the next pages of a profile
This commit is contained in:
parent
f8f5c80450
commit
41e84f0995
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,9 +164,12 @@ 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) => {
|
||||
ProfileInput::UpdatePerson(person, clear) => {
|
||||
sender.output_sender().emit(crate::AppMsg::UpdateState(crate::AppState::Person));
|
||||
|
||||
if clear {
|
||||
self.info = person.clone();
|
||||
self.avatar
|
||||
.emit(get_web_image_msg(person.person_view.person.avatar));
|
||||
|
@ -165,6 +177,7 @@ impl SimpleComponent for ProfilePage {
|
|||
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()));
|
||||
},
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
20
src/main.rs
20
src/main.rs
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue