Skip to main content

Overview

Crossmint React Providers wrap your application to provide authentication state, wallet functionality, and SDK configuration to all child components.

Installation

npm install @crossmint/client-sdk-react-ui

CrossmintProvider

Root provider that initializes the Crossmint SDK. Required for all other Crossmint components and hooks.

Usage

import { CrossmintProvider } from '@crossmint/client-sdk-react-ui';

function App() {
  return (
    <CrossmintProvider apiKey="your-api-key">
      {/* Your app */}
    </CrossmintProvider>
  );
}

Props

apiKey
string
required
Your Crossmint API key from the Developer Console
consoleLogLevel
ConsoleLogLevel
default:"debug"
Minimum log level for console outputExample:
// Suppress all console logs
<CrossmintProvider apiKey="..." consoleLogLevel="silent" />

// Show only warnings and errors
<CrossmintProvider apiKey="..." consoleLogLevel="warn" />
children
ReactNode
required
Your application components

Context Value

Provides access via useCrossmint() hook:
import { useCrossmint } from '@crossmint/client-sdk-react-ui';

function MyComponent() {
  const { crossmint } = useCrossmint();
  console.log(crossmint.apiKey);
}

CrossmintAuthProvider

Provides authentication state and UI. Must be nested inside CrossmintProvider.

Usage

import { 
  CrossmintProvider, 
  CrossmintAuthProvider 
} from '@crossmint/client-sdk-react-ui';

function App() {
  return (
    <CrossmintProvider apiKey="your-api-key">
      <CrossmintAuthProvider
        loginMethods={['email', 'google', 'farcaster']}
        appearance={{
          colors: {
            accent: '#4F46E5',
            textPrimary: '#000000'
          }
        }}
        onLoginSuccess={() => console.log('Login successful!')}
      >
        {/* Your app */}
      </CrossmintAuthProvider>
    </CrossmintProvider>
  );
}

Props

loginMethods
LoginMethod[]
default:"['email', 'google']"
Authentication methods to enableExample:
loginMethods={['email', 'google', 'web3-injected']}
appearance
UIConfig
Customize authentication UI appearance
authModalTitle
string
default:"Sign in to Crossmint"
Title displayed in the authentication modal
termsOfServiceText
string | ReactNode
Terms of service text displayed at the bottom of the auth form. Supports HTML/JSX.Example:
termsOfServiceText={
  <p>
    By signing in, you agree to our{' '}
    <a href="https://example.com/terms">Terms of Service</a> and{' '}
    <a href="https://example.com/privacy">Privacy Policy</a>
  </p>
}
prefetchOAuthUrls
boolean
default:true
Prefetch OAuth URLs for faster login. Set to false to reduce initial load.
onLoginSuccess
() => void
Callback invoked after successful loginExample:
onLoginSuccess={() => {
  router.push('/dashboard');
  toast.success('Welcome back!');
}}
refreshRoute
string
Custom server endpoint for refreshing authentication tokens. Required for server-side cookie management.Example (Next.js):
refreshRoute="/api/auth/refresh"
logoutRoute
string
Custom server endpoint for handling logout. Required for server-side cookie management.Example (Next.js):
logoutRoute="/api/auth/logout"
children
ReactNode
required
Your application components

Context Value

Provides access via useCrossmintAuth() hook:
import { useCrossmintAuth } from '@crossmint/client-sdk-react-ui';

function MyComponent() {
  const { user, jwt, status, login, logout } = useCrossmintAuth();
  
  if (status === 'logged-out') {
    return <button onClick={() => login()}>Sign In</button>;
  }
  
  return <p>Welcome, {user?.email}</p>;
}

CrossmintWalletProvider

Provides smart wallet functionality including creation, transactions, and signer management. Must be nested inside CrossmintAuthProvider.

Usage

import { 
  CrossmintProvider, 
  CrossmintAuthProvider,
  CrossmintWalletProvider 
} from '@crossmint/client-sdk-react-ui';

function App() {
  return (
    <CrossmintProvider apiKey="your-api-key">
      <CrossmintAuthProvider loginMethods={['email', 'google']}>
        <CrossmintWalletProvider
          createOnLogin="all-users"
          callbacks={{
            onWalletCreationStart: async () => {
              console.log('Creating wallet...');
            },
            onTransactionStart: async () => {
              console.log('Transaction starting...');
            }
          }}
        >
          {/* Your app */}
        </CrossmintWalletProvider>
      </CrossmintAuthProvider>
    </CrossmintProvider>
  );
}

Props

createOnLogin
CreateOnLogin
Automatic wallet creation strategyExample:
// Create EVM and Solana wallets
createOnLogin={{ chains: ["evm", "solana"] }}

// Create only EVM wallets
createOnLogin="evm-only"
appearance
UIConfig
Customize wallet UI components (same structure as CrossmintAuthProvider)
showPasskeyHelpers
boolean
default:true
Show passkey helper UI for wallet security
callbacks
object
Lifecycle callbacks for wallet operations
children
ReactNode
required
Your application components

Context Value

Provides wallet functionality through the Crossmint SDK:
import { useCrossmint } from '@crossmint/client-sdk-react-ui';

function WalletComponent() {
  const { crossmint } = useCrossmint();
  
  const createWallet = async () => {
    const wallet = await crossmint.wallets.create({
      chain: 'ethereum'
    });
    console.log('Wallet created:', wallet.address);
  };
  
  return <button onClick={createWallet}>Create Wallet</button>;
}

Complete Provider Stack

Typical provider hierarchy for a full-featured application:
import {
  CrossmintProvider,
  CrossmintAuthProvider,
  CrossmintWalletProvider,
  useCrossmintAuth
} from '@crossmint/client-sdk-react-ui';

function App() {
  return (
    <CrossmintProvider 
      apiKey={process.env.NEXT_PUBLIC_CROSSMINT_API_KEY}
      consoleLogLevel="warn"
    >
      <CrossmintAuthProvider
        loginMethods={['email', 'google', 'farcaster', 'web3-injected']}
        appearance={{
          colors: {
            accent: '#4F46E5',
            textPrimary: '#111827',
            textSecondary: '#6B7280'
          },
          fontFamily: "'Inter', sans-serif"
        }}
        authModalTitle="Sign in to MyApp"
        termsOfServiceText={
          <p>
            By signing in, you agree to our{' '}
            <a href="https://example.com/terms">Terms</a>
          </p>
        }
        onLoginSuccess={() => {
          console.log('User logged in');
          router.push('/dashboard');
        }}
        refreshRoute="/api/auth/refresh"
        logoutRoute="/api/auth/logout"
      >
        <CrossmintWalletProvider
          createOnLogin={{ chains: ['evm', 'solana'] }}
          showPasskeyHelpers
          callbacks={{
            onWalletCreationStart: async () => {
              console.log('Creating wallet...');
            },
            onTransactionStart: async () => {
              console.log('Transaction starting...');
            }
          }}
        >
          <Dashboard />
        </CrossmintWalletProvider>
      </CrossmintAuthProvider>
    </CrossmintProvider>
  );
}

function Dashboard() {
  const { user, status, logout } = useCrossmintAuth();
  
  if (status === 'logged-out') {
    return <div>Please sign in</div>;
  }
  
  return (
    <div>
      <h1>Welcome, {user?.email}</h1>
      <button onClick={logout}>Sign Out</button>
    </div>
  );
}

Provider Requirements

  • CrossmintProvider is required for all Crossmint functionality
  • CrossmintAuthProvider is required for useCrossmintAuth() hook
  • CrossmintWalletProvider requires CrossmintAuthProvider to be present
  • Providers must be nested in the correct order:
<CrossmintProvider>
  <CrossmintAuthProvider>
    <CrossmintWalletProvider>
      {/* Your app */}
    </CrossmintWalletProvider>
  </CrossmintAuthProvider>
</CrossmintProvider>

Next.js Server-Side Authentication

For Next.js applications with server-side rendering, provide custom routes:
// app/layout.tsx
<CrossmintAuthProvider
  refreshRoute="/api/auth/refresh"
  logoutRoute="/api/auth/logout"
>
  {children}
</CrossmintAuthProvider>
// app/api/auth/refresh/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  // Implement token refresh logic
  // Set secure HTTP-only cookies
  return NextResponse.json({ success: true });
}
// app/api/auth/logout/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  // Clear authentication cookies
  const response = NextResponse.json({ success: true });
  response.cookies.delete('session');
  response.cookies.delete('refresh_token');
  return response;
}

Build docs developers (and LLMs) love