Skip to content

feat(wallet): unified recent activity on the wallet screen - #1215

Closed
bmc08gt wants to merge 1 commit into
chore/deprecate-activityfeedfrom
feat/wallet-recent-history
Closed

feat(wallet): unified recent activity on the wallet screen#1215
bmc08gt wants to merge 1 commit into
chore/deprecate-activityfeedfrom
feat/wallet-recent-history

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Add a cross-token Recent activity preview to the wallet, backed by the new :shared:transaction-history presentation layer.

Stacked on #1213 — review/merge that first. This PR's diff is only the feature commit.

  • Presentation: ActivityFeedCoordinator + TransactionItemMapper produce presentation-ready TransactionListItem (avatar, signed amount, type-aware title); ActivityFeedRow renders it.
  • Titles: "Tipped X" / "Received Tip From X" (counterparty), "Purchased/Sold <token>" (token name), "Added Money" for USDF buys. Server {0} placeholders still take precedence.
  • Wallet preview: bounded to the last 3, held in WalletViewModel.State via a non-paged recentTransactions(limit); the paged recentTransactions() is retained for the future full-history dive-in.
  • Resolution: counterparty profiles resolve from the user_profiles cache with async resolve-on-miss + resolve-on-fetch back-fill (in-flight de-duped); tokens resolve cache-only via TokenMetadataProvider.observeTokenCache() to avoid per-item network churn in the paging transform.
  • Reactive DB: observeProfiles()/observeRecent() react to a new FlipcashDatabase.observeInstance() signal instead of capturing a null per-user DB at singleton construction.
  • Persistence: raw text + textSubstitutions on messages (DB 26→27); MessageDao.observeRecent(limit).
  • Freeze fix: row key is the full message-id hex (ID.uuid is null for non-16-byte ids, which collapsed every row to key "null" and wedged the LazyColumn under the shared-transition lookahead).
  • Cards: TokenCardStack collapses into the deck then scrolls off with the list (scroll read in the placement phase to avoid re-measuring the cards).
  • Misc: rename BalanceViewModelWalletViewModel; extract shared UserProfileDomainMappers; gate scanner decor behind the NewUi flag.

Test Plan

  • :shared:transaction-history unit tests pass (title/avatar mapping incl. Added Money, received-tip, bought/sold)
  • :features:balance + :shared:persistence:sources unit tests pass
  • Wallet shows 3 recent rows; avatars + names resolve live; buys/tips/deposits titled correctly
  • Scroll: cards collapse then scroll off; no freeze on tip rows

Add a cross-token "Recent" activity preview to the wallet, backed by a new
:shared:transaction-history presentation layer.

- Presentation: ActivityFeedCoordinator + TransactionItemMapper produce
  presentation-ready TransactionListItem (avatar, signed amount, type-aware
  title); ActivityFeedRow renders the row.
- Titles: "Tipped X" / "Received Tip From X" (counterparty), "Purchased/Sold
  <token>" (token name), and "Added Money" for USDF buys. Server {0}
  placeholders still take precedence.
- Wallet shows a bounded preview (last 3) held in WalletViewModel.State via a
  non-paged recentTransactions(limit); the paged recentTransactions() is
  retained for the future full-history dive-in.
- Counterparty profiles resolve from the user_profiles cache, with an async
  resolve-on-miss and resolve-on-fetch back-fill (in-flight de-duped); tokens
  resolve cache-only via TokenMetadataProvider.observeTokenCache() to avoid
  per-item network churn in the paging transform.
- observeProfiles()/observeRecent() react to the DB via a new
  FlipcashDatabase.observeInstance() signal instead of capturing a null
  per-user DB at singleton-construction time.
- Persist raw text + textSubstitutions on messages (DB 26->27); MessageDao
  gains observeRecent(limit).
- Fix a duplicate-key LazyColumn freeze: row key is the full message id hex
  (ID.uuid is null for non-16-byte ids, collapsing every row to key "null").
- TokenCardStack collapses into the deck then scrolls off with the list
  (scroll read in the placement phase to avoid re-measuring the cards).
- Rename BalanceViewModel -> WalletViewModel; extract shared
  UserProfileDomainMappers; gate scanner decor behind the NewUi flag.
@github-actions github-actions Bot added type: feature New functionality area: network gRPC, connectivity, API, exchange rates area: scanner QR/Kikcode scanning, camera area: tokens Token accounts, balances, token info labels Aug 11, 2026
@bmc08gt
bmc08gt changed the base branch from refactor/transaction-history-consolidation to chore/deprecate-activityfeed August 11, 2026 19:55
@bmc08gt
bmc08gt deleted the branch chore/deprecate-activityfeed August 11, 2026 19:58
@bmc08gt bmc08gt closed this Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: network gRPC, connectivity, API, exchange rates area: scanner QR/Kikcode scanning, camera area: tokens Token accounts, balances, token info type: feature New functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant