FeaturesAuthentication
PreviousNext

Retrieve User

Fetch and provide authenticated DB user data in native app flows.

What It Does

apps/mobile retrieves the authenticated user from TRPC (clientTrpc.getUser) and exposes it through UserProvider / useUser.

When To Use

  • You need DB-backed user fields in mobile screens.
  • You need onboarding/security gating based on completedOnboarding or profile data.

Prerequisites

  • Authenticated Supabase session available.
  • apps/dashboard API server reachable.

How To Use

Fetch DB user before rendering protected app stack.

apps/mobile/app/(app)/_layout.tsx
import { UserProvider } from '@kit/auth/shared/user';
import { clientTrpc } from '~/utils/trpc-client';
 
function DrawerApp() {
  const user = clientTrpc.getUser.useQuery();
 
  if (user.isPending) return <LoadingScreen />;
  if (!user.data) throw new Error('Failed to get db user');
 
  if (!user.data.completedOnboarding) {
    return <Redirect href={'/onboarding'} />;
  }
 
  return <UserProvider user={user.data}>{/* app stack */}</UserProvider>;
}

Read current user from context in child screens.

Screen component
import { useUser } from '@kit/auth/shared/user';
 
export function ProfileHeader() {
  const user = useUser();
  return <Text>{user.name}</Text>;
}

Use the same pattern in onboarding layout.

apps/mobile/app/onboarding/_layout.tsx performs clientTrpc.getUser.useQuery() then wraps onboarding routes with UserProvider.

MCP Context

capability: auth_mobile_user_access
entrypoints:
  - apps/mobile/app/(app)/_layout.tsx
  - apps/mobile/app/onboarding/_layout.tsx
  - apps/mobile/utils/trpc-client.ts
inputs:
  - authenticated_session
outputs:
  - db_user_context
constraints:
  - getUser query requires reachable dashboard TRPC endpoint
  - useUser must be called under UserProvider
side_effects:
  - route gating based on user fields

Agent Recipe

  1. Fetch user with clientTrpc.getUser.useQuery() in layout-level component.
  2. Handle pending/error states before rendering app routes.
  3. Wrap children with UserProvider and consume via useUser().

Troubleshooting

  • useUser throws: verify UserProvider wraps the current route subtree.
  • getUser is null: verify dashboard API URL and auth token forwarding.
  • Onboarding loop: verify completedOnboarding update path after onboarding submit.

How is this guide?

Last updated on 3/23/2026