The <UserProfileView /> component renders a fully native profile management interface using SwiftUI on iOS and Jetpack Compose on Android. It allows users to manage:
There are three ways to render the profile view in an Expo app:
Native modal (recommended): Use the useUserProfileModal() hook to present the profile view as a native modal (SwiftUI/Jetpack Compose). This uses a native X button for dismissal.
React Native Modal: Wrap the inline <UserProfileView /> in a React Native <Modal> component. You must provide your own close button to dismiss the modal.
Inline: Render <UserProfileView /> directly in your layout without a modal.
If you need to react to sign-out, use useAuth() inside a useEffect.
Use the following tabs to select your preferred approach.
Using Native modal (recommended)
Using a React Native Modal
Inline
The useUserProfileModal() hook provides an imperative presentUserProfile() function that opens the native profile modal directly from a button press. No component is needed.
Opens the native profile modal. The promise resolves when the modal is dismissed. If the user signs out from within the modal, the JS SDK session is automatically cleared.
Name
isAvailable
Type
boolean
Description
Whether the native module supports presenting the profile modal. Returns false on web or when the @clerk/expo plugin is not installed.
A list of sessions that have been registered on the client device.
When rendering inside a React Native <Modal>, ensure isDismissable is set to false (the default) and provide your own close button to dismiss the modal.
Important
Do not use useUserProfileModal() when rendering inside a React Native <Modal>. The native modal system and React Native Modal are separate presentation layers and cannot coordinate dismissal. Use one approach or the other, not both.
Whether the inline profile view can be dismissed by the user. When true, a dismiss button appears. This does not present a modal — to present a native modal, use the useUserProfileModal() hook instead. Defaults to false.
Important
Do not set isDismissable={true} when rendering inside a React Native <Modal>. The native dismiss button relies on SwiftUI (iOS) or Jetpack Compose (Android) to close the view, which cannot dismiss a React Native <Modal>. Tapping the native dismiss button will not close the modal and may leave the screen unresponsive.