You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Receiving a tapback/reaction previously produced no local notification:
both notification branches in textMessageAppPacket gated on
isEmoji == false, so a reaction was stored but only visible with the
conversation already open.
Now, when a reaction arrives and the sender/channel isn't muted, look up
the reacted-to message locally by messageId == replyID and schedule an
iMessage-style notification (e.g. `Alice reacted 👍 to "See you soon"`).
If the original message isn't known locally (a "phantom" tapback whose
replyID matches nothing), the reaction is still stored but no
notification is shown — mirroring Android's rememberReaction guard.
- Add MeshPackets.reactionNotificationBody(replyID:emoji:senderName:context:)
(static + context-injected so it's unit-testable) which returns nil for
phantom tapbacks and formats the localized body otherwise.
- Add makeMessageNotification(...) factory to collapse the DM/channel by
regular/reaction Notification construction into one path.
- Add the reaction body format key to Localizable.xcstrings.
Out of scope (unchanged): unread-count/badge behavior. The isEmoji == false
filters in the *EntityExtension unread counts stay, so a reaction notifies
without bumping the conversation's unread badge (matching iMessage/Google
Messages).
Adds ReactionNotificationTests (7 tests) covering the phantom-tapback guard
(unknown/zero/negative replyID), the formatted body, emoji fallbacks, and
the nil-original-payload-still-notifies edge. Verified on iOS 18.2
(iPhone 16) and iOS 17-era simulators.
Docs: update docs/user/messages.md (Tapback Reactions) to describe received
reaction notifications, add a docs/user/whats-new.md entry, and regenerate
the bundled HTML under Meshtastic/Resources/docs/.
Copy file name to clipboardExpand all lines: Localizable.xcstrings
+3Lines changed: 3 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,9 @@
1
1
{
2
2
"sourceLanguage" : "en",
3
3
"strings" : {
4
+
"%1$@ reacted %2$@ to \"%3$@\"" : {
5
+
"comment" : "Tapback/reaction notification body. %1$@ is the sender name, %2$@ is the reaction emoji, %3$@ is the original message text that was reacted to."
6
+
},
4
7
"%@ entered %@" : {
5
8
"comment" : "Geofence notification body. First %@ is the node name, second %@ is the waypoint name."
Copy file name to clipboardExpand all lines: Meshtastic/Resources/docs/markdown/user/messages.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -92,6 +92,8 @@ A green shield (🛡️) on a broadcast message bubble means the message is **si
92
92
93
93
Long press any message and tap **Tapback** to send an emoji reaction.
94
94
95
+
When someone reacts to a message, you get a notification such as **Alice reacted 👍 to "See you soon"** — unless the sender (for a direct message) or the channel is muted. Reactions notify **without** adding to the conversation's unread badge. If your radio hasn't seen the message that was reacted to, the reaction is saved but no notification is shown (there'd be nothing to display it against).
Copy file name to clipboardExpand all lines: Meshtastic/Resources/docs/markdown/user/whats-new.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,6 +14,8 @@ Recent user-facing changes from roughly the last 12 months. Newest at the top.
14
14
Show roughly the last 12 months of changes; archive entries older than a year by removing them.
15
15
-->
16
16
17
+
**Jul 2026** — [Messages](messages.md) — Received tapback reactions now notify (e.g. "Alice reacted 👍 to …"), matching iMessage and Meshtastic-Android; muted conversations are respected, the unread-badge behavior is unchanged, and reactions to messages your radio never saw are stored silently.
18
+
17
19
**Jul 2026** — [Local Mesh Discovery](discovery.md) — Mesh beacons: scans capture beacons advertising a mesh (message, channel, region, preset) and show them in the results. Public-channel presets are auto-added to the scan and pre-selected next time; custom-channel beacons are tuned into directly (name + key) so even private meshes are found. Each beaconed channel gets a Switch to this channel button to join it.
18
20
19
21
**Jul 2026** — [Map & Waypoints](map.md) — Precise locations only: a new Map Options toggle hides nodes that broadcast an approximate (reduced-precision) location — the ones drawn with a translucent precision circle — so the mesh map shows only nodes reporting an exact position.
Copy file name to clipboardExpand all lines: Meshtastic/Resources/docs/user/messages.html
+1Lines changed: 1 addition & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -126,6 +126,7 @@ <h3>Signing</h3>
126
126
<hr/>
127
127
<h3>Tapback Reactions</h3>
128
128
<p>Long press any message and tap <strong>Tapback</strong> to send an emoji reaction.</p>
129
+
<p>When someone reacts to a message, you get a notification such as <strong>Alice reacted 👍 to "See you soon"</strong> — unless the sender (for a direct message) or the channel is muted. Reactions notify <strong>without</strong> adding to the conversation's unread badge. If your radio hasn't seen the message that was reacted to, the reaction is saved but no notification is shown (there'd be nothing to display it against).</p>
Copy file name to clipboardExpand all lines: Meshtastic/Resources/docs/user/whats-new.html
+1Lines changed: 1 addition & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -14,6 +14,7 @@ <h1>What's New</h1>
14
14
**Month YYYY** — [Page title](relative/path.md) — One sentence describing what changed or why it matters.
15
15
Show roughly the last 12 months of changes; archive entries older than a year by removing them.
16
16
-->
17
+
<p><strong>Jul 2026</strong> — <ahref="messages.html">Messages</a> — Received tapback reactions now notify (e.g. "Alice reacted 👍 to …"), matching iMessage and Meshtastic-Android; muted conversations are respected, the unread-badge behavior is unchanged, and reactions to messages your radio never saw are stored silently.</p>
17
18
<p><strong>Jul 2026</strong> — <ahref="discovery.html">Local Mesh Discovery</a> — Mesh beacons: scans capture beacons advertising a mesh (message, channel, region, preset) and show them in the results. Public-channel presets are auto-added to the scan and pre-selected next time; custom-channel beacons are tuned into directly (name + key) so even private meshes are found. Each beaconed channel gets a Switch to this channel button to join it.</p>
18
19
<p><strong>Jul 2026</strong> — <ahref="map.html">Map & Waypoints</a> — Precise locations only: a new Map Options toggle hides nodes that broadcast an approximate (reduced-precision) location — the ones drawn with a translucent precision circle — so the mesh map shows only nodes reporting an exact position.</p>
19
20
<p><strong>Jul 2026</strong> — <ahref="lockdown.html">Lockdown Mode</a> — Support for hardened lockdown-firmware radios: set or enter the device passphrase in a full-screen prompt, with per-radio Keychain passphrase storage and silent re-unlock, optional session limits (boots, hours, per-boot cap), and Lock Now / Forget Stored Passphrase in Security settings.</p>
0 commit comments