Skip to content

Conversation

@vkjr
Copy link
Contributor

@vkjr vkjr commented Nov 26, 2025

What does the PR do

Implements activities list in a browser wallet.

Affected areas

  • Added new instance of activity controller to browser_section/module.nim
  • BrowserActivityStore.qml added for reusing HistoryView.qml and TransactionDelegate.qml
  • In HistoryView.qml and TransactionDelegate.qml propertywalletRootStore was renamed to activityStore, removed wallet-specific imports

Architecture compliance

Screencapture of the functionality

Screenshot 2025-11-26 at 14 47 25 Screenshot 2025-11-26 at 14 47 19

Fixes #19273

@vkjr vkjr self-assigned this Nov 26, 2025
@vkjr vkjr requested review from a team, alexjba, caybro, micieslak and noeliaSD as code owners November 26, 2025 14:54
@vkjr vkjr requested review from saledjenic and removed request for a team November 26, 2025 14:54
@status-im-auto
Copy link
Member

status-im-auto commented Nov 26, 2025

Jenkins Builds

Click to see older builds (92)
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 9474a38 #1 2025-11-26 15:02:28 ~7 min tests/nim 📄log
✔️ 856b50e #2 2025-11-26 15:12:29 ~7 min tests/nim 📄log
✔️ 856b50e #1 2025-11-26 15:13:36 ~8 min android/arm64 🤖apk 📲
856b50e #2 2025-11-26 15:19:54 ~15 min tests/ui 📄log
✔️ 856b50e #2 2025-11-26 15:19:59 ~15 min macos/aarch64 🍎dmg
✔️ 856b50e #2 2025-11-26 15:21:35 ~16 min linux/x86_64 📦tgz
✔️ 856b50e #2 2025-11-26 15:24:40 ~19 min macos/aarch64-nwaku 🍎dmg
✔️ 856b50e #2 2025-11-26 15:27:10 ~22 min linux/x86_64-nwaku 📦tgz
✔️ 856b50e #2 2025-11-26 15:33:26 ~28 min windows/x86_64 💿exe
✔️ 856b50e pr19405 2025-11-26 15:40:57 ~19 min tests/e2e 📊rpt
✖️ 856b50e PR19405 2025-11-26 15:56:00 ~22 min tests/e2e-windows 📊rpt
✔️ c916558f #2 2025-11-26 17:25:29 ~10 min android/arm64 🤖apk 📲
✔️ cd18b9b #3 2025-11-27 13:14:11 ~6 min tests/nim 📄log
✔️ 319b2fc #4 2025-11-27 13:23:27 ~8 min tests/nim 📄log
✔️ 319b2fc #4 2025-11-27 13:23:44 ~8 min android/arm64 🤖apk 📲
✖️ 319b2fc #4 2025-11-27 13:24:36 ~9 min ios/aarch64 📱ipa
✔️ 319b2fc #4 2025-11-27 13:28:37 ~13 min macos/aarch64 🍎dmg
319b2fc #4 2025-11-27 13:30:03 ~15 min tests/ui 📄log
✔️ 319b2fc #4 2025-11-27 13:31:21 ~16 min linux/x86_64 📦tgz
✔️ 319b2fc #4 2025-11-27 13:33:05 ~18 min macos/aarch64-nwaku 🍎dmg
✔️ 319b2fc #4 2025-11-27 13:38:22 ~23 min linux/x86_64-nwaku 📦tgz
✔️ 319b2fc #4 2025-11-27 13:42:32 ~27 min windows/x86_64 💿exe
✔️ 319b2fc pr19405 2025-11-27 13:47:11 ~15 min tests/e2e 📊rpt
✖️ 319b2fc PR19405 2025-11-27 14:02:11 ~19 min tests/e2e-windows 📊rpt
dfd7716 #5 2025-11-27 14:18:36 ~7 min macos/aarch64-nwaku 📄log
✔️ dfd7716 #5 2025-11-27 14:19:11 ~7 min tests/nim 📄log
✔️ dfd7716 #5 2025-11-27 14:22:22 ~11 min android/arm64 🤖apk 📲
✖️ dfd7716 #5 2025-11-27 14:23:18 ~12 min ios/aarch64 📱ipa
✔️ dfd7716 #5 2025-11-27 14:25:27 ~14 min macos/aarch64 🍎dmg
dfd7716 #5 2025-11-27 14:26:04 ~14 min tests/ui 📄log
✔️ dfd7716 #5 2025-11-27 14:28:30 ~17 min linux/x86_64 📦tgz
✔️ dfd7716 #5 2025-11-27 14:31:34 ~20 min linux/x86_64-nwaku 📦tgz
✔️ dfd7716 #5 2025-11-27 14:37:09 ~25 min windows/x86_64 💿exe
✔️ dfd7716 pr19405 2025-11-27 14:47:47 ~19 min tests/e2e 📊rpt
✖️ dfd7716 PR19405 2025-11-27 15:00:54 ~23 min tests/e2e-windows 📊rpt
c9d8cb9 #6 2025-11-27 15:59:04 ~5 min macos/aarch64-nwaku 📄log
✔️ c9d8cb9 #6 2025-11-27 15:59:46 ~6 min tests/nim 📄log
✔️ c9d8cb9 #6 2025-11-27 16:02:43 ~9 min android/arm64 🤖apk 📲
✔️ c9d8cb9 #6 2025-11-27 16:06:03 ~12 min macos/aarch64 🍎dmg
✔️ c9d8cb9 #6 2025-11-27 16:08:24 ~15 min tests/ui 📄log
✔️ c9d8cb9 #6 2025-11-27 16:09:44 ~16 min linux/x86_64 📦tgz
✔️ c9d8cb9 #6 2025-11-27 16:10:09 ~17 min ios/aarch64 📱ipa
✔️ c9d8cb9 #6 2025-11-27 16:10:32 ~17 min linux/x86_64-nwaku 📦tgz
✔️ c9d8cb9 #6 2025-11-27 16:18:27 ~25 min windows/x86_64 💿exe
✔️ c9d8cb9 pr19405 2025-11-27 16:25:36 ~15 min tests/e2e 📊rpt
✖️ c9d8cb9 PR19405 2025-11-27 16:42:17 ~23 min tests/e2e-windows 📊rpt
✔️ 46eb609d #7 2025-11-27 17:00:57 ~15 min android/arm64 🤖apk 📲
✖️ c672022 #7 2025-11-27 17:01:15 ~15 min ios/aarch64 📱ipa
✔️ c672022 #7 2025-11-27 17:01:32 ~15 min tests/nim 📄log
✔️ c672022 #7 2025-11-27 17:03:17 ~17 min macos/aarch64 🍎dmg
✔️ c672022 #7 2025-11-27 17:07:59 ~22 min linux/x86_64-nwaku 📦tgz
✔️ c672022 #7 2025-11-27 17:08:40 ~22 min windows/x86_64 💿exe
✔️ c672022 #7 2025-11-27 17:10:21 ~24 min macos/aarch64-nwaku 🍎dmg
✔️ c672022 #7 2025-11-27 17:10:31 ~24 min tests/ui 📄log
✔️ c672022 #7 2025-11-27 17:11:30 ~25 min linux/x86_64 📦tgz
✔️ c672022 pr19405 2025-11-27 17:29:06 ~17 min tests/e2e 📊rpt
✖️ c672022 PR19405 2025-11-27 17:36:29 ~27 min tests/e2e-windows 📊rpt
✔️ 44a7808e #8 2025-11-28 11:22:38 ~9 min android/arm64 🤖apk 📲
✔️ b4cd6e8 #8 2025-11-28 12:03:31 ~7 min tests/nim 📄log
b4cd6e8 #8 2025-11-28 12:05:32 ~9 min macos/aarch64-nwaku 📄log
✔️ b4cd6e8 #8 2025-11-28 12:08:30 ~12 min ios/aarch64 📱ipa
✔️ b4cd6e8 #8 2025-11-28 12:09:47 ~13 min macos/aarch64 🍎dmg
✔️ b4cd6e8 #8 2025-11-28 12:09:51 ~13 min tests/ui 📄log
✔️ b4cd6e8 #8 2025-11-28 12:13:06 ~17 min linux/x86_64-nwaku 📦tgz
✔️ b4cd6e8 #8 2025-11-28 12:13:11 ~17 min linux/x86_64 📦tgz
✔️ b4cd6e8 #8 2025-11-28 12:16:34 ~20 min windows/x86_64 💿exe
✔️ b4cd6e8 pr19405 2025-11-28 12:28:59 ~15 min tests/e2e 📊rpt
✖️ b4cd6e8 PR19405 2025-11-28 12:39:40 ~22 min tests/e2e-windows 📊rpt
✔️ 62d2aa43 #9 2025-11-28 12:06:47 ~10 min android/arm64 🤖apk 📲
✔️ ca366e41 #10 2025-11-28 17:27:38 ~12 min android/arm64 🤖apk 📲
✔️ 32150f58 #11 2025-11-29 17:27:02 ~11 min android/arm64 🤖apk 📲
✔️ 72dbf829 #12 2025-12-01 17:28:05 ~12 min android/arm64 🤖apk 📲
4948ee7 #9 2025-12-02 16:53:39 ~11 min macos/aarch64-nwaku 📄log
✔️ 4948ee7 #9 2025-12-02 16:57:32 ~14 min macos/aarch64 🍎dmg
✔️ 4948ee7 #9 2025-12-02 16:59:57 ~17 min ios/aarch64 📱ipa
✔️ 4948ee7 #9 2025-12-02 17:01:33 ~18 min tests/nim 📄log
✔️ 4948ee7 #9 2025-12-02 17:08:08 ~25 min tests/ui 📄log
✔️ 4948ee7 #9 2025-12-02 17:09:52 ~27 min linux/x86_64 📦tgz
✔️ 4948ee7 #9 2025-12-02 17:10:53 ~28 min windows/x86_64 💿exe
✔️ 4948ee7 #9 2025-12-02 17:14:48 ~32 min linux/x86_64-nwaku 📦tgz
✖️ 4948ee7 PR19405 2025-12-02 17:32:24 ~21 min tests/e2e-windows 📊rpt
✔️ 4948ee7 pr19405 2025-12-02 17:32:42 ~22 min tests/e2e 📊rpt
✔️ f427f83 #10 2025-12-03 14:37:49 ~8 min tests/nim 📄log
f427f83 #10 2025-12-03 14:39:09 ~9 min macos/aarch64-nwaku 📄log
✖️ f427f83 #10 2025-12-03 14:40:34 ~11 min ios/aarch64 📱ipa
✔️ f427f83 #10 2025-12-03 14:43:20 ~13 min tests/ui 📄log
✔️ f427f83 #10 2025-12-03 14:43:28 ~14 min macos/aarch64 🍎dmg
✔️ f427f83 #10 2025-12-03 14:46:20 ~17 min linux/x86_64 📦tgz
✔️ f427f83 #10 2025-12-03 14:46:28 ~17 min linux/x86_64-nwaku 📦tgz
✔️ f427f83 #10 2025-12-03 14:54:29 ~25 min windows/x86_64 💿exe
✔️ f427f83 pr19405 2025-12-03 15:04:23 ~17 min tests/e2e 📊rpt
✖️ f427f83 PR19405 2025-12-03 15:20:27 ~25 min tests/e2e-windows 📊rpt
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ b672921 #11 2025-12-03 15:25:44 ~7 min tests/nim 📄log
✖️ b672921 #11 2025-12-03 15:31:41 ~13 min ios/aarch64 📱ipa
✔️ b672921 #11 2025-12-03 15:32:34 ~14 min tests/ui 📄log
✔️ b672921 #11 2025-12-03 15:36:03 ~17 min linux/x86_64 📦tgz
✔️ b672921 #11 2025-12-03 15:36:10 ~17 min macos/aarch64 🍎dmg
✔️ b672921 #11 2025-12-03 15:41:48 ~23 min linux/x86_64-nwaku 📦tgz
✔️ b672921 #11 2025-12-03 15:43:24 ~25 min macos/aarch64-nwaku 🍎dmg
✔️ b672921 #11 2025-12-03 15:49:58 ~31 min windows/x86_64 💿exe
✔️ b672921 pr19405 2025-12-03 16:00:47 ~24 min tests/e2e 📊rpt
✖️ b672921 PR19405 2025-12-03 16:17:07 ~27 min tests/e2e-windows 📊rpt
1577302 #12 2025-12-05 15:19:15 ~6 min macos/aarch64-nwaku 📄log
✔️ 1577302 #12 2025-12-05 15:20:13 ~7 min tests/nim 📄log
✔️ 1577302 #12 2025-12-05 15:27:29 ~14 min tests/ui 📄log
✖️ 1577302 #12 2025-12-05 15:28:24 ~15 min ios/aarch64 📱ipa
✔️ 1577302 #12 2025-12-05 15:28:53 ~16 min linux/x86_64-nwaku 📦tgz
✔️ 1577302 #12 2025-12-05 15:29:39 ~16 min linux/x86_64 📦tgz
✔️ 1577302 #12 2025-12-05 15:32:42 ~19 min macos/aarch64 🍎dmg
✔️ 1577302 #12 2025-12-05 15:38:26 ~25 min windows/x86_64 💿exe
✔️ 1577302 pr19405 2025-12-05 15:45:19 ~15 min tests/e2e 📊rpt
✖️ 1577302 PR19405 2025-12-05 16:05:29 ~26 min tests/e2e-windows 📊rpt

@vkjr vkjr force-pushed the feat/browser-account-activity branch from 9474a38 to 856b50e Compare November 26, 2025 15:04
@vkjr vkjr changed the title feat: activities in a browser wallet [WIP]: feat: activities in a browser wallet Nov 26, 2025
@vkjr vkjr force-pushed the feat/browser-account-activity branch from 856b50e to cd18b9b Compare November 27, 2025 13:07
@vkjr vkjr changed the title [WIP]: feat: activities in a browser wallet feat: activities in a browser wallet Nov 27, 2025
@vkjr vkjr requested a review from alaibe November 27, 2025 13:08
@vkjr vkjr force-pushed the feat/browser-account-activity branch 2 times, most recently from c9d8cb9 to c672022 Compare November 27, 2025 16:45
@vkjr vkjr force-pushed the feat/browser-account-activity branch from c672022 to b4cd6e8 Compare November 28, 2025 11:55
Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work overall, a bit unsure about the overall architecture, esp. regarding the stores

import StatusQ.Core.Theme
import StatusQ.Core.Utils as SQUtils

import SortFilterProxyModel
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused?

readonly property bool isLightTheme: Theme.palette.name === Constants.lightThemeName
property color animatedBgColor
property int txType: walletRootStore.getTransactionType(root.modelData)
property int txType: activityStore.getTransactionType(root.modelData)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
property int txType: activityStore.getTransactionType(root.modelData)
readonly property int txType: activityStore.getTransactionType(root.modelData)

}

function getDappDetails(chainId, contractAddress) {
return undefined
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The general, currently used approach is to mock stores, it's our cut-off line between ui and nim side.

For details please refer to: https://github.com/status-im/status-desktop/blob/master/guidelines/QML_ARCHITECTURE_GUIDE.md

@vkjr
Copy link
Contributor Author

vkjr commented Dec 2, 2025

Nice work overall, a bit unsure about the overall architecture, esp. regarding the stores

@caybro, could you please elaborate?

@vkjr vkjr requested review from caybro and micieslak December 2, 2025 16:42
@vkjr
Copy link
Contributor Author

vkjr commented Dec 2, 2025

@caybro, @micieslak - please take a look again, review notes fixed.

Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otherwise looks good to me

overview: root.browserWalletStore.dappBrowserAccount
communitiesStore: null
currencyStore: SharedStores.CurrenciesStore {}
networksStore: SharedStores.NetworksStore {}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These 2 stores are global, ie you should not recreate them but pass them down all the way from AppMain

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


// TODO: https://github.com/status-im/status-desktop/issues/15329
// Get DApp data from the backend
function getDappDetails(chainId, contractAddress) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wondering if it would make sense to have a specific Utils file for this context?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@noeliaSD, could you please elaborate?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure! I see Utils as a place for static, global, and generic helpers. If this is more context-specific, we could consider creating a dedicated utils file for that context instead. WDYT?

@vkjr
Copy link
Contributor Author

vkjr commented Dec 3, 2025

@noeliaSD, could you please check the last commit, at BrowserWalletMenu.qml changes? I partially implemented what we've talked about. But activityStore is still there because I need to pass it to child components that are reused between wallet and browser, so I'd better refactor them separately.

@vkjr vkjr requested review from caybro and noeliaSD December 3, 2025 15:18
Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs a rebase but cool!

Copy link
Contributor

@noeliaSD noeliaSD left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job! I’ve reviewed the latest commit and you’ve followed the pattern we discussed very well. I’ve added a few comments and suggestions for improvements, along with some guidance for the next steps to fully refine the architecture according to our guidelines. These can be addressed in separate follow-up tasks.

browserActivityStore: root.browserActivityStore
accounts: root.browserWalletStore.accounts
overview: root.browserWalletStore.dappBrowserAccount
activityStore: root.browserActivityStore
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As you mentioned, this should follow the same improvement approach: pass only the specific data needed to the Menu instead of the full store. I’m completely fine with addressing this in a separate task.

}
onOpenWalletMenu: Global.openPopup(browserWalletMenu)
onOpenWalletMenu: {
// Initialize activity filters before opening popup
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These kinds of data preparations likely belong in the adaptors layer, which I didn’t mention earlier. It’s fine to keep it here for now, and if you don't mind, we can create a separate task to improve this part as well. We can sync again to define the proper approach, if you wish. For technical reference, you can check the adaptors section here: https://github.com/status-im/status-desktop/blob/master/guidelines/QML_ARCHITECTURE_GUIDE.md#adaptors

overview: root.browserWalletStore.dappBrowserAccount
activityStore: root.browserActivityStore
transactionActivityStatus: root.browserActivityStore.transactionActivityStatus
currencyStore: root.currencyStore
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same consideration applies to both currencyStore and networkStore as well.


required property BrowserStores.BrowserWalletStore browserWalletStore
required property BrowserStores.BrowserActivityStore browserActivityStore
required property var accounts
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be helpful to add a brief comment or description clarifying the expected roles for this accounts model.

required property BrowserStores.BrowserWalletStore browserWalletStore
required property BrowserStores.BrowserActivityStore browserActivityStore
required property var accounts
required property var overview
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also here. It would be helpful some description and if it's a model, which are the expected roles.

required property var accounts
required property var overview
required property var activityStore
required property var transactionActivityStatus
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are the possible values of this expected to be of type int?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope

signal transactionFilterUpdateRequested()
signal collectiblesModelUpdateRequested()
signal recipientsModelUpdateRequested()
signal connectedAccountDeleted()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a naming suggestion to keep the pattern consistent, you could use deleteConnectedAccountRequested(). But feel free to decide what fits best!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed those signals because there is no actual reason to use them, we can do connection to activity status object directly in the BrowserLayout.

downloadsStore: BrowserStores.DownloadsStore {}
browserRootStore: BrowserStores.BrowserRootStore {}
browserWalletStore: BrowserStores.BrowserWalletStore {}
browserActivityStore: BrowserStores.BrowserActivityStore {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As we discussed offline, it would be good to create a separate task to refactor the Browser Stores location and instantiation into a new ui/app/AppLayouts/stores/Browser folder, all related stores should then be instantiated inside ui/app/AppLayouts/stores/RootStore.qml, with a corresponding reference added in appMain.

@vkjr
Copy link
Contributor Author

vkjr commented Dec 5, 2025

@noeliaSD, I've addressed the comments and opened #19498 to track further refactoring

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Browser] add the activity feed to the wallet modal on the browser navigation bar

6 participants