Launcher visibility
Where the launcher appears, when it shows, and how it is positioned — route groups, delays, continuity and insets.
Use this once you have a working React Native integration. "Show the button on these screens" survives about a week of real product work. Then: not on login; not until they have been there long enough to be stuck rather than reading; do not pop in again between steps of one flow; sit above the tab bar here and not there.
Requirements
GraineProvider must wrap NavigationContainer and share the same navigationRef.
Without that the provider cannot observe route changes and none of this applies.
The simple case
Route names are case-sensitive and must match your navigator exactly. Omit
includeScreens and every screen is eligible.
Add a global delay with launcherDelayMs={1500}.
Groups
When one flow needs different rules from another:
Continuity
| Value | Meaning |
|---|---|
continuous | Moving between screens in this group keeps the launcher where it is |
perScreen | Each screen is decided independently |
A multi-step form is one place as far as the customer is concerned. Re-running the delay on every step makes the launcher flicker in and out five times during a single KYC journey.
Delay policy
| Value | When the delay runs |
|---|---|
perScreen | Every time they land on a screen in the group |
oncePerGroupEntry | Once on entering the flow; free inside it |
oncePerAppSession | Once per app run |
Insets
{ top?, right?, bottom?, left? }, per group or as defaultInset. Use it to
clear tab bars and bottom sheets. Defaults to { right: 16, bottom: 20 }.
What actually happens
Walked through a real journey with the config above:
Rules worth knowing
- Screens in any group count as included, even if you omit them from
includeScreens. The final set is the union, so groups alone are enough. - With no rules configured at all, everything is eligible. An SDK that hides its own launcher until it is configured looks broken on the first run.
- Leaving a group ends the visit, so returning later is a fresh entry and
oncePerGroupEntrymeans what it says.
Hiding it on sensitive flows
Leave auth and payment-entry screens out of includeScreens and out of every
group. There is no separate "exclude" list on purpose: a screen is shown the
launcher because a rule named it, never because no rule excluded it.
Troubleshooting
| Symptom | What to check |
|---|---|
| Never appears | navigationRef is the same ref as on NavigationContainer; the route is in includeScreens or a group; a delay may still be running |
| Appears on the wrong screens | Route names are case-sensitive — Step1, not step1 |
| Delay "only happened once" | oncePerGroupEntry or oncePerAppSession is working as designed |
| Overlaps the tab bar | Set inset.bottom for that group, or defaultInset |

