notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit dda7256f51426624fbaa486034d728de07f4c245
parent ee0029268f1b16f26383b710e760abce3060c1c8
Author: kernelkind <kernelkind@gmail.com>
Date:   Sat,  7 Sep 2024 21:06:30 -0400

add LoginState to app

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Msrc/app.rs | 4++++
Msrc/login_manager.rs | 18++++++++++++++----
Msrc/ui/account_login_view.rs | 73++++++++++++++++++++++++++++++-------------------------------------------
3 files changed, 48 insertions(+), 47 deletions(-)

diff --git a/src/app.rs b/src/app.rs @@ -10,6 +10,7 @@ use crate::filter::FilterState; use crate::frame_history::FrameHistory; use crate::imgcache::ImageCache; use crate::key_storage::KeyStorageType; +use crate::login_manager::LoginState; use crate::note::NoteRef; use crate::notecache::{CachedNote, NoteCache}; use crate::relay_pool_manager::RelayPoolManager; @@ -57,6 +58,7 @@ pub struct Damus { pub threads: Threads, pub img_cache: ImageCache, pub accounts: AccountManager, + pub login_state: LoginState, pub subscriptions: Subscriptions, frame_history: crate::frame_history::FrameHistory, @@ -700,6 +702,7 @@ impl Damus { frame_history: FrameHistory::default(), show_account_switcher: false, account_management_view_state: RoutableWidgetState::default(), + login_state: LoginState::default(), } } @@ -743,6 +746,7 @@ impl Damus { frame_history: FrameHistory::default(), show_account_switcher: false, account_management_view_state: RoutableWidgetState::default(), + login_state: LoginState::default(), } } diff --git a/src/login_manager.rs b/src/login_manager.rs @@ -6,20 +6,22 @@ use poll_promise::Promise; /// The UI view interface to log in to a nostr account. #[derive(Default)] -pub struct LoginManager { +pub struct LoginState { login_key: String, promise_query: Option<(String, Promise<Result<Keypair, LoginError>>)>, error: Option<LoginError>, key_on_error: Option<String>, + should_create_new: bool, } -impl<'a> LoginManager { +impl<'a> LoginState { pub fn new() -> Self { - LoginManager { + LoginState { login_key: String::new(), promise_query: None, error: None, key_on_error: None, + should_create_new: false, } } @@ -85,6 +87,14 @@ impl<'a> LoginManager { } None } + + pub fn should_create_new(&mut self) { + self.should_create_new = true; + } + + pub fn check_for_create_new(&self) -> bool { + self.should_create_new + } } #[cfg(test)] @@ -96,7 +106,7 @@ mod tests { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_retrieve_key() { - let mut manager = LoginManager::new(); + let mut manager = LoginState::new(); let expected_str = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"; let expected_key = Keypair::only_pubkey(Pubkey::from_hex(expected_str).unwrap()); diff --git a/src/ui/account_login_view.rs b/src/ui/account_login_view.rs @@ -1,29 +1,32 @@ use crate::app_style::NotedeckTextStyle; use crate::key_parsing::LoginError; -use crate::login_manager::LoginManager; +use crate::login_manager::LoginState; use crate::ui::{Preview, PreviewConfig, View}; -use egui::{Align, Button, Color32, Frame, Margin, Response, RichText, Ui, Vec2}; -use egui::{Image, TextEdit}; +use egui::TextEdit; +use egui::{Align, Button, Color32, Frame, InnerResponse, Margin, RichText, Vec2}; +use enostr::Keypair; pub struct AccountLoginView<'a> { - manager: &'a mut LoginManager, + manager: &'a mut LoginState, +} + +pub enum AccountLoginResponse { + CreateNew, + LoginWith(Keypair), } impl<'a> AccountLoginView<'a> { - pub fn new(manager: &'a mut LoginManager) -> Self { - AccountLoginView { manager } + pub fn new(state: &'a mut LoginState) -> Self { + AccountLoginView { manager: state } } - pub fn ui(&mut self, ui: &mut egui::Ui) -> Response { + pub fn ui(&mut self, ui: &mut egui::Ui) -> InnerResponse<Option<AccountLoginResponse>> { Frame::none() .outer_margin(12.0) - .show(ui, |ui| { - self.show(ui); - }) - .response + .show(ui, |ui| self.show(ui)) } - fn show(&mut self, ui: &mut egui::Ui) -> egui::Response { + fn show(&mut self, ui: &mut egui::Ui) -> Option<AccountLoginResponse> { ui.vertical(|ui| { ui.vertical_centered(|ui| { ui.add_space(32.0); @@ -55,11 +58,19 @@ impl<'a> AccountLoginView<'a> { .add(Button::new(RichText::new("Create Account")).frame(false)) .clicked() { - // TODO: navigate to 'create account' screen + self.manager.should_create_new(); } }); - }) - .response + }); + + if self.manager.check_for_create_new() { + return Some(AccountLoginResponse::CreateNew); + } + + if let Some(keypair) = self.manager.check_for_successful_login() { + return Some(AccountLoginResponse::LoginWith(keypair)); + } + None } fn loading_and_error(&mut self, ui: &mut egui::Ui) { @@ -99,37 +110,12 @@ fn login_title_text() -> RichText { .strong() } -fn login_info_text() -> RichText { - RichText::new("The best alternative to tweetDeck built in nostr protocol") - .text_style(NotedeckTextStyle::Heading3.text_style()) -} - -fn login_window_info_text(ui: &Ui) -> RichText { - RichText::new("Enter your private key to start using Notedeck") - .text_style(NotedeckTextStyle::Body.text_style()) - .color(ui.visuals().noninteractive().fg_stroke.color) -} - fn login_textedit_info_text() -> RichText { RichText::new("Enter your key") .strong() .text_style(NotedeckTextStyle::Body.text_style()) } -fn logo_unformatted() -> Image<'static> { - let logo_gradient_data = egui::include_image!("../../assets/Logo-Gradient-2x.png"); - return egui::Image::new(logo_gradient_data); -} - -fn generate_info_text() -> RichText { - RichText::new("Quickly generate your keys. Make sure you save them safely.") - .text_style(NotedeckTextStyle::Body.text_style()) -} - -fn generate_keys_button() -> Button<'static> { - Button::new(RichText::new("Generate keys").text_style(NotedeckTextStyle::Body.text_style())) -} - fn login_button() -> Button<'static> { Button::new( RichText::new("Login now — let's do this!") @@ -140,7 +126,7 @@ fn login_button() -> Button<'static> { .min_size(Vec2::new(0.0, 40.0)) } -fn login_textedit(manager: &mut LoginManager) -> TextEdit { +fn login_textedit(manager: &mut LoginState) -> TextEdit { manager.get_login_textedit(|text| { egui::TextEdit::singleline(text) .hint_text( @@ -156,7 +142,7 @@ mod preview { use super::*; pub struct AccountLoginPreview { - manager: LoginManager, + manager: LoginState, } impl View for AccountLoginPreview { @@ -169,7 +155,8 @@ mod preview { type Prev = AccountLoginPreview; fn preview(cfg: PreviewConfig) -> Self::Prev { - let manager = LoginManager::new(); + let _ = cfg; + let manager = LoginState::new(); AccountLoginPreview { manager } } }