notedeck

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

commit 5598cc8ba0ed79d8642b31b21b90a143c9b2bac0
parent a9a819f742d3facdeab801b47e9e3e35aec76701
Author: kernelkind <kernelkind@gmail.com>
Date:   Fri,  9 May 2025 12:18:37 -0400

use `CustomZapView`

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

Diffstat:
Mcrates/notedeck/src/lib.rs | 4++--
Mcrates/notedeck/src/note/action.rs | 1+
Mcrates/notedeck/src/zaps/mod.rs | 5++++-
Mcrates/notedeck_columns/src/actionbar.rs | 3+++
Mcrates/notedeck_columns/src/nav.rs | 40+++++++++++++++++++++++++++++-----------
Mcrates/notedeck_columns/src/route.rs | 13+++++--------
Mcrates/notedeck_columns/src/ui/column/header.rs | 2+-
Mcrates/notedeck_ui/src/note/mod.rs | 4++++
8 files changed, 49 insertions(+), 23 deletions(-)

diff --git a/crates/notedeck/src/lib.rs b/crates/notedeck/src/lib.rs @@ -70,8 +70,8 @@ pub use wallet::{ WalletUIState, ZapWallet, }; pub use zaps::{ - AnyZapState, DefaultZapError, DefaultZapMsats, NoteZapTarget, NoteZapTargetOwned, - PendingDefaultZapState, ZapTarget, ZapTargetOwned, ZappingError, + get_current_default_msats, AnyZapState, DefaultZapError, DefaultZapMsats, NoteZapTarget, + NoteZapTargetOwned, PendingDefaultZapState, ZapTarget, ZapTargetOwned, ZappingError, }; // export libs diff --git a/crates/notedeck/src/note/action.rs b/crates/notedeck/src/note/action.rs @@ -33,6 +33,7 @@ pub enum NoteAction { #[derive(Debug, Eq, PartialEq, Clone)] pub enum ZapAction { Send(ZapTargetAmount), + CustomizeAmount(NoteZapTargetOwned), ClearError(NoteZapTargetOwned), } diff --git a/crates/notedeck/src/zaps/mod.rs b/crates/notedeck/src/zaps/mod.rs @@ -7,4 +7,7 @@ pub use cache::{ AnyZapState, NoteZapTarget, NoteZapTargetOwned, ZapTarget, ZapTargetOwned, ZappingError, Zaps, }; -pub use default_zap::{DefaultZapError, DefaultZapMsats, PendingDefaultZapState, UserZapMsats}; +pub use default_zap::{ + get_current_default_msats, DefaultZapError, DefaultZapMsats, PendingDefaultZapState, + UserZapMsats, +}; diff --git a/crates/notedeck_columns/src/actionbar.rs b/crates/notedeck_columns/src/actionbar.rs @@ -97,6 +97,9 @@ fn execute_note_action( ) } ZapAction::ClearError(target) => clear_zap_error(&sender, zaps, target), + ZapAction::CustomizeAmount(target) => { + router.route_to(Route::CustomizeZapAmount(target.to_owned())) + } } None diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -15,7 +15,7 @@ use crate::{ column::NavTitle, configure_deck::ConfigureDeckView, edit_deck::{EditDeckResponse, EditDeckView}, - note::{NewPostAction, PostAction, PostType}, + note::{custom_zap::CustomZapView, NewPostAction, PostAction, PostType}, profile::EditProfileView, search::{FocusState, SearchView}, support::SupportView, @@ -27,7 +27,10 @@ use crate::{ use egui_nav::{Nav, NavAction, NavResponse, NavUiType}; use nostrdb::Transaction; -use notedeck::{get_current_wallet, AccountsAction, AppContext, NoteAction, NoteContext}; +use notedeck::{ + get_current_default_msats, get_current_wallet, AccountsAction, AppContext, NoteAction, + NoteContext, +}; use notedeck_ui::View; use tracing::error; @@ -292,7 +295,6 @@ fn render_nav_body( &mut note_context, &mut app.jobs, ), - Route::Accounts(amr) => { let mut action = render_accounts_route( ui, @@ -310,13 +312,11 @@ fn render_nav_body( .accounts_action .map(|f| RenderNavAction::SwitchingAction(SwitchingAction::Accounts(f))) } - Route::Relays => { let manager = RelayPoolManager::new(ctx.pool); RelayView::new(ctx.accounts, manager, &mut app.view_state.id_string_map).ui(ui); None } - Route::Reply(id) => { let txn = if let Ok(txn) = Transaction::new(ctx.ndb) { txn @@ -359,7 +359,6 @@ fn render_nav_body( action.map(Into::into) } - Route::Quote(id) => { let txn = Transaction::new(ctx.ndb).expect("txn"); @@ -393,7 +392,6 @@ fn render_nav_body( response.action.map(Into::into) } - Route::ComposeNote => { let kp = ctx.accounts.get_selected_account()?.key.to_full()?; let draft = app.drafts.compose_mut(); @@ -412,18 +410,15 @@ fn render_nav_body( post_response.action.map(Into::into) } - Route::AddColumn(route) => { render_add_column_routes(ui, app, ctx, col, route); None } - Route::Support => { SupportView::new(&mut app.support).show(ui); None } - Route::Search => { let id = ui.id().with(("search", depth, col)); let navigating = get_active_columns_mut(ctx.accounts, &mut app.decks_cache) @@ -454,7 +449,6 @@ fn render_nav_body( .show(ui, ctx.clipboard) .map(RenderNavAction::NoteAction) } - Route::NewDeck => { let id = ui.id().with("new-deck"); let new_deck_state = app.view_state.id_to_deck_state.entry(id).or_default(); @@ -597,6 +591,30 @@ fn render_nav_body( .ui(ui) .map(RenderNavAction::WalletAction) } + Route::CustomizeZapAmount(target) => { + let txn = Transaction::new(ctx.ndb).expect("txn"); + let default_msats = get_current_default_msats(ctx.accounts, ctx.global_wallet); + CustomZapView::new( + ctx.img_cache, + ctx.ndb, + &txn, + &target.zap_recipient, + default_msats, + ) + .ui(ui) + .map(|msats| { + get_active_columns_mut(ctx.accounts, &mut app.decks_cache) + .column_mut(col) + .router_mut() + .go_back(); + RenderNavAction::NoteAction(NoteAction::Zap(notedeck::ZapAction::Send( + notedeck::note::ZapTargetAmount { + target: target.clone(), + specified_msats: Some(msats), + }, + ))) + }) + } } } diff --git a/crates/notedeck_columns/src/route.rs b/crates/notedeck_columns/src/route.rs @@ -1,5 +1,5 @@ use enostr::{NoteId, Pubkey}; -use notedeck::WalletType; +use notedeck::{NoteZapTargetOwned, WalletType}; use std::fmt::{self}; use crate::{ @@ -29,6 +29,7 @@ pub enum Route { Search, EditDeck(usize), Wallet(WalletType), + CustomizeZapAmount(NoteZapTargetOwned), } impl Route { @@ -112,6 +113,7 @@ impl Route { Route::Wallet(_) => { writer.write_token("wallet"); } + Route::CustomizeZapAmount(_) => writer.write_token("customize zap amount"), } } @@ -201,12 +203,9 @@ impl Route { pub fn title(&self) -> ColumnTitle<'_> { match self { Route::Timeline(kind) => kind.to_title(), - Route::Reply(_id) => ColumnTitle::simple("Reply"), Route::Quote(_id) => ColumnTitle::simple("Quote"), - Route::Relays => ColumnTitle::simple("Relays"), - Route::Accounts(amr) => match amr { AccountsRoute::Accounts => ColumnTitle::simple("Accounts"), AccountsRoute::AddAccount => ColumnTitle::simple("Add Account"), @@ -238,6 +237,7 @@ impl Route { Route::EditProfile(_) => ColumnTitle::simple("Edit Profile"), Route::Search => ColumnTitle::simple("Search"), Route::Wallet(_) => ColumnTitle::simple("Wallet"), + Route::CustomizeZapAmount(_) => ColumnTitle::simple("Customize Zap Amount"), } } } @@ -342,18 +342,14 @@ impl fmt::Display for Route { TimelineKind::Thread(_id) => write!(f, "Thread"), TimelineKind::Profile(_id) => write!(f, "Profile"), }, - Route::Reply(_id) => write!(f, "Reply"), Route::Quote(_id) => write!(f, "Quote"), - Route::Relays => write!(f, "Relays"), - Route::Accounts(amr) => match amr { AccountsRoute::Accounts => write!(f, "Accounts"), AccountsRoute::AddAccount => write!(f, "Add Account"), }, Route::ComposeNote => write!(f, "Compose Note"), - Route::AddColumn(_) => write!(f, "Add Column"), Route::Support => write!(f, "Support"), Route::NewDeck => write!(f, "Add Deck"), @@ -361,6 +357,7 @@ impl fmt::Display for Route { Route::EditProfile(_) => write!(f, "Edit Profile"), Route::Search => write!(f, "Search"), Route::Wallet(_) => write!(f, "Wallet"), + Route::CustomizeZapAmount(_) => write!(f, "Customize Zap Amount"), } } } diff --git a/crates/notedeck_columns/src/ui/column/header.rs b/crates/notedeck_columns/src/ui/column/header.rs @@ -447,7 +447,6 @@ impl<'a> NavTitle<'a> { self.timeline_pfp(ui, kind, pfp_size); } }, - Route::Reply(_) => {} Route::Quote(_) => {} Route::Accounts(_as) => {} @@ -464,6 +463,7 @@ impl<'a> NavTitle<'a> { ui.add(ui::side_panel::search_button()); } Route::Wallet(_) => {} + Route::CustomizeZapAmount(_) => {} } } diff --git a/crates/notedeck_ui/src/note/mod.rs b/crates/notedeck_ui/src/note/mod.rs @@ -728,6 +728,10 @@ fn render_note_actionbar( crate::show_pointer(ui); } + if zap_resp.secondary_clicked() { + break 's Some(NoteAction::Zap(ZapAction::CustomizeAmount(target))); + } + if !zap_resp.clicked() { break 's None; }