diff options
| author | Adam Soltys <[email protected]> | 2026-07-03 17:55:46 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-07-03 17:55:46 -0700 |
| commit | ea2c4683e71da6c050430fd0ea122821902282e0 (patch) | |
| tree | dee90d01a2e0d2091f9b7d7868691bf76660c6ae /src/ark/manager.js | |
| parent | 190c13a338462a7a76ee65e9486e42c0165a65f4 (diff) | |
| download | coinosv3-ea2c4683e71da6c050430fd0ea122821902282e0.tar.gz coinosv3-ea2c4683e71da6c050430fd0ea122821902282e0.zip | |
Ark: 'Payment received!' celebration for Ark receives
Same card and tap-to-acknowledge flow as on-chain receives; the ack
persists in the ark state (shows exactly once) and a 2h recency guard
keeps old payments from celebrating when a wallet is opened later.
Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
Diffstat (limited to 'src/ark/manager.js')
| -rw-r--r-- | src/ark/manager.js | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/ark/manager.js b/src/ark/manager.js index b2d01ce..1f21159 100644 --- a/src/ark/manager.js +++ b/src/ark/manager.js @@ -122,6 +122,20 @@ export class ArkManager { const sum = (st) => this.state.vtxos.filter((v) => v.state === st).reduce((n, v) => n + v.amountSat, 0); return { spendableSat: sum('spendable'), pendingSat: sum('pending') }; } + + // Receives newer than the last acknowledgement — the UI's "Payment + // received!" celebration. Recency-guarded like the on-chain equivalent so an + // old payment never celebrates when a wallet is opened much later. + unseenReceives() { + const ack = this.state.receiveAckTs || 0; + const cutoff = Date.now() - 2 * 3600 * 1000; + return this.state.movements.filter((m) => + m.type === 'receive' && m.status === 'complete' && m.ts > ack && m.ts > cutoff); + } + ackReceives() { + this.state.receiveAckTs = Date.now(); + this._save(); + } vtxos() { return this.state.vtxos.slice(); } movements() { return this.state.movements.slice(); } pendingActions() { return this.state.actions.filter((a) => !['done', 'failed'].includes(a.step)); } |
