diff --git a/src/components/comment_row.rs b/src/components/comment_row.rs index 5b8b47d..460ca38 100644 --- a/src/components/comment_row.rs +++ b/src/components/comment_row.rs @@ -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; diff --git a/src/components/profile_page.rs b/src/components/profile_page.rs index 3737dc2..07ef382 100644 --- a/src/components/profile_page.rs +++ b/src/components/profile_page.rs @@ -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, communities: FactoryVecDeque, editor_dialog: Controller, + current_profile_page: i64, } #[derive(Debug)] pub enum ProfileInput { - UpdatePerson(GetPersonDetailsResponse), + FetchPerson(Option), + 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) { + fn update(&mut self, message: Self::Input, sender: ComponentSender) { 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())); + }, + }; + }); + } } } } diff --git a/src/main.rs b/src/main.rs index ad247cf..e89ab59 100644 --- a/src/main.rs +++ b/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;