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::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;
|
||||||
|
|
||||||
|
|
|
@ -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()));
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
20
src/main.rs
20
src/main.rs
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue