notedeck

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

commit 4b608cef5f6877225af2bc65a341a60bc741d8a1
parent 015e7790d0084abd9515ce5f34998c3a3d429a58
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu, 17 Apr 2025 19:23:10 -0400

add default zap

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

Diffstat:
Mcrates/notedeck/src/lib.rs | 3++-
Acrates/notedeck/src/zaps/default_zap.rs | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcrates/notedeck/src/zaps/mod.rs | 3+++
3 files changed, 109 insertions(+), 1 deletion(-)

diff --git a/crates/notedeck/src/lib.rs b/crates/notedeck/src/lib.rs @@ -67,7 +67,8 @@ pub use wallet::{ get_wallet_for_mut, GlobalWallet, Wallet, WalletError, WalletType, WalletUIState, }; pub use zaps::{ - AnyZapState, NoteZapTarget, NoteZapTargetOwned, ZapTarget, ZapTargetOwned, ZappingError, + AnyZapState, DefaultZapError, DefaultZapMsats, NoteZapTarget, NoteZapTargetOwned, + PendingDefaultZapState, ZapTarget, ZapTargetOwned, ZappingError, }; // export libs diff --git a/crates/notedeck/src/zaps/default_zap.rs b/crates/notedeck/src/zaps/default_zap.rs @@ -0,0 +1,104 @@ +use tokenator::{ParseError, TokenParser, TokenSerializable}; + +const DEFAULT_ZAP_MSATS: u64 = 10_000; + +#[derive(Debug, Default)] +pub struct DefaultZapMsats { + pub msats: Option<u64>, + pub pending: PendingDefaultZapState, +} + +impl DefaultZapMsats { + pub fn from_user(value: Option<UserZapMsats>) -> Self { + let mut obj = match value { + Some(user_msats) => { + let mut val = DefaultZapMsats::default(); + val.set_user_selection(user_msats.msats); + val + } + None => DefaultZapMsats::default(), + }; + + obj.pending.write_msats(obj.get_default_zap_msats()); + obj + } + + pub fn set_user_selection(&mut self, msats: u64) { + self.msats = Some(msats); + } + + pub fn get_default_zap_msats(&self) -> u64 { + let Some(default_zap_msats) = self.msats else { + return DEFAULT_ZAP_MSATS; + }; + + default_zap_msats + } + + pub fn has_user_selection(&self) -> bool { + self.msats.is_some() + } + + pub fn try_into_user(&self) -> Option<UserZapMsats> { + let user_zap_amount = self.msats?; + + Some(UserZapMsats { + msats: user_zap_amount, + }) + } +} + +#[derive(Debug)] +pub struct UserZapMsats { + pub msats: u64, +} + +impl TokenSerializable for UserZapMsats { + fn parse_from_tokens<'a>(parser: &mut TokenParser<'a>) -> Result<Self, ParseError<'a>> { + parser.parse_token("default_zap")?; + + let msats: u64 = parser + .pull_token()? + .parse() + .map_err(|_| ParseError::DecodeFailed)?; + + Ok(UserZapMsats { msats }) + } + + fn serialize_tokens(&self, writer: &mut tokenator::TokenWriter) { + writer.write_token("default_zap"); + writer.write_token(&self.msats.to_string()); + } +} + +#[derive(Debug)] +pub struct PendingDefaultZapState { + pub amount_sats: String, + pub error_message: Option<DefaultZapError>, + pub is_rewriting: bool, +} + +impl Default for PendingDefaultZapState { + fn default() -> Self { + Self { + amount_sats: msats_to_sats_string(DEFAULT_ZAP_MSATS), + error_message: Default::default(), + is_rewriting: Default::default(), + } + } +} + +impl PendingDefaultZapState { + pub fn write_msats(&mut self, msats: u64) { + self.amount_sats = msats_to_sats_string(msats); + } +} + +fn msats_to_sats_string(msats: u64) -> String { + (msats / 1000).to_string() +} + +#[derive(Debug)] +pub enum DefaultZapError { + InvalidUserInput, +} diff --git a/crates/notedeck/src/zaps/mod.rs b/crates/notedeck/src/zaps/mod.rs @@ -1,7 +1,10 @@ mod cache; +mod default_zap; mod networking; mod zap; pub use cache::{ AnyZapState, NoteZapTarget, NoteZapTargetOwned, ZapTarget, ZapTargetOwned, ZappingError, Zaps, }; + +pub use default_zap::{DefaultZapError, DefaultZapMsats, PendingDefaultZapState};