feat(community): option to set the sort order of posts
This commit is contained in:
parent
b96ad40fb4
commit
807c0e9051
|
@ -4,7 +4,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use lemmy_api_common::{
|
use lemmy_api_common::{
|
||||||
lemmy_db_schema::SubscribedType, lemmy_db_views::structs::PostView,
|
lemmy_db_schema::{SubscribedType, SortType}, lemmy_db_views::structs::PostView,
|
||||||
lemmy_db_views_actor::structs::CommunityView,
|
lemmy_db_views_actor::structs::CommunityView,
|
||||||
};
|
};
|
||||||
use relm4::{factory::FactoryVecDeque, prelude::*};
|
use relm4::{factory::FactoryVecDeque, prelude::*};
|
||||||
|
@ -12,14 +12,16 @@ use relm4_components::web_image::WebImage;
|
||||||
|
|
||||||
use crate::{api, settings, util::get_web_image_msg};
|
use crate::{api, settings, util::get_web_image_msg};
|
||||||
|
|
||||||
use super::post_row::PostRow;
|
use super::{post_row::PostRow, sort_dropdown::{SortDropdown, SortDropdownOutput}};
|
||||||
|
|
||||||
pub struct CommunityPage {
|
pub struct CommunityPage {
|
||||||
info: CommunityView,
|
info: CommunityView,
|
||||||
avatar: Controller<WebImage>,
|
avatar: Controller<WebImage>,
|
||||||
|
sort_dropdown: Controller<SortDropdown>,
|
||||||
posts: FactoryVecDeque<PostRow>,
|
posts: FactoryVecDeque<PostRow>,
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
create_post_dialog: Controller<EditorDialog>,
|
create_post_dialog: Controller<EditorDialog>,
|
||||||
|
current_sort_type: SortType,
|
||||||
current_posts_page: i64,
|
current_posts_page: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +35,7 @@ pub enum CommunityInput {
|
||||||
CreatedPost(PostView),
|
CreatedPost(PostView),
|
||||||
ToggleSubscription,
|
ToggleSubscription,
|
||||||
UpdateSubscriptionState(SubscribedType),
|
UpdateSubscriptionState(SubscribedType),
|
||||||
|
UpdateOrder(SortType),
|
||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +120,12 @@ impl SimpleComponent for CommunityPage {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
sort_dropdown -> gtk::DropDown {
|
||||||
|
set_margin_top: 10,
|
||||||
|
set_halign: gtk::Align::Start,
|
||||||
|
},
|
||||||
|
|
||||||
gtk::Separator {
|
gtk::Separator {
|
||||||
set_margin_top: 10,
|
set_margin_top: 10,
|
||||||
},
|
},
|
||||||
|
@ -143,6 +152,11 @@ impl SimpleComponent for CommunityPage {
|
||||||
) -> relm4::ComponentParts<Self> {
|
) -> relm4::ComponentParts<Self> {
|
||||||
let avatar = WebImage::builder().launch("".to_string()).detach();
|
let avatar = WebImage::builder().launch("".to_string()).detach();
|
||||||
let posts = FactoryVecDeque::new(gtk::Box::default(), sender.output_sender());
|
let posts = FactoryVecDeque::new(gtk::Box::default(), sender.output_sender());
|
||||||
|
let sort_dropdown = SortDropdown::builder().launch(()).forward(sender.input_sender(), |msg| {
|
||||||
|
match msg {
|
||||||
|
SortDropdownOutput::New(sort_order) => CommunityInput::UpdateOrder(sort_order),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let dialog = EditorDialog::builder()
|
let dialog = EditorDialog::builder()
|
||||||
.transient_for(root)
|
.transient_for(root)
|
||||||
|
@ -155,11 +169,14 @@ impl SimpleComponent for CommunityPage {
|
||||||
let model = CommunityPage {
|
let model = CommunityPage {
|
||||||
info: init,
|
info: init,
|
||||||
avatar,
|
avatar,
|
||||||
|
sort_dropdown,
|
||||||
posts,
|
posts,
|
||||||
create_post_dialog: dialog,
|
create_post_dialog: dialog,
|
||||||
|
current_sort_type: SortType::Hot,
|
||||||
current_posts_page: 0,
|
current_posts_page: 0,
|
||||||
};
|
};
|
||||||
let avatar = model.avatar.widget();
|
let avatar = model.avatar.widget();
|
||||||
|
let sort_dropdown = model.sort_dropdown.widget();
|
||||||
let posts = model.posts.widget();
|
let posts = model.posts.widget();
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
|
@ -181,10 +198,11 @@ impl SimpleComponent for CommunityPage {
|
||||||
}
|
}
|
||||||
CommunityInput::FetchPosts => {
|
CommunityInput::FetchPosts => {
|
||||||
let name = self.info.community.name.clone();
|
let name = self.info.community.name.clone();
|
||||||
|
let sort_type = self.current_sort_type;
|
||||||
self.current_posts_page += 1;
|
self.current_posts_page += 1;
|
||||||
let page = self.current_posts_page;
|
let page = self.current_posts_page;
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
let community_posts = api::posts::list_posts(page, Some(name), None, None);
|
let community_posts = api::posts::list_posts(page, Some(name), None, Some(sort_type));
|
||||||
if let Ok(community_posts) = community_posts {
|
if let Ok(community_posts) = community_posts {
|
||||||
sender.input(CommunityInput::DoneFetchPosts(community_posts));
|
sender.input(CommunityInput::DoneFetchPosts(community_posts));
|
||||||
}
|
}
|
||||||
|
@ -238,6 +256,12 @@ impl SimpleComponent for CommunityPage {
|
||||||
CommunityInput::UpdateSubscriptionState(state) => {
|
CommunityInput::UpdateSubscriptionState(state) => {
|
||||||
self.info.subscribed = state;
|
self.info.subscribed = state;
|
||||||
}
|
}
|
||||||
|
CommunityInput::UpdateOrder(sort_order) => {
|
||||||
|
self.current_sort_type = sort_order;
|
||||||
|
self.current_posts_page = 0;
|
||||||
|
self.posts.guard().clear();
|
||||||
|
sender.input_sender().emit(CommunityInput::FetchPosts);
|
||||||
|
}
|
||||||
CommunityInput::None => {}
|
CommunityInput::None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,5 +15,5 @@ pub mod post_row;
|
||||||
pub mod posts_page;
|
pub mod posts_page;
|
||||||
pub mod private_message_row;
|
pub mod private_message_row;
|
||||||
pub mod profile_page;
|
pub mod profile_page;
|
||||||
pub mod sort_dropown;
|
pub mod sort_dropdown;
|
||||||
pub mod voting_row;
|
pub mod voting_row;
|
||||||
|
|
|
@ -4,7 +4,7 @@ use relm4::{factory::FactoryVecDeque, prelude::*};
|
||||||
|
|
||||||
use crate::api;
|
use crate::api;
|
||||||
|
|
||||||
use super::{post_row::PostRow, sort_dropown::{SortDropdown, SortDropdownOutput}};
|
use super::{post_row::PostRow, sort_dropdown::{SortDropdown, SortDropdownOutput}};
|
||||||
|
|
||||||
pub struct PostsPage {
|
pub struct PostsPage {
|
||||||
sort_dropdown: Controller<SortDropdown>,
|
sort_dropdown: Controller<SortDropdown>,
|
||||||
|
@ -63,7 +63,9 @@ impl SimpleComponent for PostsPage {
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
sort_dropdown -> gtk::DropDown {},
|
sort_dropdown -> gtk::DropDown {
|
||||||
|
set_margin_end: 10,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
posts_box -> gtk::Box {
|
posts_box -> gtk::Box {
|
||||||
|
|
Loading…
Reference in New Issue