Skip to content

Conversation

@jrainville
Copy link
Member

@jrainville jrainville commented Oct 28, 2025

What does the PR do

Fixes #18935

Based on top of #19140

Adds the remaining commits that implements the final design for emoji reactions.

Commits:

  1. chore: remove no longer needed emoji reactions model and item: Leftover files that are no longer needed
  2. feat(emojis): make StatusMessageEmojiReactions fit the design and wrap: Designs the emoji line under messages. Makes it use a Flow so that it can break over multiple lines if needed. Also applies new colors and shape
  3. feat(emojis): show recent emojis in the hover menu of messages: Shows the recent emojis in the hover menu on the right of messages. Reuses the MessageReactionsRow component to make it clean and simple

Affected areas

  • StatusMessageEmojiReactions
  • MessageView
  • Theme colors

Architecture compliance

Screencapture of the functionality

emojis-reactions-design-p2.webm

Impact on end user

Makes the reactions look nice and easier to use

How to test

  • Send emoji reactions

Risk

Low

@status-im-auto
Copy link
Member

status-im-auto commented Oct 28, 2025

Jenkins Builds

Click to see older builds (105)
Commit #️⃣ Finished (UTC) Duration Platform Result
9cf2f15 #1 2025-10-28 20:14:20 ~2 min tests/ui 📄log
✔️ 9cf2f15 #1 2025-10-28 20:18:52 ~7 min tests/nim 📄log
9cf2f15 #1 2025-10-28 20:20:38 ~9 min ios/aarch64 📄log
✔️ 9cf2f15 #1 2025-10-28 20:22:13 ~10 min android/arm64 🤖apk 📲
✔️ 9cf2f15 #1 2025-10-28 20:24:38 ~13 min macos/aarch64 🍎dmg
✔️ 9cf2f15 #1 2025-10-28 20:28:37 ~17 min linux/x86_64 📦tgz
✔️ 9cf2f15 #1 2025-10-28 20:34:24 ~22 min macos/aarch64-nwaku 🍎dmg
✔️ 9cf2f15 #1 2025-10-28 20:34:32 ~23 min linux/x86_64-nwaku 📦tgz
✔️ 9cf2f15 #1 2025-10-28 20:37:55 ~26 min windows/x86_64 💿exe
✖️ 9cf2f15 pr19160 2025-10-28 20:47:45 ~18 min tests/e2e 📊rpt
✔️ 9cf2f15 PR19160 2025-10-28 20:48:22 ~10 min tests/e2e-windows 📊rpt
20cec2f #2 2025-10-29 14:07:13 ~3 min tests/ui 📄log
20cec2f #2 2025-10-29 14:09:09 ~5 min macos/aarch64 📄log
✔️ 20cec2f #2 2025-10-29 14:10:52 ~6 min tests/nim 📄log
✔️ 20cec2f #2 2025-10-29 14:14:35 ~10 min ios/aarch64 📦pkg
✔️ 20cec2f #2 2025-10-29 14:14:36 ~10 min android/arm64 🤖apk 📲
✔️ 20cec2f #2 2025-10-29 14:21:07 ~17 min linux/x86_64 📦tgz
✔️ 20cec2f #2 2025-10-29 14:27:07 ~23 min linux/x86_64-nwaku 📦tgz
✔️ 20cec2f #2 2025-10-29 14:28:17 ~24 min macos/aarch64-nwaku 🍎dmg
✔️ 20cec2f #2 2025-10-29 14:31:45 ~27 min windows/x86_64 💿exe
✖️ 20cec2f PR19160 2025-10-29 14:43:05 ~11 min tests/e2e-windows 📊rpt
✖️ 20cec2f pr19160 2025-10-29 14:44:01 ~22 min tests/e2e 📊rpt
✔️ 1bb48ed #3 2025-10-29 21:24:39 ~6 min tests/nim 📄log
✔️ 1bb48ed #3 2025-10-29 21:27:14 ~9 min ios/aarch64 📦pkg
✔️ 1bb48ed #3 2025-10-29 21:27:17 ~9 min android/arm64 🤖apk 📲
✔️ 1bb48ed #3 2025-10-29 21:29:50 ~11 min macos/aarch64 🍎dmg
✔️ 1bb48ed #3 2025-10-29 21:32:01 ~13 min tests/ui 📄log
✔️ 1bb48ed #3 2025-10-29 21:33:55 ~15 min linux/x86_64 📦tgz
✔️ 1bb48ed #3 2025-10-29 21:39:43 ~21 min macos/aarch64-nwaku 🍎dmg
✔️ 1bb48ed #3 2025-10-29 21:41:03 ~23 min linux/x86_64-nwaku 📦tgz
✔️ 1bb48ed #3 2025-10-29 21:44:02 ~25 min windows/x86_64 💿exe
✖️ 1bb48ed pr19160 2025-10-29 21:53:30 ~19 min tests/e2e 📊rpt
✔️ 1bb48ed PR19160 2025-10-29 21:58:52 ~14 min tests/e2e-windows 📊rpt
81bcdea #4 2025-10-31 15:47:15 ~5 min macos/aarch64-nwaku 📄log
✔️ 81bcdea #4 2025-10-31 15:51:29 ~9 min ios/aarch64 📦pkg
✔️ 81bcdea #4 2025-10-31 15:53:06 ~11 min android/arm64 🤖apk 📲
✔️ 81bcdea #4 2025-10-31 15:55:00 ~13 min macos/aarch64 🍎dmg
✔️ 81bcdea #4 2025-10-31 15:57:42 ~15 min tests/nim 📄log
✔️ 81bcdea #4 2025-10-31 16:04:01 ~22 min linux/x86_64 📦tgz
✔️ 81bcdea #4 2025-10-31 16:05:08 ~23 min tests/ui 📄log
✔️ 81bcdea #4 2025-10-31 16:07:04 ~25 min linux/x86_64-nwaku 📦tgz
✔️ 81bcdea #4 2025-10-31 16:10:17 ~28 min windows/x86_64 💿exe
✖️ 81bcdea pr19160 2025-10-31 16:21:43 ~17 min tests/e2e 📊rpt
✔️ 81bcdea PR19160 2025-10-31 16:25:40 ~15 min tests/e2e-windows 📊rpt
✔️ e99156d #5 2025-11-07 18:24:39 ~9 min tests/nim 📄log
✔️ e99156d #5 2025-11-07 18:25:26 ~10 min android/arm64 🤖apk 📲
e99156d #5 2025-11-07 18:30:22 ~15 min tests/ui 📄log
✔️ e99156d #5 2025-11-07 18:30:41 ~15 min ios/aarch64 📱ipa
✔️ e99156d #5 2025-11-07 18:32:38 ~17 min macos/aarch64 🍎dmg
✖️ e99156d #5 2025-11-07 18:33:22 ~18 min linux/x86_64 📦tgz
✔️ e99156d #5 2025-11-07 18:36:49 ~21 min macos/aarch64-nwaku 🍎dmg
✔️ e99156d #5 2025-11-07 18:39:36 ~24 min linux/x86_64-nwaku 📦tgz
✖️ e99156d #5 2025-11-07 18:40:58 ~25 min windows/x86_64 💿exe
✔️ 3fa891a #6 2025-11-10 21:52:46 ~8 min tests/nim 📄log
✔️ 3fa891a #6 2025-11-10 21:54:22 ~10 min android/arm64 🤖apk 📲
✔️ 3fa891a #6 2025-11-10 21:55:12 ~11 min macos/aarch64 🍎dmg
✔️ 3fa891a #6 2025-11-10 21:56:08 ~12 min macos/aarch64-nwaku 🍎dmg
✔️ 3fa891a #6 2025-11-10 21:57:03 ~13 min ios/aarch64 📱ipa
✔️ 3fa891a #6 2025-11-10 21:57:05 ~13 min tests/ui 📄log
✔️ 3fa891a #6 2025-11-10 22:01:05 ~17 min linux/x86_64 📦tgz
✔️ 3fa891a #6 2025-11-10 22:01:24 ~17 min linux/x86_64-nwaku 📦tgz
✔️ 3fa891a #6 2025-11-10 22:09:11 ~25 min windows/x86_64 💿exe
✖️ 3fa891a pr19160 2025-11-10 22:19:33 ~18 min tests/e2e 📊rpt
✔️ 3fa891a PR19160 2025-11-10 22:23:28 ~14 min tests/e2e-windows 📊rpt
✔️ 8e22047 #7 2025-11-13 20:23:58 ~7 min tests/nim 📄log
✔️ 8e22047 #7 2025-11-13 20:26:03 ~9 min android/arm64 🤖apk 📲
8e22047 #7 2025-11-13 20:28:33 ~12 min tests/ui 📄log
✔️ 8e22047 #7 2025-11-13 20:29:41 ~13 min macos/aarch64 🍎dmg
✔️ 8e22047 #7 2025-11-13 20:29:55 ~13 min ios/aarch64 📱ipa
✔️ 8e22047 #7 2025-11-13 20:33:00 ~16 min linux/x86_64 📦tgz
✔️ 8e22047 #7 2025-11-13 20:33:09 ~16 min linux/x86_64-nwaku 📦tgz
✔️ 8e22047 #7 2025-11-13 20:34:54 ~18 min macos/aarch64-nwaku 🍎dmg
✔️ 8e22047 #7 2025-11-13 20:41:59 ~25 min windows/x86_64 💿exe
✔️ 8e22047 pr19160 2025-11-13 20:51:29 ~18 min tests/e2e 📊rpt
✖️ 8e22047 PR19160 2025-11-13 20:58:54 ~16 min tests/e2e-windows 📊rpt
✔️ 8e22047 #8 2025-11-14 15:19:50 ~13 min tests/ui 📄log
✔️ 8e22047 #8 2025-11-14 15:33:52 ~6 min tests/nim 📄log
✔️ 2acc6bc #9 2025-11-14 15:44:20 ~9 min tests/nim 📄log
✔️ 2acc6bc #9 2025-11-14 15:46:16 ~11 min android/arm64 🤖apk 📲
✔️ 2acc6bc #9 2025-11-14 15:50:34 ~15 min macos/aarch64-nwaku 🍎dmg
✔️ 2acc6bc #9 2025-11-14 15:51:08 ~15 min macos/aarch64 🍎dmg
✔️ 2acc6bc #9 2025-11-14 15:51:35 ~16 min ios/aarch64 📱ipa
✔️ 2acc6bc #9 2025-11-14 15:51:43 ~16 min linux/x86_64 📦tgz
✔️ 2acc6bc #9 2025-11-14 15:51:53 ~16 min linux/x86_64-nwaku 📦tgz
✔️ 2acc6bc #10 2025-11-14 15:55:36 ~20 min tests/ui 📄log
✔️ 2acc6bc #9 2025-11-14 16:00:13 ~24 min windows/x86_64 💿exe
✖️ 2acc6bc PR19160 2025-11-14 16:11:05 ~10 min tests/e2e-windows 📊rpt
✖️ 2acc6bc pr19160 2025-11-14 16:14:20 ~22 min tests/e2e 📊rpt
✔️ 26c8987 #10 2025-11-14 18:49:38 ~7 min tests/nim 📄log
✔️ 26c8987 #10 2025-11-14 18:52:04 ~9 min android/arm64 🤖apk 📲
✔️ 26c8987 #10 2025-11-14 18:54:09 ~11 min macos/aarch64 🍎dmg
✔️ 26c8987 #11 2025-11-14 18:55:25 ~13 min tests/ui 📄log
✔️ 26c8987 #10 2025-11-14 18:56:00 ~13 min ios/aarch64 📱ipa
✔️ 26c8987 #10 2025-11-14 18:56:23 ~13 min macos/aarch64-nwaku 🍎dmg
✔️ 26c8987 #10 2025-11-14 18:59:27 ~17 min linux/x86_64 📦tgz
✔️ 26c8987 #10 2025-11-14 18:59:29 ~17 min linux/x86_64-nwaku 📦tgz
✔️ 26c8987 #10 2025-11-14 19:09:04 ~26 min windows/x86_64 💿exe
✖️ 26c8987 pr19160 2025-11-14 19:17:35 ~17 min tests/e2e 📊rpt
✖️ 26c8987 PR19160 2025-11-14 19:21:37 ~12 min tests/e2e-windows 📊rpt
✔️ 0eb11f0 #11 2025-11-14 21:07:58 ~6 min tests/nim 📄log
✔️ 0eb11f0 #11 2025-11-14 21:10:24 ~9 min android/arm64 🤖apk 📲
✔️ 0eb11f0 #11 2025-11-14 21:12:22 ~10 min macos/aarch64 🍎dmg
✔️ 0eb11f0 #11 2025-11-14 21:12:46 ~11 min macos/aarch64-nwaku 🍎dmg
✔️ 0eb11f0 #11 2025-11-14 21:13:58 ~12 min ios/aarch64 📱ipa
✔️ 0eb11f0 #12 2025-11-14 21:15:39 ~14 min tests/ui 📄log
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 367e7ab #12 2025-11-14 21:22:02 ~6 min tests/nim 📄log
✔️ 367e7ab #12 2025-11-14 21:24:39 ~9 min android/arm64 🤖apk 📲
367e7ab #12 2025-11-14 21:24:39 ~9 min ios/aarch64 📄log
✔️ 367e7ab #12 2025-11-14 21:28:32 ~12 min macos/aarch64 🍎dmg
✔️ 367e7ab #12 2025-11-14 21:29:19 ~13 min macos/aarch64-nwaku 🍎dmg
✔️ 367e7ab #13 2025-11-14 21:30:37 ~14 min tests/ui 📄log
✔️ 367e7ab #12 2025-11-14 21:33:27 ~17 min linux/x86_64 📦tgz
✔️ 367e7ab #12 2025-11-14 21:35:28 ~19 min windows/x86_64 💿exe
✔️ 367e7ab #12 2025-11-14 21:37:49 ~22 min linux/x86_64-nwaku 📦tgz
✔️ 367e7ab #13 2025-11-14 21:39:08 ~12 min ios/aarch64 📱ipa
✖️ 367e7ab PR19160 2025-11-14 21:51:01 ~15 min tests/e2e-windows 📊rpt
✖️ 367e7ab pr19160 2025-11-14 21:53:07 ~19 min tests/e2e 📊rpt
✔️ 291be8c #13 2025-11-14 22:05:17 ~7 min tests/nim 📄log
✔️ 291be8c #13 2025-11-14 22:07:40 ~9 min android/arm64 🤖apk 📲
✔️ 291be8c #13 2025-11-14 22:09:47 ~11 min macos/aarch64 🍎dmg
✔️ 291be8c #14 2025-11-14 22:11:22 ~13 min ios/aarch64 📱ipa
✔️ 291be8c #14 2025-11-14 22:11:29 ~13 min tests/ui 📄log
✔️ 291be8c #13 2025-11-14 22:12:01 ~13 min macos/aarch64-nwaku 🍎dmg
✔️ 291be8c #13 2025-11-14 22:14:04 ~15 min linux/x86_64 📦tgz
✔️ 291be8c #13 2025-11-14 22:14:39 ~16 min linux/x86_64-nwaku 📦tgz
✔️ 291be8c #13 2025-11-14 22:17:56 ~19 min windows/x86_64 💿exe
✖️ 291be8c pr19160 2025-11-14 22:31:22 ~17 min tests/e2e 📊rpt
✖️ 291be8c PR19160 2025-11-14 22:31:43 ~13 min tests/e2e-windows 📊rpt

@jrainville
Copy link
Member Author

There is one weird bug I'm running into that might be a QT bug.

If the limit is reached and I remove an emoji, sometimes, not always, it's random, the recent emojis in the hover menu just disappear and the menu has a big blank.

I have no idea why it does that. I'd appreciate some help on that.

Worst case, it's a pretty edge case, since it requires that the limit is reached and you remove one of the reactions, plus it's random.

reactions-bug.webm

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.

Nice work


StatusIcon {
id: addEmojiButton
Item {
Copy link
Member

Choose a reason for hiding this comment

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

This whole thing could be a small StatusButton with enabled: !addEmojiButton.isHovered

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 9cf2f15 to 20cec2f Compare October 29, 2025 14:03
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 5d2f2ca to 0236b03 Compare October 29, 2025 20:39
@jrainville jrainville requested a review from a team as a code owner October 29, 2025 20:39
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 20cec2f to 1bb48ed Compare October 29, 2025 21:17
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.

Great job! Tested it and in general it works fine.

I left some suggestions / comments / questions here:

Design and Implementation Questions:

  • If I understand it correctly the emojis list when hovering should contain the most recent ones, right? So they are dynamically changing? I'm not seing this when testing, the hover emojis list is fixed on my end.
Screen.Recording.2025-10-30.at.12.26.43.mov
  • Looking at the design, there is this subcategory of RECENTS in the popup that is clearly separated by the subtitle. I cannot see it on the app here:
Screen.Recording.2025-10-30.at.12.28.46.mov

The design I'm referring to:

Screenshot 2025-10-30 at 12 29 34
  • Also I see in our implementation we order the emojis by name. Is it intended? I'd expect to be ordered by the time it was set, like in other apps.

numberOfReactions: 2,
numberOfReactions: 232,
jsonArrayOfUsersReactedWithThisEmoji: "[\"Bob\", \"John\"]"
},
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe we could create a specific file with the reactions model so that it's reusable and doesn't add a lot of noise to this specific page?

anchors.rightMargin: 20
anchors.top: parent.top
anchors.topMargin: -8
anchors.topMargin: -4
Copy link
Contributor

Choose a reason for hiding this comment

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

Could we use some Theme.padding to make it more dynamic?

Copy link
Member Author

Choose a reason for hiding this comment

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

Same here. No standard 4.

QtObject {
id: d

readonly property string addReactionButtonName: "addReactionButton"
Copy link
Contributor

Choose a reason for hiding this comment

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

What's this property?

anchors.verticalCenter: parent.verticalCenter
text: model.emoji
}
topPadding: 3
Copy link
Contributor

Choose a reason for hiding this comment

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

Could be nice to use our standard paddings

Copy link
Member Author

Choose a reason for hiding this comment

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

We don't have a padding of 3. Should I just add it?

Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe we should slightly change the design and just use the standard ones?

Copy link
Member

Choose a reason for hiding this comment

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

The other option is to take some other padding, maybe just Theme.padding and multiply it by some factor to land with what you need when the defaultPadding padding is used. Thanks to that it will be scaling along the whole app when paddings are changed globally.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yeah that's roughly what I did 👍

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 0236b03 to f76f22e Compare October 30, 2025 18:08
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 1bb48ed to 81bcdea Compare October 31, 2025 15:41
Copy link
Member Author

@jrainville jrainville left a comment

Choose a reason for hiding this comment

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

Thanks @noeliaSD for the tests and review.

I answered your questions below. I also simplified the code by making EmojiPopup the owner of all the emojis and it now acts like a Singleton (which is already kinda acted as).

If I understand it correctly the emojis list when hovering should contain the most recent ones, right? So they are dynamically changing? I'm not seing this when testing, the hover emojis list is fixed on my end.

Good find. I fixed in the latest commit. Because I was using a Repeater, the model was parsed only once.
I added a Connections to force a model re-eval. It's not the cleanest, but it works.
I tried using a ListView instead, but it didn't behave as well and it has more complexity as a Repeater.

Looking at the design, there is this subcategory of RECENTS in the popup that is clearly separated by the subtitle. I cannot see it on the app here:

I think @caybro implemented it as you saw because it's simpler and doing the categories for real had a big performance impact.

We can try re-visiting that later, but I wouldn't make it part of this issue/PR

Also I see in our implementation we order the emojis by name. Is it intended? I'd expect to be ordered by the time it was set, like in other apps.

I didn't touch the ordering, but I agree it would be better to order by the time they were set, but we currently don't keep track of that. We could do it later, but it's more effort.

anchors.verticalCenter: parent.verticalCenter
text: model.emoji
}
topPadding: 3
Copy link
Member Author

Choose a reason for hiding this comment

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

We don't have a padding of 3. Should I just add it?

anchors.rightMargin: 20
anchors.top: parent.top
anchors.topMargin: -8
anchors.topMargin: -4
Copy link
Member Author

Choose a reason for hiding this comment

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

Same here. No standard 4.

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch 2 times, most recently from b417274 to 89c5350 Compare November 7, 2025 18:14
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 81bcdea to e99156d Compare November 7, 2025 18:14
@jrainville jrainville requested a review from noeliaSD November 7, 2025 18:16
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 89c5350 to 82125e0 Compare November 10, 2025 19:00
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from e99156d to 3fa891a Compare November 10, 2025 21:43
Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

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

Lgtm in general, however there are some solutions looking like workarounds. I think we could try to solve it and make cleaner.

required property StatusEmojiModel emojiModel
required property var recentEmojis
required property string skinColor
required property SortFilterProxyModel emojiModel
Copy link
Member

Choose a reason for hiding this comment

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

Hmm, this is very unusual to require specifically SortFilterProxyModel in the public API. Could it be used with just ListModel containing expected roles? The plain var is expected type for models.


Repeater {
id: recentEmojisRepeater
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.

Why we cannot use the model directly? Especially it's already limited to 5 items 🤔

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 don't know why, but using the model directly slows things down to a crawl and also if I do model.unicode it doesn't have anything in it. So clearly it doesn't work as expected or I'm not using it right.

Anyway, I dropped the IndexFilter for now since it seems to only add unwanted complexity. Feel free to try yourself, maybe you'll use it correctly.

Copy link
Member

Choose a reason for hiding this comment

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

--- a/ui/imports/shared/controls/chat/MessageReactionsRow.qml
+++ b/ui/imports/shared/controls/chat/MessageReactionsRow.qml
@@ -30,19 +30,25 @@ Row {
 
             Repeater {
                 id: recentEmojisRepeater
-                model: 5 // Only show up to 5 recent emojis
+
+                model: SortFilterProxyModel {
+                  sourceModel: root.emojiModel
+                  filters: IndexFilter {
+                    maximumIndex: 4
+                  }
+                }
+
                 delegate: EmojiReaction {
                     id: emojiReaction
+                      required property string unicode
+                      required property string emoji
 
-                    required property int index
-                    property var emoji: root.emojiModel.get(index)
-
-                    emojiId: emojiReaction.emoji.unicode
+                    emojiId: unicode
                     anchors.verticalCenter: parent.verticalCenter
                     // TODO not implemented yet. We'll need to pass this info
                     // reactedByUser: model.didIReactWithThisEmoji
                     onToggleReaction: {
-                        root.toggleReaction(emojiReaction.emoji.emoji)
+                        root.toggleReaction(emoji)
                     }
                 }
             }

Checked, works like a charm for me. No slowness observed.

Copy link
Member Author

Choose a reason for hiding this comment

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

It works! Thanks! I think the problem was that I was using model.unicode

return
Connections {
target: root.emojiModel
onRecentEmojisUpdated: {
Copy link
Member

Choose a reason for hiding this comment

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

This is kind of hidden dependency. Reading only the public API of that component, developer cannot know that some extra signal emitted from SFPM is assumed to be handled there. The question is why it's needed at all?

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 need a signal to know that I need to update the MessageReactinsRow.

Since it uses a Repeater, if I add a new recent emoji, the Row doesn't update, because it was already generated.
I use the signal to re-do the Repeater.

I know it's not very clean. Maybe instead I could run the Repeater only when the Row is visible? So when you hover off and on again, it will be updated, so no need to have that signal?

Copy link
Member Author

Choose a reason for hiding this comment

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

Ok it works. I'll remove the signal


implicitHeight: 22
implicitWidth: childrenRect.width
spacing: 4
Copy link
Member

Choose a reason for hiding this comment

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

Should be derived from some padding probably.

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 82125e0 to 8a3ee65 Compare November 13, 2025 19:17
@jrainville jrainville requested a review from a team as a code owner November 13, 2025 19:17
@jrainville jrainville requested review from glitchminer and removed request for a team November 13, 2025 19:17
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design branch from 8a3ee65 to 50fe136 Compare November 13, 2025 19:31
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 3fa891a to 8e22047 Compare November 13, 2025 20:16
@jrainville
Copy link
Member Author

@micieslak thanks for the review. I addressed your comments

Base automatically changed from feat/emoji-reaction-final-design to master November 14, 2025 15:27
@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 8e22047 to 2acc6bc Compare November 14, 2025 15:34
Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

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

When testing the repeater thing I noticed something wrong:

Screencast.from.14.11.2025.16.53.35.webm
  1. Different icon that the selected is added
  2. When selecting custom one, the box is bigger

@jrainville
Copy link
Member Author

@micieslak I fixed it in the last commit.

The problem was that I was using the raw emoji as the thing we send and parse. That caused the problem with the different emojis selected, but also didn't help for the height.

The one downside is that if you used the previous version and put emojis, they will not appear correctly, but since only devs used them, I think it's ok. Also, it's just emoji reactions.

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 2acc6bc to 26c8987 Compare November 14, 2025 18:42
Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

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

Almost there!

Image

But there is other problem now - the old reactions are not visible and not interactive.

Other a bit annoying problem is with the popup: it cannot be dismissed by clicking outside but within the current message.

Another issue is order of reactions - as a user I would expect them to be in the order of addition. Now newly added reactions jump somewhere in the middle sometimes.

@jrainville
Copy link
Member Author

But there is other problem now - the old reactions are not visible and not interactive.

Yeah, as noted above, it's because of the API change, but that problem will only affect devs, so it should be fine.

Other a bit annoying problem is with the popup: it cannot be dismissed by clicking outside but within the current message.

Agreed it's annoying. I think there is already an issue for that. I think the problem appeared during the QT6 migration

Another issue is order of reactions - as a user I would expect them to be in the order of addition. Now newly added reactions jump somewhere in the middle sometimes.

Indeed, it's not intuitive. We don't have a clock on the reactions. I'll see if I can just try to make it use the order of added

@jrainville jrainville force-pushed the feat/emoji-reaction-final-design-p2 branch from 26c8987 to 0eb11f0 Compare November 14, 2025 21:01
@jrainville
Copy link
Member Author

Another issue is order of reactions - as a user I would expect them to be in the order of addition. Now newly added reactions jump somewhere in the middle sometimes.

Indeed, it's not intuitive. We don't have a clock on the reactions. I'll see if I can just try to make it use the order of added

Ok that was fixed. I didn't realize we had a custom ordering code for new reactions. I guess it was to make sure the old reactions were in the same order as the menu

@jrainville jrainville merged commit bf4994f into master Nov 15, 2025
12 of 13 checks passed
@jrainville jrainville deleted the feat/emoji-reaction-final-design-p2 branch November 15, 2025 00:35
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.

[EmojiReactions] Implement final design

5 participants