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 (37)
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 📲
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 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 📲

@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 from 5d2f2ca to 0236b03 Compare October 29, 2025 20:39
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch 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? ;)

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"

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