Skip to content

feat(expo): let native components keep their own chrome when embedded - #9121

Merged
mikepitre merged 14 commits into
mainfrom
mike/expo-hosted-navigation
Jul 31, 2026
Merged

feat(expo): let native components keep their own chrome when embedded#9121
mikepitre merged 14 commits into
mainfrom
mike/expo-hosted-navigation

Conversation

@mikepitre

@mikepitre mikepitre commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Description

UserProfileView and AuthView render their own navigation header, so pushing them onto an expo-router stack produces a double header, and the route's back button can't reach Clerk's internal screens. Requested by a customer in this thread.

Hide your route's header and pass onHostBack. That's the whole API:

// app/(app)/account.tsx
export default function AccountRoute() {
  const router = useRouter();

  return (
    <>
      <Stack.Screen options={{ headerShown: false }} />
      <UserProfileView isDismissible={false} onHostBack={() => router.back()} style={{ flex: 1 }} />
    </>
  );
}

The component keeps its own chrome, so screen titles, back buttons, swipe-back, and transitions inside it are the platform's own — Clerk's navigation stays driven by Clerk's own buttons, which is what keeps the transitions native. onHostBack both shows a back button on the component's root screen, where it has nothing of its own to go back to, and tells you when it's tapped.

The component never leaves the route on its own. React to auth state for flow completion, either swapping content in place on one route:

{isSignedIn ? <UserProfileView isDismissible={false} onHostBack={...} />
            : <AuthView isDismissible={false} onHostBack={...} />}

or popping the route when a session becomes active. Both are in the demo app.

Native halves

clerk-ios#519 and clerk-android#798 are merged and released in clerk-ios 1.3.6 and clerk-android 1.0.39. @clerk/expo now pins those versions.

Verified end to end on both iOS and Android with the NativeComponentQuickstart demo: pushed route, internal push and pop, host back at the root, sign-in, sign-out, and a settings form sheet. The Expo native CI fixture also passes its embedded profile host-back round trip on both platforms.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

🤖 Generated with Claude Code

@changeset-bot

changeset-bot Bot commented Jul 9, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 702952c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@clerk/expo Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
clerk-js-sandbox Ready Ready Preview Jul 31, 2026 5:11am
swingset Ready Ready Preview Jul 31, 2026 5:11am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds optional onHostBack support to native AuthView and UserProfileView. JavaScript forwards the callback and enables native host back controls. Android and iOS dispatch onHostBack events through their native implementations. New tests, an Expo native fixture, an integration flow, and changeset documentation cover the behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • clerk/javascript#9163: Modifies ClerkAuthView across the same Expo TypeScript, Android, and iOS implementations.

Suggested reviewers: swolfand, seanperez29

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.74% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the main change: native components retain their navigation chrome when embedded.
Description check ✅ Passed The description accurately explains the embedded navigation API, behavior, native dependencies, testing, and usage examples.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Jul 9, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9121

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9121

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9121

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9121

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9121

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9121

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9121

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9121

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9121

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9121

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9121

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9121

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9121

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9121

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9121

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9121

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9121

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9121

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9121

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9121

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9121

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9121

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9121

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9121

commit: 702952c

Comment thread packages/expo/src/native/router.tsx Outdated
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-07-31T12:14:43.300Z

Summary

Metric Count
Packages analyzed 19
Packages with changes 1
🔴 Breaking changes 0
🟡 Non-breaking changes 1
🟢 Additions 2

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.1.2
Recommended bump: MINOR → 4.2.0

Subpath ./native

🟡 Non-breaking Changes (1)

Modified: AuthView
- export declare function AuthView(input: AuthViewProps): ReactElement;
+ export declare function AuthView(input: AuthViewProps): import("react/jsx-runtime").JSX.Element;

Static analyzer: Breaking change in function AuthView: Return type changed: import("@types/react").React.ReactElementimport("@types/react").JSX.Element

🤖 AI review (reclassified as non-breaking) (95%): Both React.ReactElement and JSX.Element (from react/jsx-runtime) are structurally equivalent React element types, and narrowing a return type is non-breaking by output covariance; the specifier react/jsx-runtime resolves as a public exported entry point per the deterministic resolution verdict.

🟢 Additions (2)

Added: EmbeddedNavigationProps
+ export interface EmbeddedNavigationProps

Added interface EmbeddedNavigationProps

Added: EmbeddedNavigationProps.onHostBack
+ onHostBack?: () => void;

Added property EmbeddedNavigationProps.onHostBack


Report generated by Break Check

Last ran on 702952c.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt (1)

63-126: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Align Android embeddedNavigation with the iOS lifecycle in both native views. Android creates embeddedNavigation unconditionally, passes it to AuthView/UserProfileView only when hideHeader is true, and still calls its pop()/popToRoot() from goBack()/popToRoot(). Like iOS, make the field optional, create it in the composable/host view lifecycle only when hideHeader is true, and call pop()/popToRoot() through ?..

  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt
  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt`
around lines 63 - 126, The Android native views currently instantiate embedded
navigation unconditionally; align both lifecycle implementations with iOS. In
packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt
lines 63-126, make embeddedNavigation nullable, initialize it only when
hideHeader is true within the composable/host lifecycle, and invoke pop() and
popToRoot() from goBack() and popToRoot() via safe calls. Apply the same changes
to
packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt
lines 32-76, preserving the existing AuthView and UserProfileView navigation
behavior.
🧹 Nitpick comments (2)
packages/expo/src/native/__tests__/router.test.tsx (1)

36-72: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test coverage gap: only AuthScreen dismiss path is exercised.

UserProfileScreen (new public export) has no dedicated test, and neither screen has a test for the hardware-back-press → goBack() path or the screenOptions toggling (headerBackVisible/gestureEnabled/headerLeft) based on canGoBack, which is the core behavior this file adds. As per coding guidelines, "Unit tests are required for all new functionality" and "Include tests for all new features" for test files.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/expo/src/native/__tests__/router.test.tsx` around lines 36 - 72, The
test suite currently covers only AuthScreen’s dismiss action. Extend the
AuthScreen tests and add dedicated UserProfileScreen tests to cover
hardware-back-press invoking goBack(), plus screenOptions behavior for both
canGoBack states, including headerBackVisible, gestureEnabled, and headerLeft;
retain the existing dismiss assertions.

Source: Coding guidelines

packages/expo/src/native/router.tsx (1)

76-76: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

useRef(fn()).current re-invokes the loader on every render.

useRef(loadExpoRouter()) (lines 145, 202) and useRef(loadHeaderBackButton()) (line 76) pass a freshly computed value as the useRef argument; JS evaluates that argument on every render even though only the first value is retained. This means require()/error-throwing runs on every render, not just mount.

♻️ Lazy-init pattern
-export function UserProfileScreen({ onDismiss, style, options }: UserProfileScreenProps): ReactElement {
-  const router = useRef(loadExpoRouter()).current;
+export function UserProfileScreen({ onDismiss, style, options }: UserProfileScreenProps): ReactElement {
+  const routerRef = useRef<ExpoRouterModule | null>(null);
+  if (routerRef.current === null) {
+    routerRef.current = loadExpoRouter();
+  }
+  const router = routerRef.current;

Apply the same pattern to HeaderBackButton in useEmbeddedScreen and to AuthScreen.

Also applies to: 145-145, 202-202

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/expo/src/native/router.tsx` at line 76, Replace eager loader
evaluation in useEmbeddedScreen’s HeaderBackButton initialization and the
corresponding AuthScreen loadExpoRouter initializations with lazy ref
initialization: create the ref without invoking the loader, then call the loader
only when the ref’s current value is unset. Apply this to HeaderBackButton and
both loadExpoRouter usages, preserving the existing loaded values and behavior
after initialization.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.changeset/hosted-navigation-native-views.md:
- Line 12: Update the release note wording from “hosted-navigation support” to
“embedded-navigation support” when describing the required clerk-ios and
clerk-android SDK releases, preserving the rest of the note unchanged.

In
`@packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt`:
- Around line 63-64: Make embeddedNavigation nullable and only initialize it
when hideHeader is true, matching the AuthView usage in Content(). Update the
goBack()/popToRoot() callbacks and any AuthView argument handling to safely
operate on the nullable navigation, avoiding mutations when no AuthView is using
it.

In
`@packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt`:
- Around line 32-35: Align goBack() and popToRoot() with the embeddedNavigation
instance passed by Content() to UserProfileView(...): invoke navigation only
when hideHeader is enabled and the rendered instance is available, otherwise
no-op. Remove the unconditional dereferences of the independently created
embeddedNavigation so these controls remain connected to the rendered
navigation.

In `@packages/expo/package.json`:
- Line 156: Update the scoped Clerk dependency entries in
packages/expo/package.json, including expo-google-signin and expo-passkeys, to
use their published `@clerk/` package names while preserving the existing version
ranges.

In `@packages/expo/src/native/router.tsx`:
- Around line 52-56: The loadHeaderBackButton function must stop throwing
synchronously during render: resolve HeaderBackButton through
expo-router/react-navigation first, fall back to `@react-navigation/elements` for
older setups, and wrap both attempts in the same guarded try/catch pattern used
by loadExpoRouter. Propagate failure through useEmbeddedScreen rather than
introducing repeated render-time exceptions, while preserving the existing
HeaderBackButton return contract.

---

Outside diff comments:
In
`@packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt`:
- Around line 63-126: The Android native views currently instantiate embedded
navigation unconditionally; align both lifecycle implementations with iOS. In
packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt
lines 63-126, make embeddedNavigation nullable, initialize it only when
hideHeader is true within the composable/host lifecycle, and invoke pop() and
popToRoot() from goBack() and popToRoot() via safe calls. Apply the same changes
to
packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt
lines 32-76, preserving the existing AuthView and UserProfileView navigation
behavior.

---

Nitpick comments:
In `@packages/expo/src/native/__tests__/router.test.tsx`:
- Around line 36-72: The test suite currently covers only AuthScreen’s dismiss
action. Extend the AuthScreen tests and add dedicated UserProfileScreen tests to
cover hardware-back-press invoking goBack(), plus screenOptions behavior for
both canGoBack states, including headerBackVisible, gestureEnabled, and
headerLeft; retain the existing dismiss assertions.

In `@packages/expo/src/native/router.tsx`:
- Line 76: Replace eager loader evaluation in useEmbeddedScreen’s
HeaderBackButton initialization and the corresponding AuthScreen loadExpoRouter
initializations with lazy ref initialization: create the ref without invoking
the loader, then call the loader only when the ref’s current value is unset.
Apply this to HeaderBackButton and both loadExpoRouter usages, preserving the
existing loaded values and behavior after initialization.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: aef48b31-b970-4d9a-9ea3-3ccf7ae34b66

📥 Commits

Reviewing files that changed from the base of the PR and between d788708 and f546587.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (20)
  • .changeset/hosted-navigation-native-views.md
  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt
  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt
  • packages/expo/ios/ClerkAuthNativeView.swift
  • packages/expo/ios/ClerkNativeBridge.swift
  • packages/expo/ios/ClerkUserProfileNativeView.swift
  • packages/expo/native/router/package.json
  • packages/expo/package.json
  • packages/expo/src/native/AuthView.tsx
  • packages/expo/src/native/AuthView.types.ts
  • packages/expo/src/native/EmbeddedNavigation.types.ts
  • packages/expo/src/native/UserProfileView.tsx
  • packages/expo/src/native/__tests__/UserProfileView.test.tsx
  • packages/expo/src/native/__tests__/router.test.tsx
  • packages/expo/src/native/index.ts
  • packages/expo/src/native/router.tsx
  • packages/expo/src/specs/NativeClerkAuthView.android.ts
  • packages/expo/src/specs/NativeClerkAuthView.ts
  • packages/expo/src/specs/NativeClerkUserProfileView.android.ts
  • packages/expo/src/specs/NativeClerkUserProfileView.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)

Comment thread .changeset/hosted-navigation-native-views.md Outdated
Comment thread packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt Outdated
Comment thread packages/expo/package.json Outdated
Comment thread packages/expo/src/native/router.tsx Outdated
Adds hideHeader, onNavigationChange, and goBack()/popToRoot() refs to the
native UserProfileView and AuthView so they can be pushed onto a host
navigation stack without a double header, plus a new @clerk/expo/native/router
entry with prewired expo-router screens (UserProfileScreen, AuthScreen).
expo-router becomes an optional peer dependency.

Native halves require clerk-ios and clerk-android releases with hosted
navigation support before the pods/gradle modules compile.
Embedding previously hid Clerk's navigation chrome and asked the host to
rebuild it: the host drew the header, read the component's internal depth,
and drove pops back across the bridge. Back never animated that way, because
a navigation change arriving from outside the component's own event handling
applies without a transition.

The components now keep their chrome when pushed onto a host stack, so screen
titles, back buttons, swipe-back, and transitions are the platform's own. The
host hides its route header and supplies only the root back button through
hostBackButton / onHostBack. hideHeader, onNavigationChange, and the goBack /
popToRoot refs are gone along with the machinery behind them.
@mikepitre mikepitre changed the title feat(expo): add embedded navigation mode to native components feat(expo): let native components keep their own chrome when embedded Jul 30, 2026
The prewired expo-router screens bundled three lines of boilerplate with one
opinionated behavior: pop exactly one route when the flow ends. That policy
doesn't fit apps that swap content in place on the same route, and it cost a
separate entry point, an optional expo-router peer dependency, a lazy require,
and a Metro stub directory to deliver.

Apps now hide their own header and pass onHostBack, which both enables the
back button and receives the tap, so the redundant hostBackButton flag is
gone from the public API. Flow completion is the app's call: react to auth
state to swap content or pop the route.
The export pointed at a file that no longer ships, and expo-router was still
declared as an optional peer for it.
It described the removed embedded-navigation handle, and its trailing
@mainactor attached itself to the next declaration.
It still resolved expo-router after the optional peer dependency was dropped.

@wobsoriano wobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Great work!

@mikepitre
mikepitre marked this pull request as ready for review July 31, 2026 12:12

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
integration/tests/expo-native/flows/embedded-profile-host-back.yaml (1)

1-35: 🩺 Stability & Availability | 🔵 Trivial

Verify native-platform execution before release.

The flow exercises host-back behavior through native navigation. Android and iOS use separate native implementations. Confirm that this flow runs on both platforms, especially Android, before treating it as release coverage.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@integration/tests/expo-native/flows/embedded-profile-host-back.yaml` around
lines 1 - 35, Run the embedded UserProfileView host-back flow on both Android
and iOS native implementations, with particular attention to Android, and verify
that all navigation and sign-out assertions pass before considering this release
coverage.
packages/expo/src/native/AuthView.tsx (1)

43-50: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Restore explicit return types for exported components.

AuthView removes its explicit return type. UserProfileView also relies on inference. Declare an explicit React element return type for both public APIs.

  • packages/expo/src/native/AuthView.tsx#L43-L50: Add an explicit return type to AuthView.
  • packages/expo/src/native/UserProfileView.tsx#L67-L67: Add an explicit return type to UserProfileView.

As per coding guidelines, “Always define explicit return types for functions, especially public APIs”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/expo/src/native/AuthView.tsx` around lines 43 - 50, Restore explicit
React element return types on the public AuthView and UserProfileView component
functions. Update packages/expo/src/native/AuthView.tsx lines 43-50 and
packages/expo/src/native/UserProfileView.tsx line 67; no other behavior changes
are needed.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.changeset/hosted-navigation-native-views.md:
- Around line 5-16: Update the changeset documentation to explicitly list the
removed router entry points, custom header controls, navigation callbacks, and
imperative navigation refs. Clarify that integrations using those APIs must
render UserProfileView or AuthView in the host route and use the optional
onHostBack callback to dismiss it, while preserving the unchanged-usage note
only for integrations that do not depend on the removed APIs.

In `@packages/expo/src/native/__tests__/UserProfileView.test.tsx`:
- Around line 51-70: Add AuthView tests mirroring the UserProfileView host-back
cases: verify a provided onHostBack enables hostBackButton and invokes the
callback, and verify omitting onHostBack disables hostBackButton and leaves the
native onHostBack prop undefined.

---

Nitpick comments:
In `@integration/tests/expo-native/flows/embedded-profile-host-back.yaml`:
- Around line 1-35: Run the embedded UserProfileView host-back flow on both
Android and iOS native implementations, with particular attention to Android,
and verify that all navigation and sign-out assertions pass before considering
this release coverage.

In `@packages/expo/src/native/AuthView.tsx`:
- Around line 43-50: Restore explicit React element return types on the public
AuthView and UserProfileView component functions. Update
packages/expo/src/native/AuthView.tsx lines 43-50 and
packages/expo/src/native/UserProfileView.tsx line 67; no other behavior changes
are needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 0a03a0e7-b9ed-4add-9dc2-c07bdb739761

📥 Commits

Reviewing files that changed from the base of the PR and between 93c371c and 702952c.

📒 Files selected for processing (17)
  • .changeset/hosted-navigation-native-views.md
  • integration/templates/expo-native/App.tsx
  • integration/tests/expo-native/flows/embedded-profile-host-back.yaml
  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkAuthViewModule.kt
  • packages/expo/android/src/main/java/expo/modules/clerk/ClerkUserProfileViewModule.kt
  • packages/expo/ios/ClerkAuthNativeView.swift
  • packages/expo/ios/ClerkNativeBridge.swift
  • packages/expo/ios/ClerkUserProfileNativeView.swift
  • packages/expo/src/native/AuthView.tsx
  • packages/expo/src/native/EmbeddedNavigation.types.ts
  • packages/expo/src/native/UserProfileView.tsx
  • packages/expo/src/native/__tests__/UserProfileView.test.tsx
  • packages/expo/src/native/index.ts
  • packages/expo/src/specs/NativeClerkAuthView.android.ts
  • packages/expo/src/specs/NativeClerkAuthView.ts
  • packages/expo/src/specs/NativeClerkUserProfileView.android.ts
  • packages/expo/src/specs/NativeClerkUserProfileView.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)

Comment thread .changeset/hosted-navigation-native-views.md
Comment thread packages/expo/src/native/__tests__/UserProfileView.test.tsx

Copy link
Copy Markdown
Contributor Author

Follow-up on the two review-summary nitpicks:

  • The new embedded-profile-host-back flow passed on both Expo 57 iOS and Android jobs at 702952c.
  • I’m leaving the inferred component return types as-is. Explicit return types are not required by this repository’s rules, UserProfileView already relied on inference before this PR, and the API Changes check classified the AuthView declaration change as non-breaking. Avoiding unrelated type-only churn here.

I also refreshed the PR body to reflect the merged native PRs, released/pinned SDK versions, and completed platform verification.

Written by Codex

@mikepitre
mikepitre merged commit b3f9243 into main Jul 31, 2026
101 checks passed
@mikepitre
mikepitre deleted the mike/expo-hosted-navigation branch July 31, 2026 13:09
@coderabbitai coderabbitai Bot mentioned this pull request Jul 31, 2026
9 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants