Skip to content

fix(deeplinks): route a jump link that carries its own path - #1367

Merged
bmc08gt merged 2 commits into
code/cashfrom
fix/tip-deeplink-and-balance-prompt
Aug 28, 2026
Merged

fix(deeplinks): route a jump link that carries its own path#1367
bmc08gt merged 2 commits into
code/cashfrom
fix/tip-deeplink-and-balance-prompt

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Two fixes found while testing #1366 after it merged.

A tip card link from the website opened the app and did nothing

"Open in Flipcash" on flipcash.com/<handle> does not navigate to the URL in the address bar. The page's script redirects to a redirector:

const url = `https://jump.flipcash.com/tip/${uuid}`;
window.location.href = url;

classifyOrThrow read jump.flipcash.com as a wrapper and nothing else, so a link with no #source= fragment left unwrapJumpTarget() returning null and fell through to unrouted() — which returns None for every host but the bare flipcash.com. The tap brought the app to the front and nothing happened, from anywhere in the app.

A jump link is now classified by its own path when there is no fragment to unwrap. The redirector is claimed whole by the manifest and mirrors the app's path space, so /tip/{id} resolves the same as it does on app.flipcash.com. A #source= fragment still takes precedence, and isProfileLink stays host-gated to flipcash.com, so the redirector does not start claiming handles.

DeepLinkController on iOS is described as the mirror of this branch, so it likely drops the same URL.

The insufficient-balance prompt drew behind the tip modal

NavMessagingEntryDecorator was nested inside NavBillOverlayEntryDecorator, and the outermost decorator paints last, so the bill overlay covered any prompt raised from it. The two are swapped: a bottom bar message is a prompt that has to be answered, so it sits above what the entry draws.

The in-chat over-balance path also raised a red destructive alert. It now raises the same info prompt the tip card uses, with an "Add Money" action — presentAddMoney still covers the empty account, which has nothing to enter a smaller amount than.

…verlay

The prompt was drawn by NavMessagingEntryDecorator, which sat inside
NavBillOverlayEntryDecorator; the outermost decorator paints its overlay last, so
the tip card always covered the prompt it had just raised. Moving the messaging
decorator outermost puts a prompt that has to be answered above everything the
entry draws.

The in-chat send raised a red alert for the same condition. It is the same
situation the tip card handles as info with an Add Money action, so it now
does too.
The website's tip interstitial sends "Open in Flipcash" to
jump.flipcash.com/tip/{id}, with no `#source=` fragment. classifyOrThrow
read the jump host as a wrapper and nothing else, so unwrapJumpTarget
returned null and the link fell through to unrouted() — which hands only
flipcash.com back to the browser and returns None for every other host.
The tap brought the app to the front and nothing happened.

Classify a jump link by its own path when there is no fragment to
unwrap. The redirector is claimed whole by the manifest and mirrors the
app's path space, so /tip/{id} resolves the same as it does on
app.flipcash.com. A `#source=` fragment still takes precedence, and
isProfileLink stays host-gated to flipcash.com, so the redirector does
not start claiming handles.
@bmc08gt bmc08gt self-assigned this Aug 28, 2026
@github-actions github-actions Bot added area: deeplinks Deep link handling, URL routing, and link parsing type: fix Bug fix labels Aug 28, 2026
@bmc08gt
bmc08gt merged commit dbcd496 into code/cash Aug 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: deeplinks Deep link handling, URL routing, and link parsing type: fix Bug fix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant