From 948115f2b2ba83f05ac7d5d2a9f9dcb2f47a1ac6 Mon Sep 17 00:00:00 2001 From: Noelia Date: Tue, 16 Dec 2025 12:17:16 +0100 Subject: [PATCH 01/10] feat(NotificationCard): refine hover visual style and misc minor fixes - On hover, the card now keeps the same background color while the border is highlighted using the primary color for clearer visual feedback. - Allow enabled property. - Prevention from undefined `attachments` property --- .../ActivityCenter/controls/NotificationCard.qml | 6 +++++- .../ActivityCenter/controls/NotificationContentBlock.qml | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ui/app/AppLayouts/ActivityCenter/controls/NotificationCard.qml b/ui/app/AppLayouts/ActivityCenter/controls/NotificationCard.qml index 030c0256a3e..ae281c6b1ae 100644 --- a/ui/app/AppLayouts/ActivityCenter/controls/NotificationCard.qml +++ b/ui/app/AppLayouts/ActivityCenter/controls/NotificationCard.qml @@ -197,7 +197,9 @@ Control { id: bg anchors.fill: parent radius: Theme.radius - color: root.selected || root.hovered ? Theme.palette.baseColor5 : StatusColors.transparent + color: StatusColors.transparent + border.width: 2 + border.color: root.selected || (root.hovered && root.enabled )? Theme.palette.primaryColor1 : StatusColors.transparent // Unread indicator dot (top-right). Rectangle { @@ -297,6 +299,8 @@ Control { z: 1 anchors.fill: parent cursorShape: Qt.PointingHandCursor + hoverEnabled: false + enabled: root.enabled onClicked: root.clicked() } diff --git a/ui/app/AppLayouts/ActivityCenter/controls/NotificationContentBlock.qml b/ui/app/AppLayouts/ActivityCenter/controls/NotificationContentBlock.qml index 2c026436d59..bb0f6d4da41 100644 --- a/ui/app/AppLayouts/ActivityCenter/controls/NotificationContentBlock.qml +++ b/ui/app/AppLayouts/ActivityCenter/controls/NotificationContentBlock.qml @@ -91,7 +91,8 @@ Control { // Max thumbnails to show (album caps to this). // Default to the maximumb images that fit in the current layout. - property int maxThumbs: Math.min(Math.floor((root.width + root.thumbSpacing) / (root.thumbSize + root.thumbSpacing)), attachments.length) + property int maxThumbs: attachments && attachments.length ? Math.min(Math.floor((root.width + root.thumbSpacing) / (root.thumbSize + root.thumbSpacing)), attachments.length) : + Math.min(Math.floor((root.width + root.thumbSpacing) / (root.thumbSize + root.thumbSpacing)), 0) // Max thumbnails to show (album caps to this). property int thumbSize: 56 @@ -181,7 +182,9 @@ Control { StatusMessageImageAlbum { Layout.fillWidth: true Layout.preferredHeight: root.thumbSize - visible: root.attachments.length > 0 + visible: root.attachments && root.attachments.length ? + root.attachments.length > 0 : + false spacing: root.thumbSpacing imageWidth: root.thumbSize From dc7c2dc2c46992b7f52abf45f343ce37df5d6d73 Mon Sep 17 00:00:00 2001 From: Noelia Date: Thu, 4 Dec 2025 14:07:00 +0100 Subject: [PATCH 02/10] refactor(ActivityCenter): Move `ActivityCenterGroup` enum to `ActivityCenterType`s Moved the `ActivityCenterGroup` enum out of `ActivityCenterStore` into the `ActivityCenterTypes` helper file to improve separation of concerns and keep type definitions centralized. --- .../ActivityCenter/ActivityCenterLayout.qml | 2 +- .../helpers/ActivityCenterTypes.qml | 13 +++++++++++ .../panels/ActivityCenterPopupTopBarPanel.qml | 23 ++++++++++--------- .../AppLayouts/stores/ActivityCenterStore.qml | 13 ----------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml index 31db438e83e..b3044de3c0b 100644 --- a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml +++ b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml @@ -217,7 +217,7 @@ StatusSectionLayout { Layout.fillWidth: true Layout.margins: Theme.padding - active: activityCenterTopBar.activeGroup === ActivityCenterStore.ActivityCenterGroup.NewsMessage && + active: activityCenterTopBar.activeGroup === ActivityCenterTypes.ActivityCenterGroup.NewsMessage && (newsDisabledBySettings || listView.count === 0) sourceComponent: newsDisabledBySettings ? newsDisabledPanel : newsEmptyPanel } diff --git a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml index b5e41d1b4f7..251b0b1023e 100644 --- a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml +++ b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml @@ -50,4 +50,17 @@ QtObject { BackupSyncingFailure = 28, // Deprecated ActivityCenterNotificationTypeNews = 29 } + + enum ActivityCenterGroup { + All = 0, + Mentions = 1, + Replies = 2, + Membership = 3, + Admin = 4, + ContactRequests = 5, + IdentityVerification = 6, + Transactions = 7, + System = 8, + NewsMessage = 9 + } } diff --git a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml index 3ea27537f9a..96498a1b014 100644 --- a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml +++ b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml @@ -11,6 +11,7 @@ import StatusQ.Controls import StatusQ.Popups import AppLayouts.stores +import AppLayouts.ActivityCenter.helpers Item { id: root @@ -24,7 +25,7 @@ Item { property bool hideReadNotifications: false property int unreadNotificationsCount: 0 - property int activeGroup: ActivityCenterStore.ActivityCenterGroup.All + property int activeGroup: ActivityCenterTypes.ActivityCenterGroup.All property alias errorText: errorText.text @@ -49,15 +50,15 @@ Item { Repeater { // NOTE: some entries are hidden until implimentation - model: [ { text: qsTr("All"), group: ActivityCenterStore.ActivityCenterGroup.All, visible: true, enabled: true }, - { text: qsTr("News"), group: ActivityCenterStore.ActivityCenterGroup.NewsMessage, visible: true, enabled: true }, - { text: qsTr("Admin"), group: ActivityCenterStore.ActivityCenterGroup.Admin, visible: root.hasAdmin, enabled: root.hasAdmin }, - { text: qsTr("Mentions"), group: ActivityCenterStore.ActivityCenterGroup.Mentions, visible: true, enabled: root.hasMentions }, - { text: qsTr("Replies"), group: ActivityCenterStore.ActivityCenterGroup.Replies, visible: true, enabled: root.hasReplies }, - { text: qsTr("Contact requests"), group: ActivityCenterStore.ActivityCenterGroup.ContactRequests, visible: true, enabled: root.hasContactRequests }, - { text: qsTr("Transactions"), group: ActivityCenterStore.ActivityCenterGroup.Transactions, visible: false, enabled: true }, - { text: qsTr("Membership"), group: ActivityCenterStore.ActivityCenterGroup.Membership, visible: true, enabled: root.hasMembership }, - { text: qsTr("System"), group: ActivityCenterStore.ActivityCenterGroup.System, visible: false, enabled: true } ] + model: [ { text: qsTr("All"), group: ActivityCenterTypes.ActivityCenterGroup.All, visible: true, enabled: true }, + { text: qsTr("News"), group: ActivityCenterTypes.ActivityCenterGroup.NewsMessage, visible: true, enabled: true }, + { text: qsTr("Admin"), group: ActivityCenterTypes.ActivityCenterGroup.Admin, visible: root.hasAdmin, enabled: root.hasAdmin }, + { text: qsTr("Mentions"), group: ActivityCenterTypes.ActivityCenterGroup.Mentions, visible: true, enabled: root.hasMentions }, + { text: qsTr("Replies"), group: ActivityCenterTypes.ActivityCenterGroup.Replies, visible: true, enabled: root.hasReplies }, + { text: qsTr("Contact requests"), group: ActivityCenterTypes.ActivityCenterGroup.ContactRequests, visible: true, enabled: root.hasContactRequests }, + { text: qsTr("Transactions"), group: ActivityCenterTypes.ActivityCenterGroup.Transactions, visible: false, enabled: true }, + { text: qsTr("Membership"), group: ActivityCenterTypes.ActivityCenterGroup.Membership, visible: true, enabled: root.hasMembership }, + { text: qsTr("System"), group: ActivityCenterTypes.ActivityCenterGroup.System, visible: false, enabled: true } ] StatusFlatButton { objectName: "activityCenterGroupButton" @@ -67,7 +68,7 @@ Item { size: StatusBaseButton.Size.Small highlighted: modelData.group === root.activeGroup onClicked: root.groupTriggered(modelData.group) - onEnabledChanged: if (!enabled && highlighted) root.groupTriggered(ActivityCenterStore.ActivityCenterGroup.All) + onEnabledChanged: if (!enabled && highlighted) root.groupTriggered(ActivityCenterTypes.ActivityCenterGroup.All) Layout.preferredWidth: visible ? implicitWidth : 0 } } diff --git a/ui/app/AppLayouts/stores/ActivityCenterStore.qml b/ui/app/AppLayouts/stores/ActivityCenterStore.qml index efce6643c1d..0623d1d4652 100644 --- a/ui/app/AppLayouts/stores/ActivityCenterStore.qml +++ b/ui/app/AppLayouts/stores/ActivityCenterStore.qml @@ -5,19 +5,6 @@ import shared QtObject { id: root - enum ActivityCenterGroup { - All = 0, - Mentions = 1, - Replies = 2, - Membership = 3, - Admin = 4, - ContactRequests = 5, - IdentityVerification = 6, - Transactions = 7, - System = 8, - NewsMessage = 9 - } - enum ActivityCenterReadType { Read = 1, Unread = 2, From 87a375249e327cee6ddf4c9a4231259eb478ba43 Mon Sep 17 00:00:00 2001 From: Noelia Date: Wed, 17 Dec 2025 18:44:16 +0100 Subject: [PATCH 03/10] refactor(ActivityCenter): Move `ActivityCenterReadType` to `ActivityCenterTypes` Move `ActivityCenterReadType` out of the store and into `ActivityCenterTypes`to improve separation of concerns and make the type reusable across layers. --- ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml | 8 ++++---- .../ActivityCenter/helpers/ActivityCenterTypes.qml | 6 ++++++ ui/app/AppLayouts/stores/ActivityCenterStore.qml | 6 ------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml index b3044de3c0b..4b392ac42bf 100644 --- a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml +++ b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml @@ -104,13 +104,13 @@ StatusSectionLayout { StatusFlatRoundButton { id: hideReadNotificationsBtn - property bool hideReadNotifications: activityCenterStore.activityCenterReadType === ActivityCenterStore.ActivityCenterReadType.Unread + property bool hideReadNotifications: activityCenterStore.activityCenterReadType === ActivityCenterTypes.ActivityCenterReadType.Unread objectName: "hideReadNotificationsButton" icon.name: hideReadNotifications ? "hide" : "show" onClicked: activityCenterStore.setActivityCenterReadType(!hideReadNotifications ? - ActivityCenterStore.ActivityCenterReadType.Unread : - ActivityCenterStore.ActivityCenterReadType.All) + ActivityCenterTypes.ActivityCenterReadType.Unread : + ActivityCenterTypes.ActivityCenterReadType.All) StatusToolTip { visible: hideReadNotificationsBtn.hovered @@ -754,7 +754,7 @@ StatusSectionLayout { StatusBaseText { // If the mode is unread only, it means the user has seen all notifications // If the mode is all, it means the user doesn't have any notifications - text: activityCenterStore.activityCenterReadType === ActivityCenterStore.ActivityCenterReadType.Unread ? + text: root.activityCenterReadType === ActivityCenterTypes.ActivityCenterReadType.Unread ? qsTr("You're all caught up") : qsTr("Your notifications will appear here") horizontalAlignment: Text.AlignHCenter diff --git a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml index 251b0b1023e..69ae1c74c20 100644 --- a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml +++ b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml @@ -63,4 +63,10 @@ QtObject { System = 8, NewsMessage = 9 } + + enum ActivityCenterReadType { + Read = 1, + Unread = 2, // All notifications have been seen + All = 3 // Means no notifications + } } diff --git a/ui/app/AppLayouts/stores/ActivityCenterStore.qml b/ui/app/AppLayouts/stores/ActivityCenterStore.qml index 0623d1d4652..9850b34604b 100644 --- a/ui/app/AppLayouts/stores/ActivityCenterStore.qml +++ b/ui/app/AppLayouts/stores/ActivityCenterStore.qml @@ -5,12 +5,6 @@ import shared QtObject { id: root - enum ActivityCenterReadType { - Read = 1, - Unread = 2, - All = 3 - } - readonly property var activityCenterModuleInst: activityCenterModule readonly property var activityCenterNotifications: activityCenterModuleInst.activityNotificationsModel From 8dfbea9372b3ac26e1912b529985707937f8913e Mon Sep 17 00:00:00 2001 From: Noelia Date: Fri, 12 Dec 2025 07:43:14 +0100 Subject: [PATCH 04/10] refactor(SQ/StatusRollArea, SQ/StatusNavigationButton): Control-based roll, icon visibility API, and improved symmetric gradients - Refactored `StatusRollArea` to use a `Control` as the base type instead of `Item`, enabling native padding support and improving layout consistency. - Added `showIcon` property to both `StatusRollArea` and `StatusNavigationButton` for increased visual flexibility and clearer API semantics. - Updated `StatusNavigationButton` gradient background to ensure proper left/right symmetry and more polished visual behavior. --- .../StatusQ/Components/StatusCommunityCard.qml | 2 +- .../StatusQ/Controls/StatusNavigationButton.qml | 9 +++++---- ui/StatusQ/src/StatusQ/Core/StatusRollArea.qml | 17 +++++++++-------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ui/StatusQ/src/StatusQ/Components/StatusCommunityCard.qml b/ui/StatusQ/src/StatusQ/Components/StatusCommunityCard.qml index 644c98c6a06..3694d08e902 100644 --- a/ui/StatusQ/src/StatusQ/Components/StatusCommunityCard.qml +++ b/ui/StatusQ/src/StatusQ/Components/StatusCommunityCard.qml @@ -402,7 +402,7 @@ Rectangle { id: tagsListComponent StatusRollArea { implicitWidth: d.cardWidth - arrowsGradientColor: d.cardColor + gradientColor: d.cardColor // TODO: Replace by `StatusListItemTagRow` - To be done! content: Row { diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusNavigationButton.qml b/ui/StatusQ/src/StatusQ/Controls/StatusNavigationButton.qml index bf1333d0dea..cee6a211a5b 100644 --- a/ui/StatusQ/src/StatusQ/Controls/StatusNavigationButton.qml +++ b/ui/StatusQ/src/StatusQ/Controls/StatusNavigationButton.qml @@ -9,16 +9,17 @@ Button { property color gradientColor: Theme.palette.statusAppLayout.backgroundColor property bool navigateForward: false + property bool showIcon: true - width: height * 2 + width: root.showIcon ? height * 2 : Theme.bigPadding padding: 0 hoverEnabled: true background: Rectangle { gradient: Gradient { orientation: Gradient.Horizontal - GradientStop { position: navigateForward ? 0.0 : 1.0; color: "transparent" } - GradientStop { position: 0.5; color: root.gradientColor } + GradientStop { position: 0.0; color: navigateForward ? "transparent" : root.gradientColor } + GradientStop { position: 1.0; color: navigateForward ? root.gradientColor : "transparent" } } } @@ -30,9 +31,9 @@ Button { width: parent.height height: width color: Theme.palette.primaryColor1 + visible: root.showIcon } - // otherwise there is no pointing hand cursor when button is hovered StatusMouseArea { anchors.fill: parent diff --git a/ui/StatusQ/src/StatusQ/Core/StatusRollArea.qml b/ui/StatusQ/src/StatusQ/Core/StatusRollArea.qml index 9ac01d8d420..68a19a145f8 100644 --- a/ui/StatusQ/src/StatusQ/Core/StatusRollArea.qml +++ b/ui/StatusQ/src/StatusQ/Core/StatusRollArea.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import QtQuick.Layouts import StatusQ.Core @@ -7,18 +8,16 @@ import StatusQ.Components import StatusQ.Popups import StatusQ.Controls -Item { +Control { id: root property alias content: contentLoader.sourceComponent - property color arrowsGradientColor: Theme.palette.statusAppLayout.backgroundColor + property color gradientColor: Theme.palette.statusAppLayout.backgroundColor + property bool showIcon: true - implicitHeight: contentLoader.height - - StatusScrollView { + contentItem: StatusScrollView { id: roll - anchors.fill: parent padding: 0 contentWidth: contentLoader.width @@ -33,7 +32,8 @@ Item { anchors.left: parent.left height: parent.height visible: roll.flickable.contentX > 0 - gradientColor: root.arrowsGradientColor + gradientColor: root.gradientColor + showIcon: root.showIcon onClicked: roll.flickable.flick(roll.width, 0) } @@ -42,8 +42,9 @@ Item { anchors.right: parent.right height: parent.height visible: roll.flickable.contentX + roll.width < roll.contentWidth - gradientColor: root.arrowsGradientColor + gradientColor: root.gradientColor navigateForward: true + showIcon: root.showIcon onClicked: roll.flickable.flick(-roll.width, 0) } From 441455a9f3f8e9942d43b263ea214f667856f4e5 Mon Sep 17 00:00:00 2001 From: Noelia Date: Wed, 17 Dec 2025 10:59:38 +0100 Subject: [PATCH 05/10] fix(StatusScrollBar): Prevent Universal style opacity animation warning Replace `background: null` with an empty `Item` defining `opacity` to avoid QML warnings ("QML PropertyAction: Cannot animate non-existent property "opacity"") caused by the Universal ScrollBar style attempting to animate a non-existent opacity property. --- ui/StatusQ/src/StatusQ/Controls/StatusScrollBar.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusScrollBar.qml b/ui/StatusQ/src/StatusQ/Controls/StatusScrollBar.qml index db6df7118f1..c40eb0d774a 100644 --- a/ui/StatusQ/src/StatusQ/Controls/StatusScrollBar.qml +++ b/ui/StatusQ/src/StatusQ/Controls/StatusScrollBar.qml @@ -43,7 +43,9 @@ T.ScrollBar { implicitWidth: 14 implicitHeight: 14 - background: null + background: Item { + opacity: 1.0 + } contentItem: Rectangle { color: Theme.palette.primaryColor2 From 37c987361d8d52f3904fd6aad4892c80fd9a5e5c Mon Sep 17 00:00:00 2001 From: Noelia Date: Wed, 17 Dec 2025 11:00:59 +0100 Subject: [PATCH 06/10] fix(StatusMessageImageAlbum): Guard against undefined length assignment to int Ensure numeric fallback when deriving item counts from dynamic models, preventing QML warnings caused by assigning `undefined` to int properties. --- .../private/statusMessage/StatusMessageImageAlbum.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/StatusQ/src/StatusQ/Components/private/statusMessage/StatusMessageImageAlbum.qml b/ui/StatusQ/src/StatusQ/Components/private/statusMessage/StatusMessageImageAlbum.qml index 39c22991a64..0b2f488f27a 100644 --- a/ui/StatusQ/src/StatusQ/Components/private/statusMessage/StatusMessageImageAlbum.qml +++ b/ui/StatusQ/src/StatusQ/Components/private/statusMessage/StatusMessageImageAlbum.qml @@ -45,7 +45,9 @@ RowLayout { QtObject { id: d - readonly property int totalAlbumItems: root.album.length + readonly property int totalAlbumItems: root.album && root.album.length !== undefined + ? root.album.length + : 0 } spacing: 9 From aceb4b75e46b0d151f1b81d81891f2d4d64793a9 Mon Sep 17 00:00:00 2001 From: Noelia Date: Thu, 11 Dec 2025 13:44:03 +0100 Subject: [PATCH 07/10] refactor(ActivityCenterPopupTopBarPanel): Cleanup unused properties/signals, clarify naming, and enforce required props - Removed unused properties and signals to simplify the component API. - Renamed several properties for clearer behavior semantics and internal consistency. - Marked key properties as required to ensure correct usage at call sites and prevent silent misconfiguration. - Updated to use `StatusRollArea` directly instead of a plain `Item`, leveraging its built-in padding, scrolling behavior, and content handling. - Improved overall layout consistency and alignment according to design requirements. --- .../ActivityCenter/ActivityCenterLayout.qml | 9 +- .../panels/ActivityCenterPopupTopBarPanel.qml | 111 ++++++++---------- 2 files changed, 49 insertions(+), 71 deletions(-) diff --git a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml index 4b392ac42bf..ccfec6a4b77 100644 --- a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml +++ b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml @@ -124,19 +124,14 @@ StatusSectionLayout { id: activityCenterTopBar Layout.fillWidth: true - unreadNotificationsCount: activityCenterStore.unreadNotificationsCount hasAdmin: activityCenterStore.adminCount > 0 hasReplies: activityCenterStore.repliesCount > 0 hasMentions: activityCenterStore.mentionsCount > 0 hasContactRequests: activityCenterStore.contactRequestsCount > 0 hasMembership: activityCenterStore.membershipCount > 0 - hideReadNotifications: activityCenterStore.activityCenterReadType === ActivityCenterStore.ActivityCenterReadType.Unread activeGroup: activityCenterStore.activeNotificationGroup - onGroupTriggered: activityCenterStore.setActiveNotificationGroup(group) - onMarkAllReadClicked: activityCenterStore.markAllActivityCenterNotificationsRead() - onShowHideReadNotifications: activityCenterStore.setActivityCenterReadType(hideReadNotifications ? - ActivityCenterStore.ActivityCenterReadType.Unread : - ActivityCenterStore.ActivityCenterReadType.All) + + onSetActiveGroupRequested: activityCenterStore.setActiveNotificationGroup(group) } StatusListView { diff --git a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml index 96498a1b014..da3842c920b 100644 --- a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml +++ b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPopupTopBarPanel.qml @@ -13,74 +13,57 @@ import StatusQ.Popups import AppLayouts.stores import AppLayouts.ActivityCenter.helpers -Item { +StatusRollArea { id: root - property bool hasAdmin: false - property bool hasMentions: false - property bool hasReplies: false - property bool hasContactRequests: false - property bool hasMembership: false - - property bool hideReadNotifications: false - property int unreadNotificationsCount: 0 - - property int activeGroup: ActivityCenterTypes.ActivityCenterGroup.All - - property alias errorText: errorText.text - - signal groupTriggered(int group) - signal markAllReadClicked() - signal showHideReadNotifications(bool hideReadNotifications) - - height: 64 - - RowLayout { - id: row - anchors.fill: parent - anchors.leftMargin: Theme.padding - anchors.rightMargin: Theme.padding - spacing: Theme.padding - - StatusRollArea { - Layout.fillWidth: true - - content: RowLayout { - spacing: 0 - - Repeater { - // NOTE: some entries are hidden until implimentation - model: [ { text: qsTr("All"), group: ActivityCenterTypes.ActivityCenterGroup.All, visible: true, enabled: true }, - { text: qsTr("News"), group: ActivityCenterTypes.ActivityCenterGroup.NewsMessage, visible: true, enabled: true }, - { text: qsTr("Admin"), group: ActivityCenterTypes.ActivityCenterGroup.Admin, visible: root.hasAdmin, enabled: root.hasAdmin }, - { text: qsTr("Mentions"), group: ActivityCenterTypes.ActivityCenterGroup.Mentions, visible: true, enabled: root.hasMentions }, - { text: qsTr("Replies"), group: ActivityCenterTypes.ActivityCenterGroup.Replies, visible: true, enabled: root.hasReplies }, - { text: qsTr("Contact requests"), group: ActivityCenterTypes.ActivityCenterGroup.ContactRequests, visible: true, enabled: root.hasContactRequests }, - { text: qsTr("Transactions"), group: ActivityCenterTypes.ActivityCenterGroup.Transactions, visible: false, enabled: true }, - { text: qsTr("Membership"), group: ActivityCenterTypes.ActivityCenterGroup.Membership, visible: true, enabled: root.hasMembership }, - { text: qsTr("System"), group: ActivityCenterTypes.ActivityCenterGroup.System, visible: false, enabled: true } ] - - StatusFlatButton { - objectName: "activityCenterGroupButton" - enabled: modelData.enabled - visible: modelData.visible - text: modelData.text - size: StatusBaseButton.Size.Small - highlighted: modelData.group === root.activeGroup - onClicked: root.groupTriggered(modelData.group) - onEnabledChanged: if (!enabled && highlighted) root.groupTriggered(ActivityCenterTypes.ActivityCenterGroup.All) - Layout.preferredWidth: visible ? implicitWidth : 0 - } - } + required property bool hasAdmin + required property bool hasMentions + required property bool hasReplies + required property bool hasContactRequests + required property bool hasMembership + required property int activeGroup + + signal setActiveGroupRequested(int group) + + bottomPadding: Theme.padding + showIcon: false + gradientColor: Theme.palette.baseColor4 + + content: RowLayout { + spacing: 4 + + anchors.left: parent.left + anchors.leftMargin: 12 // By design + + Repeater { + // NOTE: some entries are hidden until implementation + model: [ { text: qsTr("All"), group: ActivityCenterTypes.ActivityCenterGroup.All, visible: true, enabled: true }, + { text: qsTr("News"), group: ActivityCenterTypes.ActivityCenterGroup.NewsMessage, visible: true, enabled: true }, + { text: qsTr("Admin"), group: ActivityCenterTypes.ActivityCenterGroup.Admin, visible: root.hasAdmin, enabled: root.hasAdmin }, + { text: qsTr("Mentions"), group: ActivityCenterTypes.ActivityCenterGroup.Mentions, visible: true, enabled: root.hasMentions }, + { text: qsTr("Replies"), group: ActivityCenterTypes.ActivityCenterGroup.Replies, visible: true, enabled: root.hasReplies }, + { text: qsTr("Contact requests"), group: ActivityCenterTypes.ActivityCenterGroup.ContactRequests, visible: true, enabled: root.hasContactRequests }, + { text: qsTr("Transactions"), group: ActivityCenterTypes.ActivityCenterGroup.Transactions, visible: false, enabled: true }, + { text: qsTr("Membership"), group: ActivityCenterTypes.ActivityCenterGroup.Membership, visible: true, enabled: root.hasMembership }, + { text: qsTr("System"), group: ActivityCenterTypes.ActivityCenterGroup.System, visible: false, enabled: true } ] + + StatusFlatButton { + objectName: "activityCenterGroupButton" + enabled: modelData.enabled + visible: modelData.visible + text: modelData.text + size: StatusBaseButton.Size.Small + highlighted: modelData.group === root.activeGroup + onClicked: root.setActiveGroupRequested(modelData.group) + onEnabledChanged: if (!enabled && highlighted) root.setActiveGroupRequested(ActivityCenterTypes.ActivityCenterGroup.All) + Layout.preferredWidth: visible ? implicitWidth : 0 } } - } - StatusBaseText { - id: errorText - visible: !!text - anchors.top: parent.top - anchors.topMargin: Theme.smallPadding - color: Theme.palette.dangerColor1 + // Filler + Item { + height: root.height + width: 12 // By design + } } } From a1ab55b4c70d46e84541610c5a2e2d746e93309a Mon Sep 17 00:00:00 2001 From: Noelia Date: Thu, 4 Dec 2025 13:52:07 +0100 Subject: [PATCH 08/10] feat(ActivityCenterPanel): Introduce `ActivityCenterPanel` component and testing page - Introduces the new `ActivityCenterPanel` as the foundation for the redesigned Activity Center experience. - Adds a dedicated Storybook/testing page to support development, review, and future iterations. - Integrates `ActivityCenterPopupTopBarPanel` into the panel structure. - Includes a minimal, non-final options menu to maintain existing behavior without blocking current workflows. - Includes layout composition and notification rendering by adopting the new `NotificationCard` component and clearer model/delegate boundaries. - Adds a fully mocked `NotificationsModel` covering all supported notification types, visual states, and UI variations in Status app. - Updates Spanish translations scoped to the Activity Center context. - Implements core interaction logic, including read/unread state handling, news-specific placeholders, and empty-state panels. Closes #18798 --- storybook/pages/ActivityCenterPanelPage.qml | 263 +++++++ storybook/resources.qrc | 1 + storybook/src/Models/NotificationsModel.qml | 675 ++++++++++++++++++ storybook/src/Models/qmldir | 1 + .../panels/ActivityCenterOptionsPanel.qml | 36 + .../panels/ActivityCenterPanel.qml | 309 ++++++++ .../AppLayouts/ActivityCenter/panels/qmldir | 2 +- ui/i18n/qml_base_en.ts | 50 ++ ui/i18n/qml_base_lokalise_en.ts | 61 ++ ui/i18n/qml_cs.ts | 50 ++ ui/i18n/qml_es.ts | 58 +- ui/i18n/qml_ko.ts | 50 ++ 12 files changed, 1551 insertions(+), 5 deletions(-) create mode 100644 storybook/pages/ActivityCenterPanelPage.qml create mode 100644 storybook/src/Models/NotificationsModel.qml create mode 100644 ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterOptionsPanel.qml create mode 100644 ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml diff --git a/storybook/pages/ActivityCenterPanelPage.qml b/storybook/pages/ActivityCenterPanelPage.qml new file mode 100644 index 00000000000..699d8779990 --- /dev/null +++ b/storybook/pages/ActivityCenterPanelPage.qml @@ -0,0 +1,263 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import StatusQ.Core.Theme + +import AppLayouts.ActivityCenter.helpers +import AppLayouts.ActivityCenter.panels + +import Storybook +import Models + +import QtModelsToolkit +import utils + +SplitView { + id: root + + Logs { id: logs } + + // Since the notifications model mock is defined as `ListModel`, once the `onAppend` happen, attachments role is converted + // from a plain array to a submodel. That's why it cannot be defined directly on the model definition file. + // Here it is a manual definition of the `attachments` role so that the plain array is set to the items needed. + ObjectProxyModel { + id: notificationsModelMock + + sourceModel: NotificationsModel{} + + delegate: QtObject { + readonly property var attachments: { + if (model.chatKey === "zQ3shuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTAAA") // TODO: It will be the notification type instead + return [ + "https://picsum.photos/320/240?3", + "https://picsum.photos/320/240?4", + "https://picsum.photos/320/240?5", + "https://picsum.photos/320/240?6", + "https://picsum.photos/320/240?7", + "https://picsum.photos/320/240?8", + "https://picsum.photos/320/240?1" + ] + else if (model.chatKey === "zQ3142hUdnpxi26rLmgdUwNxHgcbcYFW75JcSvVych58QVXXT") // TODO: It will be the notification type instead + return [ + "https://picsum.photos/320/240?1", + "https://picsum.photos/320/240?2", + "https://picsum.photos/320/240?9" + ] + + else if (model.chatKey === "zAssshuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7Jss12") // TODO: It will be the notification type instead + return [ + "https://picsum.photos/320/240?10", + "https://picsum.photos/320/240?9" + ] + else if (model.chatKey === "zAMNAuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTXcA") // TODO: It will be the notification type instead + return [ + "https://picsum.photos/320/240?11" + ] + return [] + } + } + + expectedRoles: "chatKey" // TODO: It will be the notification type instead + exposedRoles: "attachments" + } + + SplitView { + orientation: Qt.Vertical + SplitView.fillWidth: true + + Rectangle { + SplitView.fillWidth: true + SplitView.fillHeight: true + + color: Theme.palette.baseColor4 + + Rectangle { + color: Theme.palette.baseColor2 + radius: 12 + anchors.centerIn: parent + width: slider.value + height: sliderHeight.value + + ActivityCenterPanel { + property int currentActiveGroup: ActivityCenterTypes.ActivityCenterGroup.All + + anchors.fill: parent + + backgroundColor: parent.color + + hasAdmin: admin.checked + hasMentions: mentions.checked + hasReplies: replies.checked + hasContactRequests: contactRequests.checked + hasMembership: membership.checked + activeGroup: currentActiveGroup + + hasUnreadNotifications: unreadNotifications.checked + readNotificationsStatus: read.checked ? ActivityCenterTypes.ActivityCenterReadType.Read : + unread.checked ? ActivityCenterTypes.ActivityCenterReadType.Unread : + ActivityCenterTypes.ActivityCenterReadType.All + notificationsModel: (noNotifications.checked || unread.checked) ? null : notificationsModelMock + newsSettingsStatus: newsSettingsTurnOff.checked ? Constants.settingsSection.notifications.turnOffValue : Constants.settingsSection.notifications.sendAlertsValue + newsEnabledViaRSS: enabledViaRSS.checked + + onMoreOptionsRequested: logs.logEvent("ActivityCenterPanel::onMoreOptionsRequested") + onCloseRequested: logs.logEvent("ActivityCenterPanel::onCloseRequested") + onMarkAllAsReadRequested: { + logs.logEvent("ActivityCenterPanel::onMarkAllAsReadRequested") + unreadNotifications.checked = false + } + onHideShowNotificationsRequested: { + logs.logEvent("ActivityCenterPanel::onHideShowNotificationsRequested: " + hideReadNotifications) + if(hideReadNotifications) + read.checked = true + else + unread.checked = true + } + onSetActiveGroupRequested: (group) => { + logs.logEvent("ActivityCenterPanel::onSetActiveGroupRequested: " + group) + currentActiveGroup = group + } + onNotificationClicked: (index) => logs.logEvent("ActivityCenterPanel::onNotificationClicked: " + index) + onFetchMoreNotificationsRequested: logs.logEvent("ActivityCenterPanel::onFetchMoreNotificationsRequested") + onEnableNewsViaRSSRequested: { + logs.logEvent("ActivityCenterPanel::onEnableNewsViaRSSRequested") + enabledViaRSS.checked = !enabledViaRSS.checked + } + onEnableNewsRequested: { + logs.logEvent("ActivityCenterPanel::onEnableNewsRequested") + newsSettingsTurnOff.checked = !newsSettingsTurnOff.checked + } + } + } + } + + LogsAndControlsPanel { + id: logsAndControlsPanel + + SplitView.minimumHeight: 100 + SplitView.preferredHeight: 200 + + logsView.logText: logs.logText + } + } + + Pane { + SplitView.minimumWidth: 300 + SplitView.preferredWidth: 300 + + ColumnLayout { + Label { + Layout.fillWidth: true + text: "Panel dynamic width:" + font.bold: true + } + Slider { + id: slider + Layout.fillWidth: true + value: 368 + from: 250 + to: 600 + } + + Label { + Layout.fillWidth: true + text: "Panel dynamic height:" + font.bold: true + } + Slider { + id: sliderHeight + Layout.fillWidth: true + value: 650 + from: 400 + to: 800 + } + + Label { + Layout.fillWidth: true + text: "Type of notifications:" + font.bold: true + } + + CheckBox { + id: admin + Layout.fillWidth: true + text: "Has admin notifications?" + } + + CheckBox { + id: mentions + Layout.fillWidth: true + text: "Has mentions notifications?" + } + + CheckBox { + id: replies + Layout.fillWidth: true + text: "Has replies notifications?" + } + + CheckBox { + id: contactRequests + Layout.fillWidth: true + text: "Has contact requests notifications?" + } + + CheckBox { + id: membership + Layout.fillWidth: true + text: "Has membership notifications?" + } + + Label { + Layout.fillWidth: true + text: "News Feed Settings" + font.bold: true + } + + CheckBox { + id: newsSettingsTurnOff + Layout.fillWidth: true + text: "Turn Off Settings" + } + + CheckBox { + id: enabledViaRSS + Layout.fillWidth: true + text: "Enabled Via RSS?" + } + + Label { + Layout.fillWidth: true + text: "Read Status" + font.bold: true + } + + RadioButton { + id: read + text: "Read" + checked: true + } + RadioButton { + id: unread + text: "Unread" + } + RadioButton { + id: noNotifications + text: "No notifications" + } + + CheckBox { + id: unreadNotifications + Layout.fillWidth: true + text: "Has unread nontificaitons?" + checked: true + } + } + } +} + +// category: Panels +// status: good +// https://www.figma.com/design/SGyfSjxs5EbzimHDXTlj8B/Qt-Responsive---v?node-id=1868-52013&m=dev +// https://www.figma.com/design/SGyfSjxs5EbzimHDXTlj8B/Qt-Responsive---v?node-id=1902-48455&m=dev diff --git a/storybook/resources.qrc b/storybook/resources.qrc index 5f6483ac33f..9f50804d292 100644 --- a/storybook/resources.qrc +++ b/storybook/resources.qrc @@ -1,5 +1,6 @@ main.qml + pages/ActivityCenterPanelPage.qml diff --git a/storybook/src/Models/NotificationsModel.qml b/storybook/src/Models/NotificationsModel.qml new file mode 100644 index 00000000000..5a20e3f23da --- /dev/null +++ b/storybook/src/Models/NotificationsModel.qml @@ -0,0 +1,675 @@ +import QtQuick + +import StatusQ.Core.Theme + +// *** +// This model provides examples of all notification types supported by the Status app, +// showcasing the different visual states and UI variations for each notification card. +// *** +// +// Here is an example of the complete set of properties that a `Notification model` can contain: +//{ +// // Card states related +// unread: false, +// selected: false, +// +// // Avatar related +// avatarSource: "https://i.pravatar.cc/128?img=8", +// badgeIconName: "action-mention", +// isCircularAvatar: true, +// +// // Header row related +// title: "Notification 2", +// chatKey: "zQ3saskd11lfkjs1dkf5Rj9", +// isContact: true, +// trustIndicator: 0, +// +// // Context row related +// primaryText: "Communities", +// iconName: "communities", +// secondaryText: "Channel 12", +// separatorIconName: "arrow-next", +// +// // Action text +// actionText: "Action Text", +// +// // Content block related +// preImageSource: "https://picsum.photos/320/240?6", +// preImageRadius: 8, +// content: "Some notification description that can be long and long and long", +// attachments: [ +// "https://picsum.photos/320/240?1", +// "https://picsum.photos/320/240?2", +// "https://picsum.photos/320/240?9" +// ], +// +// // Timestamp related +// timestamp: 1765799225000 +//} +// +ListModel { + id: root + + readonly property var data: [ + { + // MENTION IN 1:1 TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=45", + badgeIconName: "action-mention", + isCircularAvatar: true, + + // Header row related + title: "anna.eth", + chatKey: "zQ3shuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTAAA", + isContact: false, + trustIndicator: 0, + + // Content block related + content: "hey, @robert.eth, " + + "Do we still plan to ship this with v2.1 or postpone to the next release cycle?", + + // Timestamp related + timestamp: 1765799225000 + }, + { + // REPLY 1:1 TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=5", + badgeIconName: "action-reply", + isCircularAvatar: true, + + // Header row related + title: "anna.eth with long nickname", + chatKey: "zQ3142hUdnpxi26rLmgdUwNxHgcbcYFW75JcSvVych58QVXXT", + isContact: true, + trustIndicator: 0, + + // Content block related + content: "hey, Do we still plan to ship this with v2.1 or postpone to the next release cycle? we’re discussed it on the last meet", + + // Timestamp related + timestamp: 1729799225000 + }, + { + // CONTACT REQUEST TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=15", + badgeIconName: "action-add", + isCircularAvatar: true, + + // Header row related + title: "simon-dev.eth", + chatKey: "z1425uV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTp7A", + isContact: false, + trustIndicator: 0, + + // Action text + actionText: "New contact request", + + // Content block related + content: "Hey! I came across your profile and thought it’d be nice to connect. Always happy to meet new people here 🙂", + + // Timestamp related + timestamp: 1765909333000 + }, + { + // CONTACT REMOVED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=20", + badgeIconName: "action-warn", + isCircularAvatar: true, + + // Header row related + title: "Sunshine", + chatKey: "zQ3shgUZD14523iavJnT8rMhkzZ1RzLdioS2J6dZyVp3JosEQ", + isContact: true, + trustIndicator: 1, + + // Action text + actionText: "Removed you from contacts", + + // Timestamp related + timestamp: 1765329333000 + }, + { + // NEW PRIVATE GROUP CHAT TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=8", + badgeIconName: "action-add", + isCircularAvatar: true, + + // Header row related + title: "rockstar.eth", + chatKey: "z0000uV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTAAA", + isContact: true, + trustIndicator: 2, + + // Context row related + primaryText: "Summer Vacation", + + // Action text + actionText: "You're added to private group chat", + + // Timestamp related + timestamp: 1665909333000 + }, + { + // MENTION IN GROUP CHAT TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=1", + badgeIconName: "action-mention", + isCircularAvatar: true, + + // Header row related + title: "anna.eth", + chatKey: "zAMNAuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTXcA", + isContact: true, + trustIndicator: 1, + + // Context row related + primaryText: "Summer Vacation", + + // Content block related + content: "Hey @rockstar.eth 👋 just wanted to check something with you.", + + // Timestamp related + timestamp: 1699009333000 + }, + { + // REPLY IN GROUP CHAT TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: "https://i.pravatar.cc/128?img=21", + badgeIconName: "action-reply", + isCircularAvatar: true, + + // Header row related + title: "Buddy", + chatKey: "zAMZAuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTXcA", + isContact: false, + trustIndicator: 0, + + // Context row related + primaryText: "UI Group Chat", + + // Content block related + content: "Hi Pal! Saw your message and wanted to reply real quick.", + + // Timestamp related + timestamp: 1755329333000 + }, + { + // MENTION IN COMMUNITY TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.cryptPunks, + badgeIconName: "action-mention", + isCircularAvatar: true, + + // Header row related + title: "Mate-Mate", + chatKey: "zAQshuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7JTA12", + isContact: true, + trustIndicator: 0, + + // Context row related + primaryText: "CryptoPunks", + iconName: "communities", + secondaryText: "#design", + separatorIconName: "arrow-next", + + // Content block related + content: "@pepe.eth I’ve just mentioned you in a conversation you might find interesting.", + + // Timestamp related + timestamp: 1765799225000 + }, + { + // REPLY IN COMMUNITY TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.cryptPunks, + badgeIconName: "action-reply", + isCircularAvatar: true, + + // Header row related + title: "Friend", + chatKey: "zAssshuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7Jss12", + isContact: true, + trustIndicator: 1, + + // Context row related + primaryText: "CryptoPunks", + iconName: "communities", + secondaryText: "#design", + separatorIconName: "arrow-next", + + // Content block related + content: "Do we still plan to ship this with v2.1, or should we postpone it to the next release cycle? + From my side, I think it would be good to clarify this soon so we can align expectations and avoid last-minute changes. Depending on the scope and remaining work, we can either lock it down for v2.1 or consciously move it to the next iteration and treat it as a follow-up improvement.", + + // Timestamp related + timestamp: 1735799225000 + }, + { + // INVITATION TO COMMUNITY TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.socks, + badgeIconName: "action-add", + isCircularAvatar: true, + + // Header row related + title: "anna.eth", + chatKey: "z123shuV7mZextijeBSDpgaq2EvebPGEeCrkH9AgmpCM7Jsaaa", + isContact: false, + trustIndicator: 1, + + // Context row related + primaryText: "Socks Super Long Long Community Name ", + iconName: "communities", + secondaryText: "#design", + separatorIconName: "arrow-next", + + // Action text + actionText: "Invitation to join community", + + // Timestamp related + timestamp: 1745799225000 + }, + { + // MEMBERSHIP REQUEST TO COMMUNITY TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.socks, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Socks Super Long Long Community Name ", + iconName: "communities", + + // Action text + actionText: "@pepe.eth requested membership in your community", + + // Timestamp related + timestamp: 1755799225000 + }, + { + // MEMBERSHIP REQUEST ACCEPTED TO COMMUNITY TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.socks, + badgeIconName: "action-check", + isCircularAvatar: true, + + // Context row related + primaryText: "Socks Community Name ", + iconName: "communities", + + // Action text + actionText: "Request to join community accepted", + + // Timestamp related + timestamp: 1765799225000 + }, + { + // KICKED FROM COMMUNITY TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.socks, + badgeIconName: "action-warn", + isCircularAvatar: true, + + // Context row related + primaryText: "Socks Super Long Long Community Name ", + iconName: "communities", + + // Action text + actionText: "You have been kicked out of community", + + // Timestamp related + timestamp: 1766899225000 + }, + { + // COMMUNITY TOKEN RECEIVED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.dribble, + badgeIconName: "action-coin", + isCircularAvatar: true, + + // Context row related + primaryText: "Dribble", + iconName: "communities", + + // Action text + actionText: "You're received a token in community", + + // Timestamp related + timestamp: 1765699225000 + }, + { + // FIRST COMMUNITY TOKEN RECEIVED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.dribble, + badgeIconName: "action-coin", + isCircularAvatar: true, + + // Context row related + primaryText: "Dribble", + iconName: "communities", + + // Action text + actionText: "You're received a first community token", + + // Timestamp related + timestamp: 1765688225000 + }, + { + // BANNED FROM COMMUNITY TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.dribble, + badgeIconName: "action-warn", + isCircularAvatar: true, + + // Context row related + primaryText: "Dribble", + iconName: "communities", + + // Action text + actionText: "You were banned from community", + + // Timestamp related + timestamp: 1766988225000 + }, + { + // UNBANNED FROM COMMUNITY TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.dribble, + badgeIconName: "action-check", + isCircularAvatar: true, + + // Context row related + primaryText: "Dribble", + iconName: "communities", + + // Action text + actionText: "You have been unbanned in community", + + // Timestamp related + timestamp: 1760988225000 + }, + { + // OWNER TOKEN RECEIVED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.spotify, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Music and Sound", + iconName: "communities", + + // Action text + actionText: "You received the owner token from @robert.eth", + + // Timestamp related + timestamp: 1760999225000 + }, + { + // OWNERSHIP RECEIVED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.spotify, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Music and Sound", + iconName: "communities", + + // Action text + actionText: "You are now the owner of the community", + + // Timestamp related + timestamp: 1760859225000 + }, + { + // OWNERSHIP LOST TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.spotify, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Music and Sound", + iconName: "communities", + + // Action text + actionText: "You no longer control the community", + + // Timestamp related + timestamp: 1770859225000 + }, + { + // OWNERSHIP TRANSFER FAILED TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.spotify, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Music and Sound", + iconName: "communities", + + // Action text + actionText: "Ownership transfer failed", + + // Timestamp related + timestamp: 1767759225000 + }, + { + // OWNERSHIP TRANSFER DECLINED TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: ModelsData.icons.spotify, + badgeIconName: "action-admin", + isCircularAvatar: true, + + // Context row related + primaryText: "Music and Sound", + iconName: "communities", + + // Action text + actionText: "Ownership transfer declined", + + // Timestamp related + timestamp: 1767785225000 + }, + { + // SYSTEM - NEW INSTALLATION TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: Assets.png("status-logo-icon"), + isCircularAvatar: false, + + + // Header row related + title: "Status", + + // Content block related + content: "New installation received from iPhoneABC", + + // Timestamp related + timestamp: 1759995225000 + }, + { + // SYSTEM - FETCHING BACKUP TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: Assets.png("status-logo-icon"), + badgeIconName: "action-sync", + isCircularAvatar: false, + + + // Header row related + title: "Status", + + // Content block related + content: "Backup syncing fetching", + + // Timestamp related + timestamp: 1759895225000 + }, + { + // SYSTEM - BACKUP SYNCING PARTIAL FAIL TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: Assets.png("status-logo-icon"), + badgeIconName: "action-sync-fail", + isCircularAvatar: false, + + + // Header row related + title: "Status", + + // Content block related + content: "Backup sync partially failed", + + // Timestamp related + timestamp: 1759795225000 + }, + { + // SYSTEM - BACKUP SYNCING FAILURE TYPE + // Card states related + unread: false, + selected: false, + + // Avatar related + avatarSource: Assets.png("status-logo-icon"), + badgeIconName: "action-sync-fail", + isCircularAvatar: false, + + + // Header row related + title: "Status", + + // Content block related + content: "Backup sync failed", + + // Timestamp related + timestamp: 1759887225000 + }, + { + // SYSTEM - NEWS ARTICLE TYPE + // Card states related + unread: true, + selected: false, + + // Avatar related + avatarSource: Assets.png("status-logo-icon"), + isCircularAvatar: false, + + // Header row related + title: "Status", + + // Content block related + preImageSource: "https://picsum.photos/320/240?6", + preImageRadius: 8, + content: "Update on notifications section will be rolled out to all users next week. Be prepared!", + + // Timestamp related + timestamp: 1756887225000 + } + ] + + Component.onCompleted: append(data) +} diff --git a/storybook/src/Models/qmldir b/storybook/src/Models/qmldir index 0b71c1af6d2..cf842025b26 100644 --- a/storybook/src/Models/qmldir +++ b/storybook/src/Models/qmldir @@ -14,6 +14,7 @@ LinkPreviewModel 1.0 LinkPreviewModel.qml LoginAccountsModel 1.0 LoginAccountsModel.qml MintedTokensModel 1.0 MintedTokensModel.qml ManageCollectiblesModel 1.0 ManageCollectiblesModel.qml +NotificationsModel 1.0 NotificationsModel.qml ReactionsModels 1.0 ReactionsModels.qml RecipientModel 1.0 RecipientModel.qml TokenListsModel 1.0 TokenListsModel.qml diff --git a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterOptionsPanel.qml b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterOptionsPanel.qml new file mode 100644 index 00000000000..f9f9b74176e --- /dev/null +++ b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterOptionsPanel.qml @@ -0,0 +1,36 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import StatusQ.Core.Theme +import StatusQ.Components +import StatusQ.Core +import StatusQ.Popups + +import utils + +// It will be reworked on task https://github.com/status-im/status-app/issues/18906 +StatusMenu { + id: root + + required property bool hasUnreadNotifications + required property bool hideReadNotifications + + signal markAllAsReadRequested() + signal hideShowNotificationsRequested() + + StatusAction { + visibleOnDisabled: true + enabled: root.hasUnreadNotifications + text: qsTr("Mark all as read") + icon.name: "double-checkmark" + onTriggered: root.markAllAsReadRequested() + } + + StatusAction { + text: !root.hideReadNotifications ? qsTr("Hide read notifications") : + qsTr("Show read notifications") + icon.name: !root.hideReadNotifications ? "hide" : "show" + onTriggered: root.hideShowNotificationsRequested() + } +} diff --git a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml new file mode 100644 index 00000000000..903784e7fd0 --- /dev/null +++ b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml @@ -0,0 +1,309 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + + +import StatusQ.Core.Theme +import StatusQ.Components +import StatusQ.Controls +import StatusQ.Core +import StatusQ.Core.Backpressure + +import StatusQ +import StatusQ.Popups +import StatusQ.Popups.Dialog + +import AppLayouts.ActivityCenter.controls +import AppLayouts.ActivityCenter.helpers + +import utils + +Control { + id: root + + // Properties related to the different notification types / groups: + required property bool hasAdmin + required property bool hasMentions + required property bool hasReplies + required property bool hasContactRequests + required property bool hasMembership + required property int activeGroup + + // Properties related to notifications states: + required property int readNotificationsStatus + required property bool hasUnreadNotifications + readonly property bool hideReadNotifications: root.readNotificationsStatus === ActivityCenterTypes.ActivityCenterReadType.Unread + required property var notificationsModel + + // Properties related to news feed settings: + required property string newsSettingsStatus + required property bool newsEnabledViaRSS + + // Style: + property color backgroundColor: Theme.palette.baseColor2 + + signal moreOptionsRequested() + signal closeRequested() + signal markAllAsReadRequested() + signal hideShowNotificationsRequested() + signal setActiveGroupRequested(int group) + signal notificationClicked(int index) + signal fetchMoreNotificationsRequested() + signal enableNewsViaRSSRequested() + signal enableNewsRequested() + + QtObject { + id: d + + readonly property bool emptyNotificationsList: listView.count === 0 + readonly property bool newsDisabledBySettings: !root.newsEnabledViaRSS || root.newsSettingsStatus === Constants.settingsSection.notifications.turnOffValue + readonly property bool isNewsPlaceholderActive: root.activeGroup === ActivityCenterTypes.ActivityCenterGroup.NewsMessage && d.newsDisabledBySettings + + property bool optionsMenuVisible: false + + readonly property var fetchMoreNotifications: Backpressure.oneInTimeQueued(root, 100, function() { + if (listView.contentY >= listView.contentHeight - listView.height - 1) { + root.fetchMoreNotificationsRequested() + } + }) + } + + contentItem: ColumnLayout { + spacing: 0 + + // Panel Header + RowLayout { + id: panelHeader + + Layout.fillWidth: true + Layout.leftMargin: Theme.padding + Layout.topMargin: Theme.halfPadding + Layout.bottomMargin: Theme.halfPadding + Layout.rightMargin: 0 + + spacing: 0 + + StatusNavigationPanelHeadline { + Layout.fillWidth: true + + font.pixelSize: Theme.fontSize(19) + text: qsTr("Notifications") + elide: Text.ElideRight + } + + // Filler + Item { + Layout.fillWidth: true + } + + StatusFlatRoundButton { + id: moreBtn + objectName: "moreOptionsButton" + icon.name: "more" + onClicked: options.open() + + // It will be reworked on task https://github.com/status-im/status-app/issues/18906 + ActivityCenterOptionsPanel { + id: options + + y: panelHeader.height + x: -implicitWidth + moreBtn.width + + hasUnreadNotifications: root.hasUnreadNotifications + hideReadNotifications: root.hideReadNotifications + + onMarkAllAsReadRequested: root.markAllAsReadRequested() + onHideShowNotificationsRequested: root.hideShowNotificationsRequested() + onOpened: d.optionsMenuVisible = true + onClosed: d.optionsMenuVisible = false + } + } + + StatusFlatRoundButton { + objectName: "closeButton" + icon.name: "close" + onClicked: { + d.optionsMenuVisible = false + root.closeRequested() + } + } + } + + // Notification's List Header + ActivityCenterPopupTopBarPanel { + Layout.fillWidth: true + + hasAdmin: root.hasAdmin + hasReplies: root.hasReplies + hasMentions: root.hasMentions + hasContactRequests: root.hasContactRequests + hasMembership: root.hasMembership + activeGroup: root.activeGroup + + gradientColor: root.backgroundColor + + onSetActiveGroupRequested: (group)=> root.setActiveGroupRequested(group) + } + + // Notifications List + StatusListView { + id: listView + Layout.fillWidth: true + Layout.fillHeight: !d.emptyNotificationsList || !d.isNewsPlaceholderActive + Layout.topMargin: 2 + + visible: !d.emptyNotificationsList && !d.isNewsPlaceholderActive + enabled: !d.optionsMenuVisible + verticalScrollBar.implicitWidth: Theme.halfPadding + + spacing: 4 + implicitHeight: contentHeight + model: root.notificationsModel + clip: true + delegate: NotificationCard { + enabled: !d.optionsMenuVisible + + width: root.width - 2 * Theme.halfPadding + anchors.horizontalCenter: listView.contentItem.horizontalCenter + + // Card states related + unread: model.unread + selected: model.selected + + // Avatar related + avatarSource: model.avatarSource + badgeIconName: model.badgeIconName + isCircularAvatar: model.isCircularAvatar + + // Header row related + title: model.title + chatKey: model.chatKey + isContact: model.isContact + trustIndicator: model.trustIndicator + + // Context row related + primaryText: model.primaryText + iconName: model.iconName + secondaryText: model.secondaryText + separatorIconName: model.separatorIconName + + // Action text + actionText: model.actionText + + // Content block related + preImageSource: model.preImageSource + preImageRadius: model.preImageRadius + content: model.content + attachments: model.attachments + + // Timestamp related + timestamp: model.timestamp + + // Interactions + onClicked: root.notificationClicked(model.index) + } + + onContentYChanged: d.fetchMoreNotifications() + + // Overlay + Rectangle { + visible: d.optionsMenuVisible + anchors.fill: parent + color: root.backgroundColor + opacity: 0.8 + } + } + + // Placeholders in particular cases: + // This will be reworked on: https://github.com/status-im/status-app/issues/18905 + // Placeholder for the status news when their settings are disabled + // OR Placeholder for the status news when they are all seen or there are no notifications + Loader { + id: placeholderLoader + + + Layout.fillWidth: true + Layout.margins: Theme.padding + visible: active + active: d.isNewsPlaceholderActive || d.emptyNotificationsList + + sourceComponent: d.isNewsPlaceholderActive ? newsPlaceholderPanel : emptyPlaceholderPanel + } + + // Filler + Item { + Layout.fillHeight: placeholderLoader.active || d.emptyNotificationsList + } + } + + // This will be reworked on: https://github.com/status-im/status-app/issues/18905 + // If !root.newsEnabledViaRSS it means the panel is for enabling RSS notification + // Otherwise, it means it is for enabling status news notifications in settings + Component { + id: newsPlaceholderPanel + + ColumnLayout { + id: newsPanelLayout + + anchors.centerIn: parent + width: 320 + spacing: 12 + + StatusBaseText { + Layout.alignment: Qt.AlignHCenter + Layout.maximumWidth: parent.width + + text: !root.newsEnabledViaRSS ? qsTr("Enable RSS to receive Status News notifications") : + qsTr("Enable Status News notifications") + font.weight: Font.Bold + lineHeight: 1.2 + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + + StatusBaseText { + Layout.alignment: Qt.AlignHCenter + Layout.maximumWidth: parent.width + + font.pixelSize: Theme.additionalTextSize + color: Theme.palette.baseColor1 + text: !root.newsEnabledViaRSS ? qsTr("RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements.") : + qsTr("This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements") + lineHeight: 1.2 + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + + StatusButton { + Layout.alignment: Qt.AlignHCenter + + text: !root.newsEnabledViaRSS ? qsTr("Enable RSS"): + qsTr("Enable Status News notifications") + font.pixelSize: Theme.additionalTextSize + + onClicked: { + if (!root.newsEnabledViaRSS) { + root.enableNewsViaRSSRequested() + } else { + root.enableNewsRequested() + } + } + } + } + } + + // This will be reworked on: https://github.com/status-im/status-app/issues/18905 + Component { + id: emptyPlaceholderPanel + + StatusBaseText { + // If the mode is unread only, it means the user has seen all notifications and is up to date + // If the mode is all, it means there are no notifications to show + text: root.readNotificationsStatus === ActivityCenterTypes.ActivityCenterReadType.Unread ? + qsTr("You're all caught up") : + qsTr("Your notifications will appear here") + horizontalAlignment: Text.AlignHCenter + color: Theme.palette.baseColor1 + } + } +} diff --git a/ui/app/AppLayouts/ActivityCenter/panels/qmldir b/ui/app/AppLayouts/ActivityCenter/panels/qmldir index 487704db7dc..08ec53e30c1 100644 --- a/ui/app/AppLayouts/ActivityCenter/panels/qmldir +++ b/ui/app/AppLayouts/ActivityCenter/panels/qmldir @@ -1,2 +1,2 @@ +ActivityCenterPanel 1.0 ActivityCenterPanel.qml ActivityCenterPopupTopBarPanel 1.0 ActivityCenterPopupTopBarPanel.qml - diff --git a/ui/i18n/qml_base_en.ts b/ui/i18n/qml_base_en.ts index 3137a72431e..0e1c492ad98 100644 --- a/ui/i18n/qml_base_en.ts +++ b/ui/i18n/qml_base_en.ts @@ -309,6 +309,56 @@ + + ActivityCenterOptionsPanel + + Mark all as read + + + + Hide read notifications + + + + Show read notifications + + + + + ActivityCenterPanel + + Notifications + + + + Enable RSS to receive Status News notifications + + + + Enable Status News notifications + + + + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + + + + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + + + + Enable RSS + + + + You're all caught up + + + + Your notifications will appear here + + + ActivityCenterPopupTopBarPanel diff --git a/ui/i18n/qml_base_lokalise_en.ts b/ui/i18n/qml_base_lokalise_en.ts index 5b38274bac3..37de6a50836 100644 --- a/ui/i18n/qml_base_lokalise_en.ts +++ b/ui/i18n/qml_base_lokalise_en.ts @@ -379,6 +379,67 @@ Your notifications will appear here + + ActivityCenterOptionsPanel + + Mark all as read + ActivityCenterOptionsPanel + Mark all as read + + + Hide read notifications + ActivityCenterOptionsPanel + Hide read notifications + + + Show read notifications + ActivityCenterOptionsPanel + Show read notifications + + + + ActivityCenterPanel + + Notifications + ActivityCenterPanel + Notifications + + + Enable RSS to receive Status News notifications + ActivityCenterPanel + Enable RSS to receive Status News notifications + + + Enable Status News notifications + ActivityCenterPanel + Enable Status News notifications + + + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + ActivityCenterPanel + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + + + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + ActivityCenterPanel + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + + + Enable RSS + ActivityCenterPanel + Enable RSS + + + You're all caught up + ActivityCenterPanel + You're all caught up + + + Your notifications will appear here + ActivityCenterPanel + Your notifications will appear here + + ActivityCenterPopupTopBarPanel diff --git a/ui/i18n/qml_cs.ts b/ui/i18n/qml_cs.ts index 8a3dacbfe4a..4bd81cb74eb 100644 --- a/ui/i18n/qml_cs.ts +++ b/ui/i18n/qml_cs.ts @@ -309,6 +309,56 @@ + + ActivityCenterOptionsPanel + + Mark all as read + + + + Hide read notifications + + + + Show read notifications + + + + + ActivityCenterPanel + + Notifications + + + + Enable RSS to receive Status News notifications + + + + Enable Status News notifications + + + + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + + + + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + + + + Enable RSS + + + + You're all caught up + + + + Your notifications will appear here + + + ActivityCenterPopupTopBarPanel diff --git a/ui/i18n/qml_es.ts b/ui/i18n/qml_es.ts index 1a30146e3cd..ddff7e5807a 100644 --- a/ui/i18n/qml_es.ts +++ b/ui/i18n/qml_es.ts @@ -309,6 +309,56 @@ Tus notificaciones aparecerán aquí + + ActivityCenterOptionsPanel + + Mark all as read + Marcar todo como leído + + + Hide read notifications + Ocultar notificaciones leídas + + + Show read notifications + Mostrar notificaciones leídas + + + + ActivityCenterPanel + + Notifications + Notificaciones + + + Enable RSS to receive Status News notifications + Habilitar RSS para recibir notificaciones de Status News + + + Enable Status News notifications + Habilitar notificaciones de Status News + + + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + RSS está deshabilitado actualmente a través de tu configuración de Privacidad y Seguridad. Habilita RSS para recibir notificaciones de Status News sobre próximas funciones y anuncios importantes. + + + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + Esta función está desactivada actualmente. Habilita las notificaciones de Status News para recibir notificaciones sobre próximas funciones y anuncios importantes + + + Enable RSS + Habilitar RSS + + + You're all caught up + Estás al día + + + Your notifications will appear here + Tus notificaciones aparecerán aquí + + ActivityCenterPopupTopBarPanel @@ -2480,7 +2530,7 @@ Para respaldar tu frase de recuperación, escríbela y guárdala de forma segura Choose a folder to store your backup files in. - + Elige una carpeta para almacenar tus archivos de backup. @@ -2636,15 +2686,15 @@ Do you wish to override the security check and continue? BrowserPrivacyWall Enable third-party services for browser features to work. - + Habilita servicios de terceros para que funcionen las funciones del navegador. Dapp browser - + Navegador Web/dApp Browse decentralized apps - + Navega apps descentralizadas diff --git a/ui/i18n/qml_ko.ts b/ui/i18n/qml_ko.ts index 54c4c29911f..2ce071891be 100644 --- a/ui/i18n/qml_ko.ts +++ b/ui/i18n/qml_ko.ts @@ -309,6 +309,56 @@ 알림이 여기에 표시됩니다 + + ActivityCenterOptionsPanel + + Mark all as read + + + + Hide read notifications + 읽은 알림 숨기기 + + + Show read notifications + 읽음 알림 표시 + + + + ActivityCenterPanel + + Notifications + 알림 + + + Enable RSS to receive Status News notifications + RSS를 활성화하여 Status 뉴스 알림 받기 + + + Enable Status News notifications + Status 뉴스 알림 활성화 + + + RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + RSS가 현재 개인정보 보호 및 보안 설정에서 비활성화되어 있습니다. RSS를 활성화하여 향후 기능 및 중요한 공지사항에 대한 Status 뉴스 알림을 받으세요. + + + This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + 이 기능은 현재 비활성화되어 있습니다. Status 뉴스 알림을 활성화하여 예정된 기능과 중요한 공지사항에 대한 알림을 받으세요 + + + Enable RSS + RSS 활성화 + + + You're all caught up + 모든 알림을 확인했습니다 + + + Your notifications will appear here + 알림이 여기에 표시됩니다 + + ActivityCenterPopupTopBarPanel From d8d43af526bd8bcc9370bf172ef92dd48e06be6a Mon Sep 17 00:00:00 2001 From: Noelia Date: Thu, 18 Dec 2025 16:07:42 +0100 Subject: [PATCH 09/10] feat(ActivityCenterPanel): Update Notifications Empty State to Match New Design - Updated the Notifications empty state to align with the latest design. -Added new illustrations for a more polished and consistent visual experience. - Improved placeholder handling to correctly reflect the news enabled/disabled logic and its new design. - Updated translations accordingly, english and spanish. Closes #18905 --- .../State=Empty Notifications, Theme=Dark.png | Bin 0 -> 7008 bytes ...State=Empty Notifications, Theme=Light.png | Bin 0 -> 6707 bytes .../State=News Disabled, Theme=Dark.png | Bin 0 -> 11358 bytes .../State=News Disabled, Theme=Light.png | Bin 0 -> 11670 bytes ui/StatusQ/src/assets/png/png.qrc | 4 + .../panels/ActivityCenterPanel.qml | 142 ++++++++++++------ ui/i18n/qml_base_en.ts | 18 ++- ui/i18n/qml_base_lokalise_en.ts | 33 ++-- ui/i18n/qml_cs.ts | 18 ++- ui/i18n/qml_es.ts | 32 ++-- ui/i18n/qml_ko.ts | 32 ++-- 11 files changed, 173 insertions(+), 106 deletions(-) create mode 100644 ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Dark.png create mode 100644 ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Light.png create mode 100644 ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Dark.png create mode 100644 ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Light.png diff --git a/ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Dark.png b/ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e8d53113427c01d8578eccb655af05f957eea6 GIT binary patch literal 7008 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 literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Light.png b/ui/StatusQ/src/assets/png/activity_center/State=Empty Notifications, Theme=Light.png new file mode 100644 index 0000000000000000000000000000000000000000..516680ba19184cf784a079c53192c8f8416400d6 GIT binary patch literal 6707 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 JPDHLkV1l|n{6+u( literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Dark.png b/ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..70efeada519078442f76b7e0b19ff6ece7471ceb GIT binary patch literal 11358 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 Xo$?H|OGN*R0~6>$jKMXU&!hhb;W(H; literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Light.png b/ui/StatusQ/src/assets/png/activity_center/State=News Disabled, Theme=Light.png new file mode 100644 index 0000000000000000000000000000000000000000..1f27d73e14bbdfb666c61a6cd161f1a7ca7f9df8 GIT binary patch literal 11670 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 literal 0 HcmV?d00001 diff --git a/ui/StatusQ/src/assets/png/png.qrc b/ui/StatusQ/src/assets/png/png.qrc index 8e1197a1418..8daa37d8f6c 100644 --- a/ui/StatusQ/src/assets/png/png.qrc +++ b/ui/StatusQ/src/assets/png/png.qrc @@ -925,5 +925,9 @@ status-logo-icon.png status-preparing.png unfurling-image.png + activity_center/State=Empty Notifications, Theme=Dark.png + activity_center/State=Empty Notifications, Theme=Light.png + activity_center/State=News Disabled, Theme=Dark.png + activity_center/State=News Disabled, Theme=Light.png diff --git a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml index 903784e7fd0..13c3752e406 100644 --- a/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml +++ b/ui/app/AppLayouts/ActivityCenter/panels/ActivityCenterPanel.qml @@ -214,16 +214,16 @@ Control { } } - // Placeholders in particular cases: - // This will be reworked on: https://github.com/status-im/status-app/issues/18905 // Placeholder for the status news when their settings are disabled // OR Placeholder for the status news when they are all seen or there are no notifications Loader { id: placeholderLoader + Layout.topMargin: 2 + Layout.bottomMargin: 2 Layout.fillWidth: true - Layout.margins: Theme.padding + Layout.fillHeight: true visible: active active: d.isNewsPlaceholderActive || d.emptyNotificationsList @@ -236,74 +236,116 @@ Control { } } - // This will be reworked on: https://github.com/status-im/status-app/issues/18905 // If !root.newsEnabledViaRSS it means the panel is for enabling RSS notification // Otherwise, it means it is for enabling status news notifications in settings Component { id: newsPlaceholderPanel - ColumnLayout { - id: newsPanelLayout + Item { + anchors.fill: parent - anchors.centerIn: parent - width: 320 - spacing: 12 + ColumnLayout { + id: newsPanelLayout - StatusBaseText { - Layout.alignment: Qt.AlignHCenter - Layout.maximumWidth: parent.width + anchors.centerIn: parent + width: parent.width - 2 * Theme.bigPadding + spacing: Theme.halfPadding - text: !root.newsEnabledViaRSS ? qsTr("Enable RSS to receive Status News notifications") : - qsTr("Enable Status News notifications") - font.weight: Font.Bold - lineHeight: 1.2 - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WordWrap - } + Image { + Layout.alignment: Qt.AlignHCenter - StatusBaseText { - Layout.alignment: Qt.AlignHCenter - Layout.maximumWidth: parent.width - - font.pixelSize: Theme.additionalTextSize - color: Theme.palette.baseColor1 - text: !root.newsEnabledViaRSS ? qsTr("RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements.") : - qsTr("This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements") - lineHeight: 1.2 - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WordWrap - } + source: (Theme.style === Theme.Light) ? Assets.png("activity_center/State=News Disabled, Theme=Light") : + Assets.png("activity_center/State=News Disabled, Theme=Dark") + fillMode: Image.PreserveAspectFit + mipmap: true + cache: false + } - StatusButton { - Layout.alignment: Qt.AlignHCenter + StatusBaseText { + Layout.fillWidth: true - text: !root.newsEnabledViaRSS ? qsTr("Enable RSS"): - qsTr("Enable Status News notifications") - font.pixelSize: Theme.additionalTextSize + horizontalAlignment: Text.AlignHCenter + text: !root.newsEnabledViaRSS ? qsTr("Status News RSS are off") : + qsTr("Status News notifications are off") + wrapMode: Text.WordWrap + font.pixelSize: Theme.additionalTextSize + font.weight: Font.Medium + } - onClicked: { - if (!root.newsEnabledViaRSS) { - root.enableNewsViaRSSRequested() - } else { - root.enableNewsRequested() + StatusBaseText { + Layout.fillWidth: true + + horizontalAlignment: Text.AlignHCenter + text: !root.newsEnabledViaRSS ? qsTr("Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings.") : + qsTr("Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings.") + + wrapMode: Text.WordWrap + font.pixelSize: Theme.additionalTextSize + font.weight: Font.Light + } + + StatusButton { + Layout.alignment: Qt.AlignHCenter + Layout.maximumWidth: parent.width + + text: !root.newsEnabledViaRSS ? qsTr("Enable RSS"): + qsTr("Enable Status News notifications") + font.pixelSize: Theme.additionalTextSize + + onClicked: { + if (!root.newsEnabledViaRSS) { + root.enableNewsViaRSSRequested() + } else { + root.enableNewsRequested() + } } } } } } - // This will be reworked on: https://github.com/status-im/status-app/issues/18905 + // This is used whenever the list of notifications is empty Component { id: emptyPlaceholderPanel - StatusBaseText { - // If the mode is unread only, it means the user has seen all notifications and is up to date - // If the mode is all, it means there are no notifications to show - text: root.readNotificationsStatus === ActivityCenterTypes.ActivityCenterReadType.Unread ? - qsTr("You're all caught up") : - qsTr("Your notifications will appear here") - horizontalAlignment: Text.AlignHCenter - color: Theme.palette.baseColor1 + Item { + anchors.fill: parent + + ColumnLayout { + anchors.centerIn: parent + width: parent.width - 2 * Theme.bigPadding + spacing: Theme.halfPadding + + Image { + Layout.alignment: Qt.AlignHCenter + + source: (Theme.style === Theme.Light) ? Assets.png("activity_center/State=Empty Notifications, Theme=Light") : + Assets.png("activity_center/State=Empty Notifications, Theme=Dark") + fillMode: Image.PreserveAspectFit + mipmap: true + cache: false + } + + StatusBaseText { + Layout.fillWidth: true + + horizontalAlignment: Text.AlignHCenter + text: qsTr("No notifications right now.") + wrapMode: Text.WordWrap + font.pixelSize: Theme.additionalTextSize + font.weight: Font.Medium + } + + StatusBaseText { + Layout.fillWidth: true + + horizontalAlignment: Text.AlignHCenter + text: qsTr("Check back later for updates.") + wrapMode: Text.WordWrap + font.pixelSize: Theme.additionalTextSize + font.weight: Font.Light + } + } } } } diff --git a/ui/i18n/qml_base_en.ts b/ui/i18n/qml_base_en.ts index 0e1c492ad98..b855b9bbc30 100644 --- a/ui/i18n/qml_base_en.ts +++ b/ui/i18n/qml_base_en.ts @@ -331,31 +331,35 @@ - Enable RSS to receive Status News notifications + Enable Status News notifications - Enable Status News notifications + Enable RSS - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + Status News RSS are off - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + Status News notifications are off - Enable RSS + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. - You're all caught up + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. - Your notifications will appear here + No notifications right now. + + + + Check back later for updates. diff --git a/ui/i18n/qml_base_lokalise_en.ts b/ui/i18n/qml_base_lokalise_en.ts index 37de6a50836..a8c9ee66455 100644 --- a/ui/i18n/qml_base_lokalise_en.ts +++ b/ui/i18n/qml_base_lokalise_en.ts @@ -405,39 +405,44 @@ Notifications - Enable RSS to receive Status News notifications + Enable Status News notifications ActivityCenterPanel - Enable RSS to receive Status News notifications + Enable Status News notifications - Enable Status News notifications + Enable RSS ActivityCenterPanel - Enable Status News notifications + Enable RSS - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + Status News RSS are off ActivityCenterPanel - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + Status News RSS are off - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + Status News notifications are off ActivityCenterPanel - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + Status News notifications are off - Enable RSS + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. ActivityCenterPanel - Enable RSS + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. - You're all caught up + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. ActivityCenterPanel - You're all caught up + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. - Your notifications will appear here + No notifications right now. ActivityCenterPanel - Your notifications will appear here + No notifications right now. + + + Check back later for updates. + ActivityCenterPanel + Check back later for updates. diff --git a/ui/i18n/qml_cs.ts b/ui/i18n/qml_cs.ts index 4bd81cb74eb..359a002aef9 100644 --- a/ui/i18n/qml_cs.ts +++ b/ui/i18n/qml_cs.ts @@ -331,31 +331,35 @@ - Enable RSS to receive Status News notifications + Enable Status News notifications - Enable Status News notifications + Enable RSS - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. + Status News RSS are off - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements + Status News notifications are off - Enable RSS + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. - You're all caught up + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. - Your notifications will appear here + No notifications right now. + + + + Check back later for updates. diff --git a/ui/i18n/qml_es.ts b/ui/i18n/qml_es.ts index ddff7e5807a..4a1c1547d0d 100644 --- a/ui/i18n/qml_es.ts +++ b/ui/i18n/qml_es.ts @@ -331,32 +331,36 @@ Notificaciones - Enable RSS to receive Status News notifications - Habilitar RSS para recibir notificaciones de Status News + Enable Status News notifications + Habilitar notificaciones de Status News - Enable Status News notifications - Habilitar notificaciones de Status News + Enable RSS + Habilitar RSS - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. - RSS está deshabilitado actualmente a través de tu configuración de Privacidad y Seguridad. Habilita RSS para recibir notificaciones de Status News sobre próximas funciones y anuncios importantes. + Status News RSS are off + Recibir Status News mediante RSS está deshabilitado - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements - Esta función está desactivada actualmente. Habilita las notificaciones de Status News para recibir notificaciones sobre próximas funciones y anuncios importantes + Status News notifications are off + Recibir Status News está deshabilitado - Enable RSS - Habilitar RSS + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. + Actívalas para recibir actualizaciones sobre nuevas funciones y anuncios. También puedes habilitarlas en cualquier momento en la configuración de Privacidad y Seguridad. - You're all caught up - Estás al día + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. + Actívalas para recibir actualizaciones sobre nuevas funciones y anuncios. También puedes activarlas en cualquier momento en la configuración de Notificaciones y Sonidos. - Your notifications will appear here - Tus notificaciones aparecerán aquí + No notifications right now. + No hay notificaciones ahora mismo. + + + Check back later for updates. + Vuelva más tarde para revisar actualizaciones. diff --git a/ui/i18n/qml_ko.ts b/ui/i18n/qml_ko.ts index 2ce071891be..58cdc1382f1 100644 --- a/ui/i18n/qml_ko.ts +++ b/ui/i18n/qml_ko.ts @@ -330,33 +330,37 @@ Notifications 알림 - - Enable RSS to receive Status News notifications - RSS를 활성화하여 Status 뉴스 알림 받기 - Enable Status News notifications Status 뉴스 알림 활성화 - RSS is currently disabled via your Privacy & Security settings. Enable RSS to receive Status News notifications about upcoming features and important announcements. - RSS가 현재 개인정보 보호 및 보안 설정에서 비활성화되어 있습니다. RSS를 활성화하여 향후 기능 및 중요한 공지사항에 대한 Status 뉴스 알림을 받으세요. + Enable RSS + RSS 활성화 - This feature is currently turned off. Enable Status News notifications to receive notifications about upcoming features and important announcements - 이 기능은 현재 비활성화되어 있습니다. Status 뉴스 알림을 활성화하여 예정된 기능과 중요한 공지사항에 대한 알림을 받으세요 + Status News RSS are off + - Enable RSS - RSS 활성화 + Status News notifications are off + - You're all caught up - 모든 알림을 확인했습니다 + Turn them on to get updates about new features and announcements. You can also enable this anytime in Privacy & Security settings. + - Your notifications will appear here - 알림이 여기에 표시됩니다 + Turn them on to get updates about new features and announcements. You can also enable this anytime in Notifications and Sound settings. + + + + No notifications right now. + + + + Check back later for updates. + From a8fb4e9dfa2028a144ab4897cd0013fa5f90e89c Mon Sep 17 00:00:00 2001 From: Noelia Date: Thu, 18 Dec 2025 16:19:03 +0100 Subject: [PATCH 10/10] refactor(ActivityCenter): Refactor NotificationType Enum Naming -Renamed `ActivityCenterTypes.ActivityCenterNotificationType` to `ActivityCenterTypes.NotificationType` to remove redundancy. - Improves readability and consistency across the Activity Center types. - Added notification type to the mocked model. --- .../ActivityNotificationNewDevicePage.qml | 6 +- ...ivityNotificationTransferOwnershipPage.qml | 12 +- storybook/src/Models/NotificationsModel.qml | 121 ++++++++---------- .../ActivityCenter/ActivityCenterLayout.qml | 46 +++---- .../helpers/ActivityCenterTypes.qml | 2 +- .../views/ActivityNotificationNewDevice.qml | 4 +- .../ActivityNotificationTransferOwnership.qml | 10 +- 7 files changed, 95 insertions(+), 106 deletions(-) diff --git a/storybook/pages/ActivityNotificationNewDevicePage.qml b/storybook/pages/ActivityNotificationNewDevicePage.qml index 2d33f57851f..cd46018e073 100644 --- a/storybook/pages/ActivityNotificationNewDevicePage.qml +++ b/storybook/pages/ActivityNotificationNewDevicePage.qml @@ -45,15 +45,15 @@ ActivityNotificationBaseLayout { RadioButton { text: "Received" checked: true - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationReceived + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.NewInstallationReceived } RadioButton { text: "Created" - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationCreated + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.NewInstallationCreated } } - Component.onCompleted: baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationReceived + Component.onCompleted: baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.NewInstallationReceived } } // category: Activity Center diff --git a/storybook/pages/ActivityNotificationTransferOwnershipPage.qml b/storybook/pages/ActivityNotificationTransferOwnershipPage.qml index 683eca74878..d7a6db79502 100644 --- a/storybook/pages/ActivityNotificationTransferOwnershipPage.qml +++ b/storybook/pages/ActivityNotificationTransferOwnershipPage.qml @@ -33,33 +33,33 @@ ActivityNotificationBaseLayout { RadioButton { text: "Pending" checked: true - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnerTokenReceived + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnerTokenReceived } RadioButton { text: "Declined" - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnershipDeclined + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnershipDeclined } RadioButton { text: "Succeded" - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnershipReceived + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnershipReceived } RadioButton { text: "Failed" - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnershipFailed + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnershipFailed } RadioButton { text: "No longer control node" - onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnershipLost + onCheckedChanged: if(checked) baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnershipLost } } } - Component.onCompleted: baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.ActivityCenterNotificationType.OwnerTokenReceived + Component.onCompleted: baseEditor.notificationBaseMock.notificationType = ActivityCenterTypes.NotificationType.OwnerTokenReceived } // category: Activity Center // status: good diff --git a/storybook/src/Models/NotificationsModel.qml b/storybook/src/Models/NotificationsModel.qml index 5a20e3f23da..f2e46b25bdb 100644 --- a/storybook/src/Models/NotificationsModel.qml +++ b/storybook/src/Models/NotificationsModel.qml @@ -2,6 +2,8 @@ import QtQuick import StatusQ.Core.Theme +import AppLayouts.ActivityCenter.helpers + // *** // This model provides examples of all notification types supported by the Status app, // showcasing the different visual states and UI variations for each notification card. @@ -53,6 +55,8 @@ ListModel { readonly property var data: [ { // MENTION IN 1:1 TYPE + notificationType: ActivityCenterTypes.NotificationType.Mention, + // Card states related unread: false, selected: false, @@ -77,6 +81,8 @@ ListModel { }, { // REPLY 1:1 TYPE + notificationType: ActivityCenterTypes.NotificationType.Reply, + // Card states related unread: true, selected: false, @@ -100,6 +106,8 @@ ListModel { }, { // CONTACT REQUEST TYPE + notificationType: ActivityCenterTypes.NotificationType.ContactRequest, + // Card states related unread: true, selected: false, @@ -126,6 +134,8 @@ ListModel { }, { // CONTACT REMOVED TYPE + notificationType: ActivityCenterTypes.NotificationType.ContactRemoved, + // Card states related unread: true, selected: false, @@ -149,6 +159,8 @@ ListModel { }, { // NEW PRIVATE GROUP CHAT TYPE + notificationType: ActivityCenterTypes.NotificationType.NewPrivateGroupChat, + // Card states related unread: true, selected: false, @@ -175,6 +187,8 @@ ListModel { }, { // MENTION IN GROUP CHAT TYPE + notificationType: ActivityCenterTypes.NotificationType.Mention, + // Card states related unread: false, selected: false, @@ -201,6 +215,8 @@ ListModel { }, { // REPLY IN GROUP CHAT TYPE + notificationType: ActivityCenterTypes.NotificationType.Reply, + // Card states related unread: true, selected: false, @@ -227,6 +243,8 @@ ListModel { }, { // MENTION IN COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.Mention, + // Card states related unread: true, selected: false, @@ -256,6 +274,8 @@ ListModel { }, { // REPLY IN COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.Reply, + // Card states related unread: false, selected: false, @@ -286,6 +306,8 @@ ListModel { }, { // INVITATION TO COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.CommunityInvitation, + // Card states related unread: true, selected: false, @@ -314,7 +336,9 @@ ListModel { timestamp: 1745799225000 }, { - // MEMBERSHIP REQUEST TO COMMUNITY TYPE + // MEMBERSHIP REQUEST TO COMMUNITY TYPE (Five states: `pending`, `accepted`, `declined, `acceptedPending`, `declinedPending`) + notificationType: ActivityCenterTypes.NotificationType.CommunityMembershipRequest, + // Card states related unread: true, selected: false, @@ -335,7 +359,9 @@ ListModel { timestamp: 1755799225000 }, { - // MEMBERSHIP REQUEST ACCEPTED TO COMMUNITY TYPE + // MEMBERSHIP REQUEST ACCEPTED TO COMMUNITY TYPE (Three states: `pending`, `accepted`, `declined`) + notificationType: ActivityCenterTypes.NotificationType.CommunityRequest, + // Card states related unread: false, selected: false, @@ -357,6 +383,8 @@ ListModel { }, { // KICKED FROM COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.CommunityKicked, + // Card states related unread: false, selected: false, @@ -377,7 +405,11 @@ ListModel { timestamp: 1766899225000 }, { - // COMMUNITY TOKEN RECEIVED TYPE + // COMMUNITY TOKEN RECEIVED TYPE: + // Assets and Collectibles are now treated the same way here. + // This notification will consistently trigger navigation to wallet transaction activity. + notificationType: ActivityCenterTypes.NotificationType.CommunityTokenReceived, + // Card states related unread: true, selected: false, @@ -399,6 +431,8 @@ ListModel { }, { // FIRST COMMUNITY TOKEN RECEIVED TYPE + notificationType: ActivityCenterTypes.NotificationType.FirstCommunityTokenReceived, + // Card states related unread: true, selected: false, @@ -420,6 +454,8 @@ ListModel { }, { // BANNED FROM COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.CommunityBanned, + // Card states related unread: true, selected: false, @@ -441,6 +477,8 @@ ListModel { }, { // UNBANNED FROM COMMUNITY TYPE + notificationType: ActivityCenterTypes.NotificationType.CommunityUnbanned, + // Card states related unread: true, selected: false, @@ -462,6 +500,8 @@ ListModel { }, { // OWNER TOKEN RECEIVED TYPE + notificationType: ActivityCenterTypes.NotificationType.OwnerTokenReceived, + // Card states related unread: true, selected: false, @@ -483,6 +523,8 @@ ListModel { }, { // OWNERSHIP RECEIVED TYPE + notificationType: ActivityCenterTypes.NotificationType.OwnershipReceived, + // Card states related unread: true, selected: false, @@ -504,6 +546,8 @@ ListModel { }, { // OWNERSHIP LOST TYPE + notificationType: ActivityCenterTypes.NotificationType.OwnershipLost, + // Card states related unread: false, selected: false, @@ -525,6 +569,8 @@ ListModel { }, { // OWNERSHIP TRANSFER FAILED TYPE + notificationType: ActivityCenterTypes.NotificationType.OwnershipFailed, + // Card states related unread: false, selected: false, @@ -546,6 +592,8 @@ ListModel { }, { // OWNERSHIP TRANSFER DECLINED TYPE + notificationType: ActivityCenterTypes.NotificationType.OwnershipDeclined, + // Card states related unread: true, selected: false, @@ -567,6 +615,8 @@ ListModel { }, { // SYSTEM - NEW INSTALLATION TYPE + notificationType: ActivityCenterTypes.NotificationType.NewInstallationReceived, + // Card states related unread: true, selected: false, @@ -585,71 +635,10 @@ ListModel { // Timestamp related timestamp: 1759995225000 }, - { - // SYSTEM - FETCHING BACKUP TYPE - // Card states related - unread: false, - selected: false, - - // Avatar related - avatarSource: Assets.png("status-logo-icon"), - badgeIconName: "action-sync", - isCircularAvatar: false, - - - // Header row related - title: "Status", - - // Content block related - content: "Backup syncing fetching", - - // Timestamp related - timestamp: 1759895225000 - }, - { - // SYSTEM - BACKUP SYNCING PARTIAL FAIL TYPE - // Card states related - unread: false, - selected: false, - - // Avatar related - avatarSource: Assets.png("status-logo-icon"), - badgeIconName: "action-sync-fail", - isCircularAvatar: false, - - - // Header row related - title: "Status", - - // Content block related - content: "Backup sync partially failed", - - // Timestamp related - timestamp: 1759795225000 - }, - { - // SYSTEM - BACKUP SYNCING FAILURE TYPE - // Card states related - unread: false, - selected: false, - - // Avatar related - avatarSource: Assets.png("status-logo-icon"), - badgeIconName: "action-sync-fail", - isCircularAvatar: false, - - - // Header row related - title: "Status", - - // Content block related - content: "Backup sync failed", - - // Timestamp related - timestamp: 1759887225000 - }, { // SYSTEM - NEWS ARTICLE TYPE + notificationType: ActivityCenterTypes.NotificationType.ActivityCenterNotificationTypeNews, + // Card states related unread: true, selected: false, diff --git a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml index ccfec6a4b77..4d7507b6a8f 100644 --- a/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml +++ b/ui/app/AppLayouts/ActivityCenter/ActivityCenterLayout.qml @@ -154,45 +154,45 @@ StatusSectionLayout { sourceComponent: { switch (model.notificationType) { - case ActivityCenterTypes.ActivityCenterNotificationType.Mention: + case ActivityCenterTypes.NotificationType.Mention: return mentionNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.Reply: + case ActivityCenterTypes.NotificationType.Reply: return replyNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.ContactRequest: + case ActivityCenterTypes.NotificationType.ContactRequest: return contactRequestNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityInvitation: + case ActivityCenterTypes.NotificationType.CommunityInvitation: return communityInvitationNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityMembershipRequest: + case ActivityCenterTypes.NotificationType.CommunityMembershipRequest: return membershipRequestNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityRequest: + case ActivityCenterTypes.NotificationType.CommunityRequest: return communityRequestNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityKicked: + case ActivityCenterTypes.NotificationType.CommunityKicked: return communityKickedNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.ContactRemoved: + case ActivityCenterTypes.NotificationType.ContactRemoved: return contactRemovedComponent - case ActivityCenterTypes.ActivityCenterNotificationType.NewKeypairAddedToPairedDevice: + case ActivityCenterTypes.NotificationType.NewKeypairAddedToPairedDevice: return newKeypairFromPairedDeviceComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityTokenReceived: - case ActivityCenterTypes.ActivityCenterNotificationType.FirstCommunityTokenReceived: + case ActivityCenterTypes.NotificationType.CommunityTokenReceived: + case ActivityCenterTypes.NotificationType.FirstCommunityTokenReceived: return communityTokenReceivedComponent - case ActivityCenterTypes.ActivityCenterNotificationType.OwnerTokenReceived: - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipReceived: - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipLost: - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipFailed: - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipDeclined: + case ActivityCenterTypes.NotificationType.OwnerTokenReceived: + case ActivityCenterTypes.NotificationType.OwnershipReceived: + case ActivityCenterTypes.NotificationType.OwnershipLost: + case ActivityCenterTypes.NotificationType.OwnershipFailed: + case ActivityCenterTypes.NotificationType.OwnershipDeclined: return ownerTokenReceivedNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.ShareAccounts: + case ActivityCenterTypes.NotificationType.ShareAccounts: return shareAccountsNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityBanned: + case ActivityCenterTypes.NotificationType.CommunityBanned: return communityBannedNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.CommunityUnbanned: + case ActivityCenterTypes.NotificationType.CommunityUnbanned: return communityUnbannedNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.NewPrivateGroupChat: + case ActivityCenterTypes.NotificationType.NewPrivateGroupChat: return groupChatInvitationNotificationComponent - case ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationReceived: - case ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationCreated: + case ActivityCenterTypes.NotificationType.NewInstallationReceived: + case ActivityCenterTypes.NotificationType.NewInstallationCreated: return newDeviceDetectedComponent - case ActivityCenterTypes.ActivityCenterNotificationType.ActivityCenterNotificationTypeNews: + case ActivityCenterTypes.NotificationType.ActivityCenterNotificationTypeNews: return newsMessageComponent default: return null diff --git a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml index 69ae1c74c20..2244be9c68b 100644 --- a/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml +++ b/ui/app/AppLayouts/ActivityCenter/helpers/ActivityCenterTypes.qml @@ -18,7 +18,7 @@ QtObject { Dismissed = 3 } - enum ActivityCenterNotificationType { + enum NotificationType { NoType = 0, NewOneToOne = 1, NewPrivateGroupChat = 2, diff --git a/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationNewDevice.qml b/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationNewDevice.qml index 6b0866b7083..e84e94dd6ba 100644 --- a/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationNewDevice.qml +++ b/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationNewDevice.qml @@ -25,10 +25,10 @@ ActivityNotificationBase { function setType(notification) { if (notification) { switch (notification.notificationType) { - case ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationReceived: + case ActivityCenterTypes.NotificationType.NewInstallationReceived: return ActivityNotificationNewDevice.InstallationType.Received - case ActivityCenterTypes.ActivityCenterNotificationType.NewInstallationCreated: + case ActivityCenterTypes.NotificationType.NewInstallationCreated: return ActivityNotificationNewDevice.InstallationType.Created } } diff --git a/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationTransferOwnership.qml b/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationTransferOwnership.qml index 75898fff482..65699000b1c 100644 --- a/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationTransferOwnership.qml +++ b/ui/app/AppLayouts/ActivityCenter/views/ActivityNotificationTransferOwnership.qml @@ -31,19 +31,19 @@ ActivityNotificationBase { if(notification) switch(notification.notificationType){ - case ActivityCenterTypes.ActivityCenterNotificationType.OwnerTokenReceived: + case ActivityCenterTypes.NotificationType.OwnerTokenReceived: return ActivityNotificationTransferOwnership.OwnershipState.Pending - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipDeclined: + case ActivityCenterTypes.NotificationType.OwnershipDeclined: return ActivityNotificationTransferOwnership.OwnershipState.Declined - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipReceived: + case ActivityCenterTypes.NotificationType.OwnershipReceived: return ActivityNotificationTransferOwnership.OwnershipState.Succeeded - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipFailed: + case ActivityCenterTypes.NotificationType.OwnershipFailed: return ActivityNotificationTransferOwnership.OwnershipState.Failed - case ActivityCenterTypes.ActivityCenterNotificationType.OwnershipLost: + case ActivityCenterTypes.NotificationType.OwnershipLost: return ActivityNotificationTransferOwnership.OwnershipState.NoLongerControlNode }