From 37a9cc244f858cdd6dc3342dbe7f87d7ea4b5e46 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 22 Jun 2023 16:16:15 +0200 Subject: [PATCH] Hide all actions that require an account while logged out --- src/components/community_page.rs | 14 ++++++++----- src/components/post_page.rs | 12 +++++++---- src/components/voting_row.rs | 2 ++ src/main.rs | 36 ++++++++++++++++++++++---------- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/components/community_page.rs b/src/components/community_page.rs index a995b5e..8edd327 100644 --- a/src/components/community_page.rs +++ b/src/components/community_page.rs @@ -4,7 +4,7 @@ use relm4::{prelude::*, factory::FactoryVecDeque, MessageBroker}; use gtk::prelude::*; use relm4_components::web_image::WebImage; -use crate::{api, util::get_web_image_msg}; +use crate::{api, util::get_web_image_msg, settings}; use super::post_row::PostRow; @@ -96,10 +96,14 @@ impl SimpleComponent for CommunityPage { set_margin_start: 10, }, - gtk::Button { - set_label: "Create post", - set_margin_start: 10, - connect_clicked => CommunityInput::OpenCreatePostDialog, + if settings::get_current_account().jwt.is_some() { + gtk::Button { + set_label: "Create post", + set_margin_start: 10, + connect_clicked => CommunityInput::OpenCreatePostDialog, + } + } else { + gtk::Box {} } }, diff --git a/src/components/post_page.rs b/src/components/post_page.rs index 211b16f..30e3f98 100644 --- a/src/components/post_page.rs +++ b/src/components/post_page.rs @@ -161,10 +161,14 @@ impl SimpleComponent for PostPage { #[watch] set_text: &format!("{} comments", model.info.post_view.counts.comments), }, - gtk::Button { - set_label: "Comment", - set_margin_start: 10, - connect_clicked => PostInput::OpenCreateCommentDialog, + if settings::get_current_account().jwt.is_some() { + gtk::Button { + set_label: "Comment", + set_margin_start: 10, + connect_clicked => PostInput::OpenCreateCommentDialog, + } + } else { + gtk::Box {} } }, diff --git a/src/components/voting_row.rs b/src/components/voting_row.rs index 67669dc..f370ca6 100644 --- a/src/components/voting_row.rs +++ b/src/components/voting_row.rs @@ -73,6 +73,7 @@ impl SimpleComponent for VotingRowModel { gtk::ToggleButton { set_icon_name: "go-up", connect_clicked => VotingRowInput::Vote(1), + #[watch] set_active: model.stats.own_vote == Some(1), }, gtk::Label { @@ -84,6 +85,7 @@ impl SimpleComponent for VotingRowModel { gtk::ToggleButton { set_icon_name: "go-down", connect_clicked => VotingRowInput::Vote(-1), + #[watch] set_active: model.stats.own_vote == Some(-1), } } diff --git a/src/main.rs b/src/main.rs index 7ad3b27..5152058 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ use components::{post_row::PostRow, community_row::CommunityRow, profile_page::{ use gtk::prelude::*; use lemmy_api_common::{lemmy_db_views_actor::structs::CommunityView, lemmy_db_views::structs::PostView, person::GetPersonDetailsResponse, lemmy_db_schema::{newtypes::PostId, ListingType}, post::GetPostResponse, community::GetCommunityResponse}; use relm4::{prelude::*, factory::FactoryVecDeque, set_global_css, actions::{RelmAction, RelmActionGroup}}; +use settings::get_current_account; static APP_ID: &str = "com.lemmy-gtk.lemoa"; @@ -35,7 +36,8 @@ struct App { profile_page: Controller, community_page: Controller, post_page: Controller, - inbox_page: Controller + inbox_page: Controller, + logged_in: bool, } #[derive(Debug, Clone)] @@ -43,6 +45,7 @@ pub enum AppMsg { ChooseInstance, ShowLogin, Login(String, String), + LoggedIn, Logout, Retry, ShowMessage(String), @@ -82,17 +85,21 @@ impl SimpleComponent for App { set_label: "Recommended", connect_clicked => AppMsg::StartFetchPosts(None), }, + pack_start = >k::Button { + set_label: "Communities", + connect_clicked => AppMsg::ViewCommunities(None), + }, pack_start = >k::Button { set_label: "Subscribed", connect_clicked => AppMsg::StartFetchPosts(Some(ListingType::Subscribed)), + #[watch] + set_visible: model.logged_in, }, pack_start = >k::Button { set_label: "Inbox", connect_clicked => AppMsg::OpenInbox, - }, - pack_start = >k::Button { - set_label: "Communities", - connect_clicked => AppMsg::ViewCommunities(None), + #[watch] + set_visible: model.logged_in, }, }, @@ -279,8 +286,9 @@ impl SimpleComponent for App { root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { - let instance_url = settings::get_current_account().instance_url; - let state = if instance_url.is_empty() { AppState::ChooseInstance } else { AppState::Loading }; + let current_account = settings::get_current_account(); + let state = if current_account.instance_url.is_empty() { AppState::ChooseInstance } else { AppState::Loading }; + let logged_in = current_account.jwt.is_some(); // initialize all controllers and factories let posts = FactoryVecDeque::new(gtk::Box::default(), sender.input_sender()); @@ -290,10 +298,10 @@ impl SimpleComponent for App { let post_page = PostPage::builder().launch(default_post()).forward(sender.input_sender(), |msg| msg); let inbox_page = InboxPage::builder().launch(()).forward(sender.input_sender(), |msg| msg); - let model = App { state, posts, communities, profile_page, community_page, post_page, inbox_page, message: None, latest_action: None }; + let model = App { state, logged_in, posts, communities, profile_page, community_page, post_page, inbox_page, message: None, latest_action: None }; // fetch posts if that's the initial page - if !instance_url.is_empty() { sender.input(AppMsg::StartFetchPosts(None)) }; + if !current_account.instance_url.is_empty() { sender.input(AppMsg::StartFetchPosts(None)) }; // setup all widgets and different stack pages let posts_box = model.posts.widget(); @@ -320,7 +328,7 @@ impl SimpleComponent for App { login_sender.input(AppMsg::ShowLogin); }); let logout_action: RelmAction = RelmAction::new_stateless(move |_| { - sender.input(AppMsg::ChooseInstance); + sender.input(AppMsg::Logout); }); let mut group = RelmActionGroup::::new(); @@ -426,6 +434,7 @@ impl SimpleComponent for App { self.state = AppState::Login; } AppMsg::Login(username, password) => { + if get_current_account().instance_url.is_empty() { return; } self.state = AppState::Loading; std::thread::spawn(move || { let message = match api::auth::login(username, password) { @@ -440,7 +449,7 @@ impl SimpleComponent for App { account.id = user.id.0; settings::update_current_account(account); } - AppMsg::StartFetchPosts(None) + AppMsg::LoggedIn } else { AppMsg::ShowMessage("Wrong credentials!".to_string()) } @@ -454,6 +463,7 @@ impl SimpleComponent for App { let mut account = settings::get_current_account(); account.jwt = None; settings::update_current_account(account); + self.logged_in = false; } AppMsg::ShowMessage(message) => { self.message = Some(message); @@ -465,6 +475,10 @@ impl SimpleComponent for App { AppMsg::OpenInbox => { self.state = AppState::Inbox; } + AppMsg::LoggedIn => { + self.logged_in = true; + sender.input(AppMsg::StartFetchPosts(None)); + } } } }