Repository: status-im/status-desktop
Pull request #17745: Implement News Feed popup
Author: login: jrainville
Created: 2025-04-04T19:44:48Z | Merged: 2025-04-16T21:04:07Z

### What does the PR do

Fixes https://github.com/status-im/status-desktop/issues/17691

Based on top of https://github.com/status-im/status-desktop/pull/17719
Status-go PR: https://github.com/status-im/status-go/pull/6487

The first commit is the component alone and storybook elements
The second one is the hooking to the rest + metrics

### Affected areas

AC

### Architecture compliance

- [x] I am familiar with the application architecture and agreed good practices.
My PR is consistent with this document: [Status Desktop Architecture Guide](https://github.com/status-im/status-desktop/blob/master/CONTRIBUTING.md)

### Screenshot of functionality

Again, it doesn't follow the Design exactly, because I use the current component and I also used Hacker news so there is no image and the text is not truncated yet (it will be done in another issue/PR)

[news-popup.webm](https://github.com/user-attachments/assets/161c5879-2a04-4398-897f-1bfc59ebe162)

Storybook: 
![image](https://github.com/user-attachments/assets/bc2fbf37-a85a-4fa5-bc06-2c0e78502fb3)


### Impact on end user
Let's users see the details of a News message and go to the link

### How to test

- Enable the status-go feature flag and run the app
- Go to the AC

### Risk 

Tick **one**:
- [x] Low risk: 2 devs MUST perform testing as specified above and attach their results as comments to this PR **before** merging.
- [ ] High risk: QA team MUST perform additional testing in the specified affected areas **before** merging.

It's behind a feature flag and also it's just a new AC popup



Diff:
diff --git a/storybook/pages/ActivityNotificationNewsMessagePage.qml b/storybook/pages/ActivityNotificationNewsMessagePage.qml
index a7910052512..65a0b32e792 100644
--- a/storybook/pages/ActivityNotificationNewsMessagePage.qml
+++ b/storybook/pages/ActivityNotificationNewsMessagePage.qml
@@ -19,8 +19,8 @@ SplitView {
         property string id: "1"
         property string title: "Swaps around the corner!"
         property string description: "Status Desktop’s next release brings the app up-to-speed with Status Mobile. That means: SWAPS!"
-        property int timestamp: Date.now()
-        property int previousTimestamp: 0
+        property double timestamp: Date.now()
+        property double previousTimestamp: 0
         property bool read: false
         property bool dismissed: false
         property bool accepted: false
@@ -39,7 +39,7 @@ SplitView {
 
             notification: notificationMock
 
-            onLearnMoreClicked: logs.logEvent("ActivityNotificationNewsMessages::onLearnMoreClicked")
+            onReadMoreClicked: logs.logEvent("ActivityNotificationNewsMessage::onReadMoreClicked")
         }
 
     }
diff --git a/storybook/pages/NewsMessagePopupPage.qml b/storybook/pages/NewsMessagePopupPage.qml
new file mode 100644
index 00000000000..d168987b580
--- /dev/null
+++ b/storybook/pages/NewsMessagePopupPage.qml
@@ -0,0 +1,75 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+
+import Storybook 1.0
+
+import StatusQ.Controls 0.1
+
+import shared.popups 1.0
+
+SplitView {
+    Logs { id: logs }
+    orientation: Qt.Vertical
+    Item {
+        SplitView.fillWidth: true
+        SplitView.fillHeight: true
+
+        Button {
+            anchors.centerIn: parent
+            text: "Reopen"
+            onClicked: popup.open()
+        }
+
+
+        QtObject {
+            id: notificationMock
+
+            property string id: "1"
+            property string title: "Swaps around the corner!"
+            property string description: "Status Desktop's next release brings the app up-to-speed with Status Mobile. That means: SWAPS!"
+            property string content: "Status Desktop's next release brings the app up-to-speed with Status Mobile. That means: SWAPS! Now you can trade Ethereum, Arbitrum and Optimism tokens directly in-app. Status leverages Paraswap so you always benefit from the best prices and fastest settlements!"
+            property string link: "https://status.app/"
+            property string linkLabel: linkLabelInput.text
+            property string imageUrl: hasImage.checked ? "https://picsum.photos/438/300" : ""
+            property double timestamp: Date.now()
+            property double previousTimestamp: 0
+            property bool read: false
+            property bool dismissed: false
+            property bool accepted: false
+        }
+
+        NewsMessagePopup {
+            id: popup
+            visible: true
+            notification: notificationMock
+            onLinkClicked: logs.logEvent("NewsMessagesPopup::onLinkClicked")
+        }
+    }
+   
+    LogsAndControlsPanel {
+        SplitView.minimumHeight: 100
+        SplitView.preferredHeight: 200
+
+        logsView.logText: logs.logText
+
+        RowLayout {
+            spacing: 4
+
+            CheckBox {
+                id: hasImage
+                text: "Has Image"
+                checked: true
+            }
+
+            StatusInput {
+                id: linkLabelInput
+                label: "linkLabel"
+                text: "Read our blog post"
+            }
+        }
+    }
+}
+
+// category: Popups
+// status: good
diff --git a/ui/app/mainui/Popups.qml b/ui/app/mainui/Popups.qml
index 0f56c50f618..0a627cb4b37 100644
--- a/ui/app/mainui/Popups.qml
+++ b/ui/app/mainui/Popups.qml
@@ -115,7 +115,7 @@ QtObject {
 
     property var currentPopup
     function openPopup(popupComponent, params = {}, cb = null) {
-        if (activePopupComponents.includes(popupComponent)) {
+        if (root.activePopupComponents.includes(popupComponent)) {
             return
         }
 
@@ -124,12 +124,12 @@ QtObject {
         if (cb)
             cb(root.currentPopup)
 
-        activePopupComponents.push(popupComponent)
+        root.activePopupComponents.push(popupComponent)
 
         root.currentPopup.closed.connect(() => {
-            const removeIndex = activePopupComponents.indexOf(popupComponent)
+            const removeIndex = root.activePopupComponents.indexOf(popupComponent)
             if (removeIndex !== -1) {
-                activePopupComponents.splice(removeIndex, 1)
+                root.activePopupComponents.splice(removeIndex, 1)
             }
         })
     }
diff --git a/ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml b/ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml
index 8221d86d1c3..ad94120c6f6 100644
--- a/ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml
+++ b/ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml
@@ -9,6 +9,7 @@ import StatusQ.Core 0.1
 import StatusQ.Core.Backpressure 0.1
 import StatusQ.Core.Theme 0.1
 import StatusQ.Popups.Dialog 0.1
+import StatusQ.Core.Utils 0.1 as StatusQUtils
 
 import shared 1.0
 import shared.popups 1.0
@@ -369,6 +370,14 @@ Popup {
             notification: parent.notification
             store: root.store
             activityCenterStore: root.activityCenterStore
+            onReadMoreClicked: {
+                root.close()
+                Global.openPopup(newsMessagePopup, {
+                    notification: parent.notification
+                })
+                Global.addCentralizedMetricIfEnabled("news-info-opened", {"news-link": parent.notification.link})
+
+            }
             onCloseActivityCenter: root.close()
         }
     }
@@ -516,4 +525,12 @@ Popup {
             footer: null
         }
     }
+
+    Component {
+        id: newsMessagePopup
+
+        NewsMessagePopup {
+            onLinkClicked: Global.openLinkWithConfirmation(link, StatusQUtils.StringUtils.extractDomainFromLink(link));
+        }
+    }
 }
diff --git a/ui/app/mainui/activitycenter/views/ActivityNotificationNewsMessage.qml b/ui/app/mainui/activitycenter/views/ActivityNotificationNewsMessage.qml
index 2a88ed7b676..a148968848d 100644
--- a/ui/app/mainui/activitycenter/views/ActivityNotificationNewsMessage.qml
+++ b/ui/app/mainui/activitycenter/views/ActivityNotificationNewsMessage.qml
@@ -11,7 +11,7 @@ import shared.panels 1.0
 ActivityNotificationBase {
     id: root
 
-    signal learnMoreClicked
+    signal readMoreClicked
 
     bodyComponent: RowLayout {
         spacing: 8
@@ -49,9 +49,9 @@ ActivityNotificationBase {
 
     ctaComponent: StatusFlatButton {
         size: StatusBaseButton.Size.Small
-        text: qsTr("Learn more")
+        text: qsTr("Read more")
         onClicked: {
-            root.learnMoreClicked()
+            root.readMoreClicked()
         }
     }
 }
diff --git a/ui/imports/shared/popups/NewsMessagePopup.qml b/ui/imports/shared/popups/NewsMessagePopup.qml
new file mode 100644
index 00000000000..ffcc14cdcf9
--- /dev/null
+++ b/ui/imports/shared/popups/NewsMessagePopup.qml
@@ -0,0 +1,77 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+import QtQml.Models 2.15
+
+import StatusQ.Core 0.1
+import StatusQ.Popups.Dialog 0.1
+import StatusQ.Controls 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Components 0.1
+
+import shared 1.0
+import utils 1.0
+
+StatusDialog {
+    id: root
+
+    required property var notification
+    signal linkClicked(string link)
+
+    width: 480
+    padding: Theme.bigPadding
+
+    header: StatusDialogHeader {
+        StatusDateGroupLabel {
+            id: dateGroupLabel
+            messageTimestamp: notification ? notification.timestamp : 0
+            // Hidden label to get the string
+            visible: false
+        }
+
+        headline.title: notification.title
+        headline.subtitle: dateGroupLabel.text
+        actions.closeButton.onClicked: root.close()
+        leftComponent: StatusSmartIdenticon {
+            asset.name: Theme.png("status-logo-icon")
+            asset.isImage: true
+        }
+    }
+
+    ColumnLayout {
+        width: parent.width
+
+        Loader {
+            active: !!notification.imageUrl
+
+            Layout.bottomMargin: active ? Theme.bigPadding : 0
+            Layout.fillWidth: true
+            Layout.preferredHeight: active ? 300 : 0
+
+            sourceComponent: StatusRoundedImage {
+
+                image.source: notification.imageUrl
+                color: "transparent"
+                border.color: root.backgroundColor
+                border.width: 1
+                radius: 10
+            }
+        }
+
+        StatusBaseText {
+            text: notification.content || notification.description
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+            wrapMode: Text.WordWrap
+        }
+    }
+    footer: StatusDialogFooter {
+        rightButtons: ObjectModel {
+            StatusButton {
+                text: !!notification.linkLabel ? notification.linkLabel : qsTr("Visit the website")
+                icon.name: "external"
+                onClicked: root.linkClicked(root.notification.link)
+            }
+        }
+    }
+}
diff --git a/ui/imports/shared/popups/qmldir b/ui/imports/shared/popups/qmldir
index cac767a5d7a..f93d54b8f30 100644
--- a/ui/imports/shared/popups/qmldir
+++ b/ui/imports/shared/popups/qmldir
@@ -20,6 +20,7 @@ MarkAsIDVerifiedDialog 1.0 MarkAsIDVerifiedDialog.qml
 MarkAsUntrustedPopup 1.0 MarkAsUntrustedPopup.qml
 MetricsEnablePopup 1.0 MetricsEnablePopup.qml
 ModalPopup 1.0 ModalPopup.qml
+NewsMessagePopup 1.0 NewsMessagePopup.qml
 NicknamePopup 1.0 NicknamePopup.qml
 NoPermissionsToJoinPopup 1.0 NoPermissionsToJoinPopup.qml
 OutgoingContactVerificationRequestPopup 1.0 OutgoingContactVerificationRequestPopup.qml


Reviews:
user: login: caybro
body: Looks good in general
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-07T08:55:19Z
user: login: jrainville
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-07T15:22:18Z
user: login: caybro
body: LGTM!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-09T09:42:24Z
user: login: micieslak
body: lgtm, some minor comments only
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-15T16:59:11Z
user: login: jrainville
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:27:35Z

Review comments:
diff_hunk: @@ -23,6 +23,7 @@ StatusRoundedComponent {
     isLoading: image.isLoading
     isError: image.isError
     border.width: 0
+    radius: 10
path: ui/StatusQ/src/StatusQ/Components/StatusRoundedImage.qml
user: login: caybro
body: Hmm, this change will affect all other components/views. Better set it at the place where you actually need it
created_at: 2025-04-07T08:53:12Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,78 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+import QtQml.Models 2.15
+
+import StatusQ.Core 0.1
+import StatusQ.Popups.Dialog 0.1
+import StatusQ.Controls 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Components 0.1
+import StatusQ.Core.Utils 0.1 as CoreUtils
+
+import shared 1.0
+import utils 1.0
+
+StatusDialog {
+    id: root
+
+    required property var notification
+    signal linkClicked(string link)
+
+    anchors.centerIn: parent
+    width: 480
+    padding: Theme.bigPadding
+
+    header: StatusDialogHeader {
+        StatusDateGroupLabel {
+            id: dateGroupLabel
+            messageTimestamp: notification ? notification.timestamp : 0
+            // Hidden label to get the string
+            visible: false
+        }
+
+        headline.title: notification.title
+        headline.subtitle: dateGroupLabel.text
+        actions.closeButton.onClicked: root.close()
+        leftComponent: StatusSmartIdenticon {
+            asset.name: Theme.png("status-logo-icon")
+            asset.isImage: true
+        }
+    }
+
+    ColumnLayout {
+        width: parent.width
+
+        Loader {
+            active: !!notification.imageUrl
+
+            Layout.bottomMargin: active ? Theme.bigPadding : 0
+            Layout.fillWidth: active ? true : false
path: ui/imports/shared/popups/NewsMessagePopup.qml
user: login: caybro
body: ? :laughing: 
created_at: 2025-04-07T08:54:57Z
author_association: MEMBER
diff_hunk: @@ -23,6 +23,7 @@ StatusRoundedComponent {
     isLoading: image.isLoading
     isError: image.isError
     border.width: 0
+    radius: 10
path: ui/StatusQ/src/StatusQ/Components/StatusRoundedImage.qml
user: login: jrainville
body: Oops, my bad, I got tunnel vision. I'll move it higher in the popup
created_at: 2025-04-07T15:22:18Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,79 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+import QtQml.Models 2.15
+
+import StatusQ.Core 0.1
+import StatusQ.Popups.Dialog 0.1
+import StatusQ.Controls 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Components 0.1
+import StatusQ.Core.Utils 0.1 as CoreUtils
+
+import shared 1.0
+import utils 1.0
+
+StatusDialog {
+    id: root
+
+    required property var notification
+    signal linkClicked(string link)
+
+    anchors.centerIn: parent
path: ui/imports/shared/popups/NewsMessagePopup.qml
user: login: caybro
body: Usually not necessary
created_at: 2025-04-09T09:41:22Z
author_association: MEMBER
diff_hunk: @@ -369,6 +370,14 @@ Popup {
             notification: parent.notification
             store: root.store
             activityCenterStore: root.activityCenterStore
+            onReadMoreClicked: {
+                root.close()
+                Global.openPopup(newsMessagePopup, {
path: ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml
user: login: micieslak
body: I would recommend to avoid `Global.openPopup` and keep it local, e.g. by using `Component.createComponent` combined with `destroyOnClose` or by delcaring `NewsMessagePopup` without `Component` wrapper and call just `open`.
created_at: 2025-04-15T16:48:06Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,78 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+import QtQml.Models 2.15
+
+import StatusQ.Core 0.1
+import StatusQ.Popups.Dialog 0.1
+import StatusQ.Controls 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Components 0.1
+import StatusQ.Core.Utils 0.1 as CoreUtils
path: ui/imports/shared/popups/NewsMessagePopup.qml
user: login: micieslak
body: not used?
created_at: 2025-04-15T16:58:25Z
author_association: MEMBER
diff_hunk: @@ -369,6 +370,14 @@ Popup {
             notification: parent.notification
             store: root.store
             activityCenterStore: root.activityCenterStore
+            onReadMoreClicked: {
+                root.close()
+                Global.openPopup(newsMessagePopup, {
path: ui/app/mainui/activitycenter/popups/ActivityCenterPopup.qml
user: login: jrainville
body: I move the popup to Popups.qml in the next PR since that popup is used by multiple components, so that problem gets fixed by itself 
created_at: 2025-04-16T18:27:35Z
author_association: MEMBER

PR comments:
user: login: status-im-auto
created_at: 2025-04-04T19:53:40Z
body: 
### Jenkins Builds
<details>
<summary>Click to see older builds (21)</summary>

| :grey_question: | Commit | :hash: | Finished (UTC) | Duration | Platform | Result |
|-|-|-|-|-|-|-|
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/1/) | 2025-04-04 19:53:40 | ~8 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250404-194508-3e4c60-pr17745-aarch64.dmg) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/1/) | 2025-04-04 19:53:51 | ~8 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/1//consoleText) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/1/) | 2025-04-04 19:58:13 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/1//consoleText) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17745/1/) | 2025-04-04 20:00:16 | ~15 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250404-194508-3e4c60-pr17745-x86_64.dmg) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17745/1/) | 2025-04-04 20:07:43 | ~22 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250404-194502-3e4c60-pr17745-x86_64.nix.tar.gz) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17745/1/) | 2025-04-04 20:07:43 | ~22 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250404-194503-3e4c60-pr17745-x86_64.tar.gz) |
| :heavy_check_mark: | 3e4c6042 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17745/1/) | 2025-04-04 20:09:37 | ~24 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250404-194509-3e4c60-pr17745-x86_64.exe) |
| | | | | | | |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/2/) | 2025-04-08 17:48:16 | ~6 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-174120-fd906e-pr17745-aarch64.dmg) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/2/) | 2025-04-08 17:50:05 | ~8 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/2//consoleText) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/2/) | 2025-04-08 17:54:29 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/2//consoleText) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17745/2/) | 2025-04-08 17:55:39 | ~14 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-174120-fd906e-pr17745-x86_64.dmg) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17745/2/) | 2025-04-08 18:01:43 | ~20 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-174122-fd906e-pr17745-x86_64.exe) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17745/2/) | 2025-04-08 18:02:19 | ~21 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-174114-fd906e-pr17745-x86_64.nix.tar.gz) |
| :heavy_check_mark: | fd906e4c | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17745/2/) | 2025-04-08 18:04:15 | ~22 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-174115-fd906e-pr17745-x86_64.tar.gz) |
| | | | | | | |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/3/) | 2025-04-08 20:12:14 | ~7 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-200426-fe2f09-pr17745-aarch64.dmg) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/3/) | 2025-04-08 20:14:47 | ~10 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/3//consoleText) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/3/) | 2025-04-08 20:18:39 | ~14 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/3//consoleText) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17745/3/) | 2025-04-08 20:18:53 | ~14 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-200427-fe2f09-pr17745-x86_64.dmg) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17745/3/) | 2025-04-08 20:23:45 | ~19 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-200430-fe2f09-pr17745-x86_64.exe) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17745/3/) | 2025-04-08 20:24:25 | ~20 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-200422-fe2f09-pr17745-x86_64.nix.tar.gz) |
| :heavy_check_mark: | fe2f099c | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17745/3/) | 2025-04-08 20:26:40 | ~22 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250408-200423-fe2f09-pr17745-x86_64.tar.gz) |
</details>

| :grey_question: | Commit | :hash: | Finished (UTC) | Duration | Platform | Result |
|-|-|-|-|-|-|-|
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/5/) | 2025-04-14 20:11:34 | ~7 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250414-200411-d157a5-pr17745-aarch64.dmg) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/5/) | 2025-04-14 20:13:19 | ~9 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/5//consoleText) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/5/) | 2025-04-14 20:17:24 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/5//consoleText) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17745/5/) | 2025-04-14 20:24:43 | ~20 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250414-200412-d157a5-pr17745-x86_64.dmg) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17745/5/) | 2025-04-14 20:25:18 | ~21 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250414-200414-d157a5-pr17745-x86_64.exe) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17745/5/) | 2025-04-14 20:29:41 | ~25 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250414-200407-d157a5-pr17745-x86_64.nix.tar.gz) |
| :heavy_check_mark: | d157a524 | [#5](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17745/5/) | 2025-04-14 20:30:18 | ~26 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250414-200408-d157a5-pr17745-x86_64.tar.gz) |
| | | | | | | |
| :x: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/6/) | 2025-04-16 18:30:37 | ~2 min | `macos/aarch64` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/6/consoleText) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/6/) | 2025-04-16 18:37:28 | ~9 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17745/6//consoleText) |
| :x: | 5adee4d5 | [#7](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/7/) | 2025-04-16 18:38:54 | ~1 min | `macos/aarch64` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17745/7/consoleText) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/6/) | 2025-04-16 18:42:08 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17745/6//consoleText) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17745/6/) | 2025-04-16 18:44:34 | ~16 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-182811-5adee4-pr17745-x86_64.dmg) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17745/6/) | 2025-04-16 18:47:24 | ~19 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-182811-5adee4-pr17745-x86_64.exe) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17745/6/) | 2025-04-16 18:49:15 | ~21 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-182804-5adee4-pr17745-x86_64.nix.tar.gz) |
| :heavy_check_mark: | 5adee4d5 | [#6](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17745/6/) | 2025-04-16 18:49:24 | ~21 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-182805-5adee4-pr17745-x86_64.tar.gz) |

author_association: MEMBER
user: login: jrainville
created_at: 2025-04-16T21:04:01Z
body: Force merging as the failure doesn't make sense with regards to my changes
author_association: MEMBER