Skip to content

fix(expo): fire onDismiss from the close button of an inline AuthView on iOS - #10079

Merged
mikepitre merged 3 commits into
mainfrom
mike/expo-inline-auth-dismiss
Oct 6, 2026
Merged

mikepitre merged 3 commits into
mainfrom
mike/expo-inline-auth-dismiss

Conversation

@mikepitre

@mikepitre mikepitre commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Description

On iOS, the close button of a dismissible <AuthView /> did nothing when the view was rendered inline, and onDismiss never fired. isDismissible defaults to true and the component's own example renders it inline, so the documented usage shipped with a dead X. The same JSX already worked on Android.

The fix depends on clerk/clerk-ios#631, which shipped in clerk-ios 1.5.9. main already pins 1.5.9 (#10083), so this PR no longer touches the podspec. An earlier revision of this branch pinned the merge commit while the release was pending.

Why the button was dead: clerk-ios closes AuthView through SwiftUI's dismiss, and that has nothing to close for a view that is not presented. No UIKit dismissal reaches the bridge either, so there was nothing for @clerk/expo to observe. clerk/clerk-ios#631 adds a host dismiss action for this case, next to the host back action the bridge already uses. The bridge now passes one for a dismissible AuthView, and it emits the same dismissed event the bridge sends when the hosted view is detached. Inside a modal, clerk-ios still closes the view itself and the bridge sends the event once.

Android needed no change. clerk-android's AuthView takes onDismiss directly and the bridge already passes it.

I checked this with the verify skill from #10053, which is where the spec that caught it lives. Its dismiss test taps the X and waits for the fixture to go back to its home screen, and it passes on iOS and Android with this change. The iOS run was repeated against the 1.5.9 pin. That spec still carries a known-bug tag on #10053, and removing the tag is a follow-up there. This PR does not depend on it. The complete spec, which signs in through the form, was not run.

Before, on iOS. The spec taps the X at the end and the view stays:

before-ios.mp4

After, on iOS:

after-ios.mp4

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

@mikepitre
mikepitre requested a review from wobsoriano October 5, 2026 20:54
@vercel

vercel Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
clerk-js-sandbox Ready Ready Preview Oct 6, 2026 4:34pm UTC
swingset Ready Ready Preview Oct 6, 2026 4:34pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository YAML (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Team
  • Run ID: 5fa798c3-da9f-4e03-a32d-d662cb6a9eb6
📥 Commits

Reviewing files that changed from the base of the PR and between 3413ff0 and 96d8308.

📒 Files selected for processing (2)
  • .changeset/expo-inline-auth-view-dismiss.md
  • packages/expo/ios/ClerkNativeBridge.swift
🔗 Linked repositories identified

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

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.


📝 Walkthrough

Walkthrough

On iOS, makeAuthViewController now creates a dismiss callback when dismissible is true and passes it to both the hosting controller and the inline auth wrapper. The wrapper exposes the callback to the auth view through clerkHostDismissAction. A patch changeset describes the inline <AuthView /> dismissal fix.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~8 minutes

Merge Risk: ⚪ Minimal · up to 96d83

The change is intended to let iOS inline auth dismissals reach the host. Available evidence identifies no specific remaining merge blocker.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the iOS inline AuthView close-button fix and the onDismiss behavior.
Description check ✅ Passed The description explains the inline AuthView dismissal bug, the iOS bridge fix, and the reported verification results.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@changeset-bot

changeset-bot Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 96d8308

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 Patch

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

… on iOS

A dismissible AuthView that is rendered inline is not presented, so
SwiftUI's dismiss had nothing to close and the bridge never heard about
the tap. Pass clerk-ios a host dismiss action that emits the dismissed
event.

The podspec pins the clerk-ios commit that adds the action until a
release contains it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mikepitre
mikepitre force-pushed the mike/expo-inline-auth-dismiss branch from d07fde1 to 108670d Compare October 5, 2026 21:04
@mikepitre
mikepitre changed the base branch from mike/expo-verify-skill to main October 5, 2026 21:04
@pkg-pr-new

pkg-pr-new Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/electron

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

@clerk/electron-passkeys

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

@clerk/eslint-plugin

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

@clerk/expo

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

@clerk/expo-biometrics

npm i https://pkg.pr.new/@clerk/expo-biometrics@10079

@clerk/expo-google-signin

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

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

@clerk/localizations

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

@clerk/mosaic

npm i https://pkg.pr.new/@clerk/mosaic@10079

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: 96d8308

mikepitre and others added 2 commits October 6, 2026 12:28
1.5.9 contains the host dismiss action, and main already pins it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-10-06T17:41:34.721Z

Summary

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

No API Changes Detected

All packages have stable APIs with no detected changes.


Report generated by Break Check

Last ran on 96d8308.

@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.

looks good!

@mikepitre
mikepitre merged commit 18297a5 into main Oct 6, 2026
104 checks passed
@mikepitre
mikepitre deleted the mike/expo-inline-auth-dismiss branch October 6, 2026 18:03

This branch was successfully deployed

2 active deployments
Preview – swingset — 96d8308e Deployed Oct 6, 2026 by vercel[bot]
Preview – clerk-js-sandbox — 96d8308e Deployed Oct 6, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants