Skip to content

Conversation

noeliaSD
Copy link
Contributor

@noeliaSD noeliaSD commented Aug 7, 2025

Closes #18186

What does the PR do

This PR introduces a refactor of the Activity Center, transitioning it from a popup-based component to a layout-based component. In parallel, it includes improvements to notification components and a small feature enhancement to StatusBetaTag.

📝 NOTE for the reviewer

  • Please disregard the current UI styling. Minor visual adjustments were made for consistency, but the layout does not yet follow the new design guidelines and will be updated in a future steps.
  • Some TODOs are still present in the code. These are non-blocking and can be safely addressed in a follow-up PR.

Key Changes

Refactor: Activity Center Architecture

  • Moved ActivityCenter directory to AppLayouts
    This prepares for its transformation into a layout-based section, reflecting its new architectural role.
    No functional or visual changes introduced at this stage.

  • Converted Activity Center from popup to layout

    • Introduced a new section item in the main navigation bar.
    • Removed all usages of StatusActivityCenterButton, related signals, properties, and logic across layouts.
    • The notification count now updates the badge on the section item directly.
  • Decoupled internal dependencies

    • Removed direct dependency on Chat.RootStore from ActivityCenterNotifications.
    • Removed ActivityCenterStore dependency from individual notification components.
    • Components now receive data via props or higher-level containers for better modularity and testability.
  • Centralized state management

    • Moved ActivityCenterStore instantiation to the root store.
    • Relocated ActivityCenterStore to a new root-level directory to reflect its global, cross-domain nature.

UI & Storybook Improvements

  • Refined layout and spacing for all Activity Center notification delegates.
  • Adjusted text sizes for better readability on various devices.
  • Improved Storybook integration with new interactive controls for easier testing.

Architecture Benefits

  • Better separation of concerns
  • Improved testability of notification components
  • UI consistency across screen sizes

Affected areas

The complete Activity Center feature and related flows

Architecture compliance

Screencapture of the functionality

  • Storybook:
Screen.Recording.2025-08-07.at.22.42.02.mov
  • App:
Screen.Recording.2025-08-07.at.23.01.50.mov

Impact on end user

The location and user experience of the Activity Center notifications will change, as they are now integrated into the main navigation bar rather than displayed as a popup.

How to test

  • Notification rendering
  • Action handling within notification components
  • Badge updates and section navigation
  • Responsive layout behavior on different screen sizes

Risk

There is a moderate risk of introducing regressions across the Activity Center notification feature, particularly in terms of UI consistency and behavior.

@status-im-auto
Copy link
Member

status-im-auto commented Aug 7, 2025

Jenkins Builds

Click to see older builds (36)
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ dd556fd #1 2025-08-07 19:19:11 ~6 min tests/nim 📄log
dd556fd #1 2025-08-07 19:23:55 ~11 min tests/ui 📄log
✔️ dd556fd #1 2025-08-07 19:24:08 ~11 min macos/aarch64 🍎dmg
✔️ dd556fd #1 2025-08-07 19:29:18 ~16 min linux/x86_64 📦tgz
✔️ dd556fd #1 2025-08-07 19:34:32 ~21 min windows/x86_64 💿exe
✖️ dd556fd pr18532 2025-08-07 19:39:55 ~10 min tests/e2e 📊rpt
dd556fd #2 2025-08-07 20:14:06 ~12 min tests/ui 📄log
✔️ dd556fd #1 2025-08-08 08:21:51 ~11 min macos/aarch64 🍎dmg
✔️ dd556fd #1 2025-08-08 08:27:26 ~17 min linux/x86_64 📦tgz
✖️ dd556fd pr18532 2025-08-08 08:51:51 ~24 min tests/e2e 📊rpt
ef62ffb #2 2025-08-08 11:56:41 ~2 min macos/aarch64 📄log
✔️ ef62ffb #2 2025-08-08 12:01:33 ~7 min tests/nim 📄log
✔️ ef62ffb #2 2025-08-08 12:04:23 ~9 min macos/aarch64 🍎dmg
✔️ ef62ffb #3 2025-08-08 12:08:05 ~13 min tests/ui 📄log
✔️ ef62ffb #2 2025-08-08 12:10:04 ~15 min linux/x86_64 📦tgz
✔️ ef62ffb #2 2025-08-08 12:10:29 ~16 min linux/x86_64 📦tgz
✔️ ef62ffb #2 2025-08-08 12:17:05 ~22 min windows/x86_64 💿exe
✖️ ef62ffb pr18532 2025-08-08 12:20:48 ~10 min tests/e2e 📊rpt
✖️ ef62ffb pr18532 2025-08-08 12:21:36 ~11 min tests/e2e 📊rpt
✔️ ef62ffb #2 2025-08-08 13:21:42 ~17 min linux/x86_64 📦tgz
✖️ ef62ffb pr18532 2025-08-08 13:34:34 ~12 min tests/e2e 📊rpt
✔️ 7f36252 #3 2025-08-10 10:24:14 ~7 min tests/nim 📄log
✔️ 7f36252 #3 2025-08-10 10:27:54 ~10 min macos/aarch64 🍎dmg
✔️ 7f36252 #4 2025-08-10 10:29:15 ~12 min tests/ui 📄log
✔️ 7f36252 #3 2025-08-10 10:29:53 ~12 min linux/x86_64 📦tgz
✔️ 7f36252 #3 2025-08-10 10:29:58 ~12 min linux/x86_64 📦tgz
✔️ 7f36252 #1 2025-08-10 10:30:38 ~13 min macos/aarch64 🍎dmg
✔️ 7f36252 #3 2025-08-10 10:38:02 ~20 min windows/x86_64 💿exe
✖️ 7f36252 pr18532 2025-08-10 10:43:41 ~13 min tests/e2e 📊rpt
✖️ 7f36252 pr18532 2025-08-10 10:43:44 ~13 min tests/e2e 📊rpt
✔️ 9645f30 #4 2025-08-10 13:44:21 ~6 min tests/nim 📄log
✔️ 9645f30 #5 2025-08-10 13:50:25 ~12 min tests/ui 📄log
✔️ 9645f30 #4 2025-08-10 13:51:07 ~13 min linux/x86_64 📦tgz
✔️ 9645f30 #4 2025-08-10 13:51:07 ~13 min linux/x86_64 📦tgz
✖️ 9645f30 pr18532 2025-08-10 14:03:00 ~11 min tests/e2e 📊rpt
✖️ 9645f30 pr18532 2025-08-10 14:03:07 ~11 min tests/e2e 📊rpt
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 99f6881 #5 2025-08-10 13:59:35 ~6 min tests/nim 📄log
✔️ 99f6881 #5 2025-08-10 14:05:10 ~11 min macos/aarch64 🍎dmg
✔️ 99f6881 #6 2025-08-10 14:06:10 ~12 min tests/ui 📄log
✔️ 99f6881 #5 2025-08-10 14:06:29 ~13 min linux/x86_64 📦tgz
✔️ 99f6881 #5 2025-08-10 14:06:29 ~13 min linux/x86_64 📦tgz
✔️ 99f6881 #3 2025-08-10 14:12:11 ~18 min macos/aarch64 🍎dmg
✖️ 99f6881 pr18532 2025-08-10 14:18:25 ~11 min tests/e2e 📊rpt
✖️ 99f6881 pr18532 2025-08-10 14:18:41 ~12 min tests/e2e 📊rpt
✔️ 99f6881 #5 2025-08-10 14:27:52 ~34 min windows/x86_64 💿exe
7aebe8c #4 2025-08-10 17:09:48 ~2 min macos/aarch64 📄log
7aebe8c #6 2025-08-10 17:09:48 ~2 min macos/aarch64 📄log
✔️ 7aebe8c #6 2025-08-10 17:14:39 ~7 min tests/nim 📄log
✔️ 7aebe8c #7 2025-08-10 17:19:38 ~12 min tests/ui 📄log
✔️ 7aebe8c #6 2025-08-10 17:20:29 ~12 min linux/x86_64 📦tgz
✔️ 7aebe8c #6 2025-08-10 17:20:34 ~12 min linux/x86_64 📦tgz
✔️ 7aebe8c #6 2025-08-10 17:27:12 ~19 min windows/x86_64 💿exe
✖️ 7aebe8c pr18532 2025-08-10 17:31:24 ~10 min tests/e2e 📊rpt
✖️ 7aebe8c pr18532 2025-08-10 17:31:49 ~11 min tests/e2e 📊rpt

This is a preparatory step for the upcoming refactor of `ActivityCenterPopup`, which will be transformed into a layout-based component instead of a popup. The directory has been relocated to `AppLayouts` to reflect its new architectural role.

Note: This commit introduces no functional or visual changes.
Just added the option of customizing the `tooltip orientation`.
…w section layout

- Added new `Activity Center` section item into the main navigation bar.
- Switched `Activity Center` popup to layout.
- Removed all usages of `StatusActivityCenterButton`, the related properties, signals and calls from all app layouts.
- Updated section item notification count value so that the badge on the section item button is updated accordingly.
…dency

Moved store dependency up to the layout level.
… remove `ActivityCenterStore` dependency and move store instantiation to root store

- Removed the direct dependency on `ActivityCenterStore` from all Activity Center notification components, improving modularity and testability.
- Refactored components to receive necessary data via props or higher-level containers.
- Moved the instantiation of `ActivityCenterStore` to the main root store to centralize state management and ensure consistent access across the app.

These changes contribute to a cleaner architecture and better separation of concerns.
… store directory

- Moved `ActivityCenterStore` to a new root store directory, as it functions as a global, cross-domain store shared across the app.
…mprove `storybook` integration

- Adjusted text sizes for better readability across devices.
- Refined all notification delegate's layout for consistency.
- Enhanced `Storybook` example with interactive controls for improved component testing.
@noeliaSD
Copy link
Contributor Author

noeliaSD commented Aug 8, 2025

Pushed rebase!

@anastasiyaig
Copy link
Contributor

i am looking at autotests for this PR , will commit fixes when ready

id: root

spacing: 8
width: parent.width
Copy link
Contributor

Choose a reason for hiding this comment

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

should be defined in the parent, only implicit widths here

@Khushboo-dev-cpp
Copy link
Contributor

Khushboo-dev-cpp commented Aug 8, 2025

Screen.Recording.2025-08-08.at.14.54.32.mov
  1. The application toolbar with close/minimize/maximize buttons not visible in this PR?
  2. Also hovering over the items is not working as you can see in the video.
Screenshot 2025-08-08 at 14 59 29 3. Icon missing on this page but see it in the small view? Screenshot 2025-08-08 at 15 14 08 4. The alignment of contact is weird, if this is an existing issue or something you don't want to tackle right now, ignore it

@noeliaSD
Copy link
Contributor Author

noeliaSD commented Aug 8, 2025

Screen.Recording.2025-08-08.at.14.54.32.mov
The application toolbar with close/minimize/maximize buttons not visible in this PR?

Aldo hovering over the items is not working as you can see in the video.

mmmm, I'm on mac os, and you?

Screen.Recording.2025-08-08.at.15.01.35.mov

@@ -0,0 +1,67 @@
import QtQuick
Copy link
Contributor

Choose a reason for hiding this comment

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

this file and ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationCommunityKicked.qml seem very similar visually, can we optimize to avoid code duplication?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's just a first step of refactoring. I just kept the notification components as they were, and just fixing some small visual issues. The plan is, when we have the complete redesign ready (milestone 2), start from scratch with the definition of an ActivityNotificationBase component and we will get rid of a lot of repeated code and duplications.

import shared.controls
import utils

import "../controls"
Copy link
Contributor

Choose a reason for hiding this comment

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

no relative path imports ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Same comment here. I didn't touch the complete code.. I guess it's marked as new code bc of the dir changed, and file movements. We will address them in next steps.

Copy link
Contributor

Choose a reason for hiding this comment

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

other places tooo.

its there in may files below


property bool banned: true

required property var community
Copy link
Contributor

Choose a reason for hiding this comment

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

do we prefer passing this big community structure, or values within the structure
required property var communityName
required property var communityImage
required property var communityColor and so on...

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'm thinking on what you suggest. I think it will be better for the component to be data agnostic. Indeed, probably it will be something like:

  • titleText
  • secondaryTitleText
  • avatar
  • contentAreaText
    ...

You could see the intention in the following component: AppLayouts/ActivityCenter/controls/NotificationBaseHeaderRow.qml. This is new, and better fits with the final shape expected

QtObject {
id: d

property color stateTextColor: root.banned ? Theme.palette.dangerColor1 :
Copy link
Contributor

Choose a reason for hiding this comment

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

readonly ?


avatarComponent: StatusSmartIdenticon {
name: community ? community.name : ""
asset.color: community ? community.color : "black"
Copy link
Contributor

Choose a reason for hiding this comment

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

StatusColors.colors['black'] instead of black ?

Copy link
Contributor

Choose a reason for hiding this comment

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

elsewhere too

import StatusQ.Core.Theme
import StatusQ.Components

import shared
Copy link
Contributor

Choose a reason for hiding this comment

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

in all of these Notification Center files I think one imports are not needed like the shared ones

Copy link
Contributor

Choose a reason for hiding this comment

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

Please check other too in all files

import shared.views.chat

import "../controls"
import "../panels"
Copy link
Contributor

Choose a reason for hiding this comment

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

remove relative paths and check imports

readonly property bool acceptedPending: membershipStatus === ActivityCenterTypes.ActivityCenterMembershipStatus.AcceptedPending
readonly property bool declinedPending: membershipStatus === ActivityCenterTypes.ActivityCenterMembershipStatus.DeclinedPending

property color stateColorText: {
Copy link
Contributor

Choose a reason for hiding this comment

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

readonly

@@ -0,0 +1,53 @@
import QtQuick 2.15
Copy link
Contributor

Choose a reason for hiding this comment

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

change to import QtQuick no versioning required

emojiReactionsModel: appMain.rootStore.emojiReactionsModel
openCreateChat: createChatView.opened
walletStore: WalletStores.RootStore
isChatSectionModule: true
Copy link
Contributor

Choose a reason for hiding this comment

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

????

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It's just moved exactly the same way the popup was created before. Anyway this property means that this specific store is created and related to a chat / 1:1 module and not a community one.

import shared.panels
import utils

import "../controls"
Copy link
Contributor

Choose a reason for hiding this comment

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

avoid relative imports

import shared.panels
import utils

import "../panels"
Copy link
Contributor

Choose a reason for hiding this comment

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

remove relative imports

Copy link
Contributor

Choose a reason for hiding this comment

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

check if imports are really required, some may not be as I can see

import shared.panels
import utils

import "../panels"
Copy link
Contributor

Choose a reason for hiding this comment

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

remove relative imports

@@ -13,6 +13,12 @@ import "../controls"
ActivityNotificationMessage {
id: root

required property var community
Copy link
Contributor

Choose a reason for hiding this comment

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

same here if we want to pass more granular properties instead of structs

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We will address these things in next refactoring steps. Not the scope for this pr


StatusBaseText {
Layout.fillWidth: true
Layout.maximumHeight: 50
Copy link
Contributor

Choose a reason for hiding this comment

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

why is this required ?

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
Copy link
Contributor

Choose a reason for hiding this comment

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

unused import, checked other below too please.

@@ -0,0 +1,795 @@
import QtQuick
Copy link
Contributor

Choose a reason for hiding this comment

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

Just a question. Wouldn't we want to add a story book page for this as well ?

background: Rectangle {
id: backgroundItem
radius: 6
color: mouse.containsMouse ? Theme.palette.primaryColor3 : "transparent"
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: Theme.Palette.transparent

Copy link
Contributor

@Khushboo-dev-cpp Khushboo-dev-cpp left a comment

Choose a reason for hiding this comment

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

Massive work!

Love the simplification and getting the nested and nasty embedded Activity Center things outside all the app sections :)

@Khushboo-dev-cpp
Copy link
Contributor

Screen.Recording.2025-08-08.at.14.54.32.mov
The application toolbar with close/minimize/maximize buttons not visible in this PR?
Aldo hovering over the items is not working as you can see in the video.

mmmm, I'm on mac os, and you?

Screen.Recording.2025-08-08.at.15.01.35.mov

me as well, just checkout master and its there
image
but I don't think it can be because of your changes ?

Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

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

Code looks good! Need to do some testing now.

@@ -750,6 +750,25 @@ method load*[T](
if activeSectionId == nodeManagementSectionItem.id:
activeSection = nodeManagementSectionItem
# Activity Center Section
Copy link
Member

Choose a reason for hiding this comment

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

This is for another (big) task. But I'm looking forward to have this model removed from nim side. This model mixing apples and oranges is a nightmare...

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, I agree. We can take a look at it in the next step (milestone 3 in the epic plan ;) )

@@ -15,12 +15,13 @@ import "../controls"
ActivityNotificationBase {
id: root

required property var community

signal setActiveCommunity(string communityId)
Copy link
Member

Choose a reason for hiding this comment

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

please follow the convention that we already broadly use: setActiveCommunityRequested as this component by calling that doesn't set anything, it's just asking for that and needs to be handled externally.

@noeliaSD
Copy link
Contributor Author

noeliaSD commented Aug 8, 2025

Love the simplification and getting the nested and nasty embedded Activity Center things outside all the app sections :)

Thanks for the review @Khushboo-dev-cpp ! I will only address the issues related to the new code but not the ones related to the existing code since this PR can grow too much and was not part of this scope. In favor, I'll create a follow-up task, that indeed, was already in my plan, were we will work on each particular notification component (together with the new designs) and make them pretty from outside but also clean and organized code ;) Hope it makes sense to you too!

@anastasiyaig
Copy link
Contributor

@noeliaSD @Khushboo-dev-cpp @caybro , there is no Community Portal to the left (pls check left panel). Are we removing it?
Screenshot 2025-08-10 at 11 55 58

(how it looks in master, pls check the Communities Portal button with orange dot)
image

@anastasiyaig
Copy link
Contributor

clicking accept contact request is not doing anything btw

Screen.Recording.2025-08-10.at.16.30.45.mov
WRN 2025-08-10 13:30:48.479Z qt warning                                 topics="qt" tid=10654141 text="TypeError: Cannot read property 'contactsStore' of undefined" category=default file=qrc:/app/AppLayouts/ActivityCenter/views/ActivityNotificationContactRequest.qml:71

@caybro
Copy link
Member

caybro commented Aug 11, 2025

@noeliaSD @Khushboo-dev-cpp @caybro , there is no Community Portal to the left (pls check left panel). Are we removing it? Screenshot 2025-08-10 at 11 55 58

(how it looks in master, pls check the Communities Portal button with orange dot) image

Nope, not removing anything; both things look like legit bugs to me

micieslak

This comment was marked as duplicate.

Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

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

While testing these changes, I became doubtful about this solution. It's all about ease of use, at least on desktop:

  • most of the time the right part of the screen remains not used. When reviewing mentions we jump to conversation every time we click one. To continue with mentions we need to go back to notification section.
Screenshot_2025-08-26_at_12 39 12
  • currently reviewing process is additionally harder because we lose position on every click:
Screen.Recording.2025-08-26.at.11.37.38.mov

Other minor issues noticed:

  • placeholder text could be centered
Screenshot from 2025-08-26 11-31-49 - hover is unpredictable, should work always when mouse is over:
Screencast.from.26.08.2025.11.24.15.webm
  • accept/reject buttons doesn't work, only way to do that is via menu/popup
Screenshot 2025-08-26 at 11 12 59

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.

[AC - Milestone 1] Define and implement Activity Center Bell visibility when using swipe views
6 participants