notedeck

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

commit d092f5c23e7843da4919531f10a31a71f2a09b82
parent b9cfe87974038a3eda79a40e728f37da2f2a26ed
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu, 26 Jun 2025 14:24:31 -0400

move switching related actions from notedeck -> columns

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

Diffstat:
Mcrates/notedeck/src/account/accounts.rs | 59++++++++++++-----------------------------------------------
Mcrates/notedeck/src/app.rs | 7++++---
Mcrates/notedeck/src/lib.rs | 4+---
Mcrates/notedeck_columns/src/accounts/mod.rs | 65++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mcrates/notedeck_columns/src/app.rs | 8+++++---
Mcrates/notedeck_columns/src/nav.rs | 15++++++---------
6 files changed, 86 insertions(+), 72 deletions(-)

diff --git a/crates/notedeck/src/account/accounts.rs b/crates/notedeck/src/account/accounts.rs @@ -143,7 +143,7 @@ impl Accounts { } #[must_use = "UnknownIdAction's must be handled. Use .process_unknown_id_action()"] - pub fn add_account(&mut self, key: Keypair) -> AddAccountAction { + pub fn add_account(&mut self, key: Keypair) -> Option<AddAccountResponse> { let pubkey = key.pubkey; let switch_to_index = if let Some(contains_acc) = self.contains_account(pubkey.bytes()) { if key.secret_key.is_some() && !contains_acc.has_nsec { @@ -174,14 +174,10 @@ impl Accounts { self.accounts.len() - 1 }; - let source: Option<usize> = None; - AddAccountAction { - accounts_action: Some(AccountsAction::Switch(SwitchAccountAction::new( - source, - switch_to_index, - ))), + Some(AddAccountResponse { + switch_to: switch_to_index, unk_id_action: SingleUnkIdAction::pubkey(pubkey), - } + }) } /// Update the `UserAccount` via callback and save the result to disk. @@ -356,8 +352,9 @@ impl Accounts { } fn handle_no_accounts(&mut self, unknown_ids: &mut UnknownIds, ndb: &Ndb, txn: &Transaction) { - self.add_account(Keypair::new(self.fallback, None)) - .process_action(unknown_ids, ndb, txn); + if let Some(resp) = self.add_account(Keypair::new(self.fallback, None)) { + resp.unk_id_action.process_action(unknown_ids, ndb, txn); + } self.select_account(self.num_accounts() - 1); } @@ -609,50 +606,18 @@ fn get_selected_index(accounts: &[UserAccount], keystore: &AccountStorage) -> Op None } -impl AddAccountAction { - // Simple wrapper around processing the unknown action to expose too - // much internal logic. This allows us to have a must_use on our - // LoginAction type, otherwise the SingleUnkIdAction's must_use will - // be lost when returned in the login action - pub fn process_action(&mut self, ids: &mut UnknownIds, ndb: &Ndb, txn: &Transaction) { - self.unk_id_action.process_action(ids, ndb, txn); - } -} - -#[derive(Debug, Clone)] -pub struct SwitchAccountAction { - /// Some index representing the source of the action - pub source: Option<usize>, - - /// The account index to switch to - pub switch_to: usize, -} - -impl SwitchAccountAction { - pub fn new(source: Option<usize>, switch_to: usize) -> Self { - SwitchAccountAction { source, switch_to } - } -} - -#[derive(Debug)] -pub enum AccountsAction { - Switch(SwitchAccountAction), - Remove(usize), -} - #[derive(Default)] pub struct ContainsAccount { pub has_nsec: bool, pub index: usize, } -#[must_use = "You must call process_login_action on this to handle unknown ids"] -pub struct AddAccountAction { - pub accounts_action: Option<AccountsAction>, - pub unk_id_action: SingleUnkIdAction, -} - pub struct AccountData { pub(crate) relay: AccountRelayData, pub(crate) muted: AccountMutedData, } + +pub struct AddAccountResponse { + pub switch_to: usize, + pub unk_id_action: SingleUnkIdAction, +} diff --git a/crates/notedeck/src/app.rs b/crates/notedeck/src/app.rs @@ -188,9 +188,10 @@ impl Notedeck { let txn = Transaction::new(&ndb).expect("txn"); for key in &parsed_args.keys { info!("adding account: {}", &key.pubkey); - accounts - .add_account(key.clone()) - .process_action(&mut unknown_ids, &ndb, &txn); + if let Some(resp) = accounts.add_account(key.clone()) { + resp.unk_id_action + .process_action(&mut unknown_ids, &ndb, &txn); + } } } diff --git a/crates/notedeck/src/lib.rs b/crates/notedeck/src/lib.rs @@ -33,9 +33,7 @@ mod user_account; mod wallet; mod zaps; -pub use account::accounts::{ - AccountData, Accounts, AccountsAction, AddAccountAction, SwitchAccountAction, -}; +pub use account::accounts::{AccountData, Accounts}; pub use account::FALLBACK_PUBKEY; pub use app::{App, AppAction, Notedeck}; pub use args::Args; diff --git a/crates/notedeck_columns/src/accounts/mod.rs b/crates/notedeck_columns/src/accounts/mod.rs @@ -1,9 +1,7 @@ use enostr::FullKeypair; -use nostrdb::Ndb; +use nostrdb::{Ndb, Transaction}; -use notedeck::{ - Accounts, AccountsAction, AddAccountAction, Images, SingleUnkIdAction, SwitchAccountAction, -}; +use notedeck::{Accounts, Images, SingleUnkIdAction, UnknownIds}; use crate::app::get_active_columns_mut; use crate::decks::DecksCache; @@ -22,6 +20,45 @@ mod route; pub use route::{AccountsRoute, AccountsRouteResponse}; +impl AddAccountAction { + // Simple wrapper around processing the unknown action to expose too + // much internal logic. This allows us to have a must_use on our + // LoginAction type, otherwise the SingleUnkIdAction's must_use will + // be lost when returned in the login action + pub fn process_action(&mut self, ids: &mut UnknownIds, ndb: &Ndb, txn: &Transaction) { + self.unk_id_action.process_action(ids, ndb, txn); + } +} + +#[derive(Debug, Clone)] +pub struct SwitchAccountAction { + pub source_column: usize, + + /// The account to switch to + pub switch_to: usize, +} + +impl SwitchAccountAction { + pub fn new(source_column: usize, switch_to: usize) -> Self { + SwitchAccountAction { + source_column, + switch_to, + } + } +} + +#[derive(Debug)] +pub enum AccountsAction { + Switch(SwitchAccountAction), + Remove(usize), +} + +#[must_use = "You must call process_login_action on this to handle unknown ids"] +pub struct AddAccountAction { + pub accounts_action: Option<AccountsAction>, + pub unk_id_action: SingleUnkIdAction, +} + /// Render account management views from a route #[allow(clippy::too_many_arguments)] pub fn render_accounts_route( @@ -57,7 +94,7 @@ pub fn render_accounts_route( } } AccountsRouteResponse::AddAccount(response) => { - let action = process_login_view_response(accounts, decks, response); + let action = process_login_view_response(accounts, decks, col, response); *login_state = Default::default(); let router = get_active_columns_mut(accounts, decks) .column_mut(col) @@ -91,7 +128,7 @@ pub fn process_accounts_view_response( selection = Some(acc_sel); } AccountsViewResponse::SelectAccount(index) => { - let acc_sel = AccountsAction::Switch(SwitchAccountAction::new(Some(col), index)); + let acc_sel = AccountsAction::Switch(SwitchAccountAction::new(col, index)); info!("account selection: {:?}", acc_sel); selection = Some(acc_sel); } @@ -106,6 +143,7 @@ pub fn process_accounts_view_response( pub fn process_login_view_response( manager: &mut Accounts, decks: &mut DecksCache, + col: usize, response: AccountLoginResponse, ) -> AddAccountAction { let (r, pubkey) = match response { @@ -122,5 +160,18 @@ pub fn process_login_view_response( decks.add_deck_default(pubkey); - r + if let Some(resp) = r { + AddAccountAction { + accounts_action: Some(AccountsAction::Switch(SwitchAccountAction { + source_column: col, + switch_to: resp.switch_to, + })), + unk_id_action: resp.unk_id_action, + } + } else { + AddAccountAction { + accounts_action: None, + unk_id_action: SingleUnkIdAction::NoAction, + } + } } diff --git a/crates/notedeck_columns/src/app.rs b/crates/notedeck_columns/src/app.rs @@ -771,9 +771,11 @@ pub fn set_demo( unk_ids: &mut UnknownIds, ) { let txn = Transaction::new(ndb).expect("txn"); - accounts - .add_account(Keypair::only_pubkey(*decks_cache.get_fallback_pubkey())) - .process_action(unk_ids, ndb, &txn); + if let Some(resp) = + accounts.add_account(Keypair::only_pubkey(*decks_cache.get_fallback_pubkey())) + { + resp.unk_id_action.process_action(unk_ids, ndb, &txn); + } accounts.select_account(accounts.num_accounts() - 1); } diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -1,5 +1,5 @@ use crate::{ - accounts::render_accounts_route, + accounts::{render_accounts_route, AccountsAction}, app::{get_active_columns_mut, get_decks_mut}, column::ColumnsAction, deck_state::DeckState, @@ -31,8 +31,7 @@ use crate::{ use egui_nav::{Nav, NavAction, NavResponse, NavUiType, Percent, PopupResponse, PopupSheet}; use nostrdb::Transaction; use notedeck::{ - get_current_default_msats, get_current_wallet, AccountsAction, AppContext, NoteAction, - NoteContext, + get_current_default_msats, get_current_wallet, AppContext, NoteAction, NoteContext, }; use notedeck_ui::View; use tracing::error; @@ -81,12 +80,10 @@ impl SwitchingAction { AccountsAction::Switch(switch_action) => { ctx.accounts.select_account(switch_action.switch_to); // pop nav after switch - if let Some(src) = switch_action.source { - get_active_columns_mut(ctx.accounts, decks_cache) - .column_mut(src) - .router_mut() - .go_back(); - } + get_active_columns_mut(ctx.accounts, decks_cache) + .column_mut(switch_action.source_column) + .router_mut() + .go_back(); } AccountsAction::Remove(index) => ctx.accounts.remove_account(*index), },