extract MediaUploadTracker with common methods
bugfixes:
ChatFileUploadState.canPost() was missing isUploadingFile check
ChatNewMessageViewModel.cancel() was never resetting upload flags
Double-reset in ChatFileUploader and ChannelNewMessageViewModel
- All ViewModels track isUploadingFile alongside isUploadingImage, set via hasNonMedia()
- All screen call sites pass source-specific flags so only the initiating button spins
- canPost() methods block posting during file uploads too
- ChatNewMessageViewModel delegates to ChatFileUploadState (fixes pre-existing dead state)
- cancel() methods reset both flags in all ViewModels
Add NwcTransactionMetadata parser that extracts comment, payer_data,
recipient_data, and nostr zap data from the untyped metadata field.
The transaction list UI now shows the Nostr user profile picture and
name for zap senders/recipients, falls back to payer name/email or
lightning address, and displays comment when it differs from description.
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
The WalletViewModel.init() was called inside LaunchedEffect (async),
but hasWalletSetup() was checked synchronously during the first
composition frame—before init had run. Moved init to run synchronously
during composition and made hasWalletSetup a reactive StateFlow so the
UI updates when wallet state changes.
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
Simplifies the NWC developer experience by providing Nip47Client (for
wallet client apps) and Nip47Server (for wallet service backends) that
handle URI parsing, signer creation, event building, filter construction,
and response decryption. Updates README with quick-start examples.
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
Adds missing server-side capabilities to the NIP-47 quartz module:
- LnZapPaymentResponseEvent.createResponse(): builds encrypted response
events (kind 23195) for wallet services to reply to client requests
- NwcNotificationEvent.createNotification(): builds encrypted notification
events (kind 23197) for wallet services to push payment notifications
Creates comprehensive README.md documenting the full NIP-47 API with
code examples for both wallet client and wallet service implementations,
covering URI parsing, request/response building, encryption, notifications,
error handling, transaction states, and caching.
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
Adds an Alby Go-inspired wallet interface accessible from the left drawer menu.
Uses existing NWC connection from zap settings to communicate with the wallet
via NIP-47 methods (get_balance, get_info, pay_invoice, make_invoice, list_transactions).
New files:
- WalletViewModel: manages wallet state and NWC requests
- WalletScreen: balance display with send/receive action buttons
- WalletSendScreen: paste BOLT-11 invoice and pay
- WalletReceiveScreen: create invoice with QR code display
- WalletTransactionsScreen: scrollable transaction history
Also adds generic sendNwcRequest() to NwcSignerState and Account for
sending arbitrary NIP-47 requests beyond just pay_invoice.
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
Add tests using exact JSON payloads from Alby Hub's test suite:
- Real bolt11 invoice strings from Alby's mock data
- pay_keysend with TLV records and preimage
- make_invoice with nested metadata objects
- make_hold_invoice with 64-char payment hash
- settle_hold_invoice with preimage
- list_transactions with unpaid_outgoing filter
- create_connection with isolated=true
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
- Add get_budget, sign_message, create_connection request/response types
- Add NwcTransactionType (incoming/outgoing) and NwcTransactionState
(PENDING/SETTLED/FAILED/ACCEPTED) constants
- Add missing error codes: BAD_REQUEST, NOT_FOUND, EXPIRED
- Add settle_deadline field to NwcTransaction
- Add total_count to ListTransactionsResult
- Add metadata and lud16 to GetInfoResult
- Add unpaid_outgoing and unpaid_incoming to ListTransactionsParams
- Update Jackson deserializers for new method types
- Add AlbyInteropTest with 25+ tests verifying compatibility with
Alby Hub's JSON formats for all request/response types
- Update existing tests for new constants and error codes
https://claude.ai/code/session_01JFogiwyR4CPVP8cRznqahJ
After swiping a draft to delete, the red confirmation background now
shows both a "Delete" button (left) and a "Cancel" button (right).
Tapping Cancel resets the swipe state, allowing users to dismiss
the delete action without deleting the draft.
https://claude.ai/code/session_01ULVR1fKwka5TgfgSucPE4r
* 'main' of https://github.com/vitorpamplona/amethyst:
feat: replace dialog with swipe-to-reveal delete button for drafts
feat: add confirmation dialog when swiping to delete a draft
Instead of showing a confirmation dialog, the swipe now stays open
revealing a red background with a clickable "Request Deletion" button.
Supports swiping from both left-to-right and right-to-left directions.
The user taps the revealed button to confirm deletion.
https://claude.ai/code/session_01JWJxejv2EKrPj2KGEfPPxU