refactor(push): hold a tapped notification natively until JS acts on it - #29678
Merged
chrisnojima merged 11 commits intoSep 23, 2026
Merged
Conversation
An untargeted tap still supersedes the waiting one (and acks it), and nothing is held once no switch is in progress or the tap is older than the intent lifetime. At launch the push prompt comes before a tapped route again, as on master; the tap stays queued and the router navigates to it once ready.
On a tablet the open thread is chatRoot's param inside the focused chat tab, not a chatConversation on the root stack.
…count stores The native tap ack is handed in by listenForPushTaps and the switch-in-progress check by account-link-switch, so deep-link-emitter's only dependency stays a leaf.
The pending unbox now lives only as long as its tap is queued; a tap that expires, is superseded or is given up on clears it.
The app-state, login, network, dark-mode, nav-state and daemon subscriptions and the NetInfo listener join the push listeners in _platformUnsubs.
chrisnojima
added this pull request to stack #29680
September 23, 2026 19:54
chrisnojima
removed this pull request from stack #29680
September 23, 2026 19:56
chrisnojima
added this pull request to stack #29681
September 23, 2026 19:56
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack 6/7 on #29650.
Why
What this changes
peekPushTap()returns{payload, id}without clearing it, andackPushTap(id)clears the slot only ifidis still the held one.onPushTapAvailableannounces a new tap.PushTapActivity, which fills the slot and startsMainActivity.didReceivefills the slot. A non-tap push no longer reaches JS. A read-message push that zeroes the badge for the current account clears pending notifications natively.push-tap-resolve.tsxmaps the payload to akeybase://route and target uid.account-link-switch.tsx.localUnboxMobilePushNotification, once per tap and only when the tap's account is current.getInitialNotification,onPushNotification,engineReset),constants/types/push.tsxandfollowUser.Judgment calls
chat.extensionmapping is dropped. Nothing on master sends that type; unknown types resolve to no route and are acked at once.getInitialURL, as on master. The tap stays queued and navigates once the router is ready.Tests
push-tap-resolve.test.tsports the Go resolver table.push-tap.test.tscovers:PushTapSlotTestcovers the Kotlin slot.Mutation-checked.