Skip to content

Conversation

@jrainville
Copy link
Member

What does the PR do

Part of #18935

Contains multiple commits:

Affected areas

  • MessagesReactionRow
  • MessageContextMenu
  • AppMain
  • MessageView

Architecture compliance

Screencapture of the functionality

emoji-reaction-new-design-part-1.webm

Impact on end user

Nicer experience when using the emoji reactions in the message context menu + fixes the emoji settings

How to test

  • Use emojis in a message
  • Right click a message and see that the latest emojis are there

Risk

Low

visible: index < d.recentEmojisModel.count
emojiId: visible ? emojiReaction.emoji.unicode : ""
// TODO not implemented yet. We'll need to pass this info
// reactedByUser: model.didIReactWithThisEmoji
Copy link
Member Author

Choose a reason for hiding this comment

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

Will be implemented in a follow up PR

}

StatusMenuSeparator {
// FIXME there is a padding on each side
Copy link
Member Author

Choose a reason for hiding this comment

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

This exists in master and 2.35 too. It's not the end of the world, but it doesn't match the design and I don't know how to fix

@status-im-auto
Copy link
Member

status-im-auto commented Oct 24, 2025

Jenkins Builds

Click to see older builds (79)
Commit #️⃣ Finished (UTC) Duration Platform Result
177463b #1 2025-10-24 20:02:22 ~7 min macos/aarch64 📄log
177463b #1 2025-10-24 20:02:22 ~7 min macos/aarch64-nwaku 📄log
✔️ 177463b #1 2025-10-24 20:03:08 ~7 min tests/nim 📄log
✔️ 177463b #1 2025-10-24 20:06:35 ~11 min ios/aarch64 📦pkg
✔️ 177463b #1 2025-10-24 20:09:41 ~14 min tests/ui 📄log
✔️ 177463b #1 2025-10-24 20:13:26 ~18 min linux/x86_64 📦tgz
✔️ 177463b #1 2025-10-24 20:19:23 ~24 min linux/x86_64-nwaku 📦tgz
✔️ 177463b #1 2025-10-24 20:22:05 ~26 min windows/x86_64 💿exe
✔️ 177463b PR19140 2025-10-24 20:32:07 ~9 min tests/e2e-windows 📊rpt
✖️ 177463b pr19140 2025-10-24 20:32:20 ~18 min tests/e2e 📊rpt
✔️ 0733fbdf #1 2025-10-24 20:06:03 ~10 min android/arm64 🤖apk 📲
✔️ ca20d6a7 #2 2025-10-25 17:25:26 ~10 min android/arm64 🤖apk 📲
✔️ c60f32f1 #3 2025-10-26 17:26:43 ~11 min android/arm64 🤖apk 📲
✔️ 1a025a72 #4 2025-10-27 17:26:38 ~11 min android/arm64 🤖apk 📲
✔️ 5d2f2ca #2 2025-10-27 18:10:15 ~8 min tests/nim 📄log
✔️ 5d2f2ca #5 2025-10-27 18:12:53 ~10 min android/arm64 🤖apk 📲
✔️ 5d2f2ca #2 2025-10-27 18:13:01 ~11 min ios/aarch64 📦pkg
✔️ 5d2f2ca #2 2025-10-27 18:15:52 ~13 min tests/ui 📄log
✔️ 5d2f2ca #2 2025-10-27 18:18:04 ~16 min linux/x86_64 📦tgz
✔️ 5d2f2ca #2 2025-10-27 18:19:34 ~17 min macos/aarch64-nwaku 🍎dmg
✔️ 5d2f2ca #2 2025-10-27 18:20:19 ~18 min macos/aarch64 🍎dmg
✔️ 5d2f2ca #2 2025-10-27 18:25:32 ~23 min linux/x86_64-nwaku 📦tgz
✖️ 5d2f2ca pr19140 2025-10-27 18:38:09 ~19 min tests/e2e 📊rpt
✔️ 6caaf7cd #6 2025-10-28 17:26:03 ~10 min android/arm64 🤖apk 📲
✔️ c27b5b11 #7 2025-10-29 17:25:54 ~10 min android/arm64 🤖apk 📲
✔️ 0236b03 #3 2025-10-29 20:46:16 ~6 min tests/nim 📄log
✔️ 0236b03 #8 2025-10-29 20:49:52 ~10 min android/arm64 🤖apk 📲
✔️ 0236b03 #3 2025-10-29 20:52:30 ~12 min ios/aarch64 📦pkg
✔️ 0236b03 #3 2025-10-29 20:53:03 ~13 min macos/aarch64 🍎dmg
✔️ 0236b03 #3 2025-10-29 20:53:29 ~13 min tests/ui 📄log
✔️ 0236b03 #3 2025-10-29 20:56:22 ~16 min linux/x86_64 📦tgz
✔️ 0236b03 #3 2025-10-29 21:01:28 ~21 min macos/aarch64-nwaku 🍎dmg
✔️ 0236b03 #3 2025-10-29 21:02:58 ~23 min linux/x86_64-nwaku 📦tgz
✔️ 0236b03 #3 2025-10-29 21:05:47 ~26 min windows/x86_64 💿exe
✖️ 0236b03 pr19140 2025-10-29 21:14:24 ~17 min tests/e2e 📊rpt
✖️ 0236b03 PR19140 2025-10-29 21:20:09 ~14 min tests/e2e-windows 📊rpt
✔️ e50d72c2 #9 2025-10-30 17:29:30 ~13 min android/arm64 🤖apk 📲
✔️ f76f22e #4 2025-10-30 18:27:34 ~18 min ios/aarch64 📦pkg
✔️ f76f22e #10 2025-10-30 18:38:40 ~29 min android/arm64 🤖apk 📲
✔️ f76f22e #4 2025-10-30 18:38:40 ~29 min macos/aarch64 🍎dmg
✔️ f76f22e #4 2025-10-30 18:39:39 ~30 min macos/aarch64-nwaku 🍎dmg
✔️ f76f22e #4 2025-10-30 18:41:02 ~31 min windows/x86_64 💿exe
✔️ f76f22e #4 2025-10-30 18:44:23 ~35 min tests/nim 📄log
✔️ f76f22e #4 2025-10-30 18:52:05 ~42 min linux/x86_64-nwaku 📦tgz
✔️ f76f22e #4 2025-10-30 18:53:18 ~43 min tests/ui 📄log
✔️ f76f22e #4 2025-10-30 18:53:53 ~44 min linux/x86_64 📦tgz
✔️ f76f22e PR19140 2025-10-30 18:54:43 ~13 min tests/e2e-windows 📊rpt
✖️ f76f22e pr19140 2025-10-30 19:22:31 ~28 min tests/e2e 📊rpt
✔️ c2c29c9d #11 2025-10-31 17:26:46 ~11 min android/arm64 🤖apk 📲
✔️ f7857df9 #12 2025-11-03 17:27:43 ~12 min android/arm64 🤖apk 📲
✔️ c6e9f850 #13 2025-11-04 17:28:05 ~12 min android/arm64 🤖apk 📲
✔️ 8008a5fb #14 2025-11-05 17:25:19 ~9 min android/arm64 🤖apk 📲
✔️ 36720c55 #15 2025-11-06 17:27:14 ~11 min android/arm64 🤖apk 📲
✔️ 8985ac25 #16 2025-11-07 17:34:37 ~18 min android/arm64 🤖apk 📲
b417274 #5 2025-11-07 17:46:59 ~10 min macos/aarch64-nwaku 📄log
✔️ b417274 #5 2025-11-07 17:49:01 ~12 min macos/aarch64 🍎dmg
✔️ b417274 #5 2025-11-07 17:51:36 ~15 min ios/aarch64 📱ipa
✔️ b417274 #5 2025-11-07 17:59:40 ~23 min tests/nim 📄log
✔️ b417274 #17 2025-11-07 18:03:51 ~27 min android/arm64 🤖apk 📲
✖️ b417274 #5 2025-11-07 18:04:23 ~27 min windows/x86_64 💿exe
✖️ b417274 #5 2025-11-07 18:09:18 ~32 min linux/x86_64 📦tgz
✔️ b417274 #5 2025-11-07 18:09:27 ~32 min tests/ui 📄log
✔️ 89c5350 #6 2025-11-07 18:22:13 ~7 min tests/nim 📄log
89c5350 #6 2025-11-07 18:22:49 ~8 min macos/aarch64-nwaku 📄log
✔️ 89c5350 #18 2025-11-07 18:24:47 ~10 min android/arm64 🤖apk 📲
✔️ 89c5350 #6 2025-11-07 18:29:19 ~14 min tests/ui 📄log
✔️ 89c5350 #6 2025-11-07 18:29:54 ~15 min macos/aarch64 🍎dmg
✔️ 89c5350 #6 2025-11-07 18:30:07 ~15 min ios/aarch64 📱ipa
✖️ 89c5350 #6 2025-11-07 18:30:55 ~16 min linux/x86_64 📦tgz
✔️ 89c5350 #6 2025-11-07 18:32:27 ~17 min linux/x86_64-nwaku 📦tgz
✖️ 89c5350 #6 2025-11-07 18:40:06 ~25 min windows/x86_64 💿exe
✖️ 89c5350 #7 2025-11-07 19:00:58 ~16 min linux/x86_64 📦tgz
✔️ 89c5350 #7 2025-11-07 19:01:18 ~16 min macos/aarch64-nwaku 🍎dmg
✖️ 89c5350 #7 2025-11-07 19:07:03 ~22 min windows/x86_64 💿exe
✔️ 89c5350 #8 2025-11-10 17:13:03 ~16 min linux/x86_64 📦tgz
✔️ 89c5350 #8 2025-11-10 17:22:28 ~25 min windows/x86_64 💿exe
✖️ 89c5350 pr19140 2025-11-10 17:34:51 ~21 min tests/e2e 📊rpt
✔️ 89c5350 PR19140 2025-11-10 17:34:58 ~12 min tests/e2e-windows 📊rpt
✔️ fbf61013 #19 2025-11-08 17:27:37 ~11 min android/arm64 🤖apk 📲
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 57c08e8e #20 2025-11-10 17:35:02 ~19 min android/arm64 🤖apk 📲
82125e0 #8 2025-11-10 19:06:56 ~5 min macos/aarch64-nwaku 📄log
✔️ 82125e0 #7 2025-11-10 19:08:45 ~7 min tests/nim 📄log
✔️ 82125e0 #21 2025-11-10 19:11:56 ~10 min android/arm64 🤖apk 📲
✔️ 82125e0 #7 2025-11-10 19:13:31 ~12 min macos/aarch64 🍎dmg
✔️ 82125e0 #7 2025-11-10 19:14:14 ~12 min ios/aarch64 📱ipa
✔️ 82125e0 #7 2025-11-10 19:14:32 ~13 min tests/ui 📄log
✔️ 82125e0 #9 2025-11-10 19:17:36 ~16 min linux/x86_64 📦tgz
✔️ 82125e0 #7 2025-11-10 19:18:29 ~17 min linux/x86_64-nwaku 📦tgz
✔️ 82125e0 #9 2025-11-10 19:24:15 ~22 min windows/x86_64 💿exe
✔️ 82125e0 pr19140 2025-11-10 19:34:21 ~16 min tests/e2e 📊rpt
✔️ 82125e0 PR19140 2025-11-10 19:40:12 ~15 min tests/e2e-windows 📊rpt

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 177463b to 5d2f2ca Compare October 27, 2025 18:01
Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

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

LGTM overall


Repeater {
model: root.defaultEmojiReactionsModel
model: 5 // Only show up to 5 recent emojis
Copy link
Member

Choose a reason for hiding this comment

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

You could have an IndexFilter on the above SFPM, to return only [0,5[ items

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch 2 times, most recently from 0236b03 to f76f22e Compare October 30, 2025 18:08
Copy link
Contributor

@noeliaSD noeliaSD left a comment

Choose a reason for hiding this comment

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

Looks good overall!

  1. I’m just thinking about how we manage the recent emojis, right now they’re duplicated both in SQUtils.Emoji.emojisModel and in appMainLocalSettings.recentEmojis, and we’re manually syncing one with the other. That feels a bit error-prone.
    Maybe we could simplify by having a single source of truth, for example, let emojisModel own the recents completely, loading them from appMainLocalSettings on startup and then keeping the two bound so updates automatically persist. That way we avoid having two live copies and reduce the chance of desync issues. WDYT?

  2. One more architectural thought: why is the emojisModel living under SQUtils.Emoji?

What I'm thinking is:
- SQUtils.Emoji → source of truth for static emoji data + stateless utilities (catalog, metadata, search/indexing).
- App store (e.g., EmojiStore)owns stateful, app-specific features like recents, favorites, custom ordering, write-through persistence, etc.

Concretely, we could:

  1. Keep SQUtils.Emoji as a data provider (expose allEmojisModel / search API, no app state).
  2. Introduce an EmojiStore that wraps the provider and exposes:
  • recentModel, favoritesModel (read-only models)
  • methods: toggleFavorite(emoji), clearRecents()..
  • persistence (load on startup from settings, boounded on change)
  1. UI binds only to EmojiStore.XXModel ; SQUtils.Emoji never leaks app state.

Benefits: clearer layering, easier testing/mocking, and we avoid coupling utils to product decisions (like which are the recents we keep).

WDYT?

StatusEmoji {
id: statusEmoji
anchors.centerIn: parent
width: 20
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we want a fixed size or something dynamic for the times coming? ;)

Copy link
Member Author

Choose a reason for hiding this comment

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

I followed the design, but you're right, the design was for Desktop only. What do you suggest to make it more dynamic?

id: root

property var defaultEmojiReactionsModel
required property StatusEmojiModel emojiModel
Copy link
Contributor

Choose a reason for hiding this comment

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

It would be nice to describe which are the properties expected for this specific model

if (!root.recentEmojis) {
return
}
root.emojiModel.recentEmojis = root.recentEmojis
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm wondering why both recentEmojis and emojiModel are required properties, especially since recentEmojis is later assigned to the model itself. Wouldn't it be cleaner to rely directly on the main model's recentEmojis data? Alternatively, if we just need temporary state, we could handle it internally with a private d.recentEmojis property instead.

Copy link
Member Author

Choose a reason for hiding this comment

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

Good point. I did realize that too when I fixed the "final" PR.

So in that other PR, I did basically what you're asking here, ie simplifying so that the Emoji handling is only done in one place, which is the EmojiPopup. Now we only pass the emojiModel and never the skinTone or the recentEmojis.

You can check it out here: #19160 (review)

I should have done that clean up in this first PR, but I thought the issue with recent emojis not updating was because of the model, so I did the simplification in the second one "by accident"

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from f76f22e to b417274 Compare November 7, 2025 17:36
@jrainville jrainville requested a review from noeliaSD November 7, 2025 17:42
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from b417274 to 89c5350 Compare November 7, 2025 18:14
skinColor: appMainLocalSettings.skinColor
emojiModel: SQUtils.Emoji.emojiModel
onSetSkinColor: color => appMainLocalSettings.skinColor = color
onSetRecentEmojis: recentEmojis => appMainLocalSettings.recentEmojis = recentEmojis
Copy link
Member

Choose a reason for hiding this comment

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

I think it'd be cleaner to actually have a small Settings {} inside the popup and encapsulate the skinColor and recentEmojis entirely inside the popup. I'd consider that way cleaner than it is now; some of those settigns are handled inside the popup (in the opened/closed handlers), and some outside here

sourceModel: root.emojiModel

filters: [
IndexFilter {
Copy link
Member

Choose a reason for hiding this comment

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

Wanna keep the IndexFilter or not? :)

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 89c5350 to 82125e0 Compare November 10, 2025 19:00
@jrainville jrainville requested a review from a team as a code owner November 10, 2025 19:00
@jrainville jrainville requested review from glitchminer and removed request for a team November 10, 2025 19:00
@jrainville
Copy link
Member Author

Hurray, I fixed the e2e test 👏

I still need one review please @noeliaSD @micieslak

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants