@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 28.8 kB
Source Map (JSON)
{"version":3,"file":"use-oauth.cjs","sources":["../../../src/hooks/use-oauth.ts"],"sourcesContent":["'use client'\n\n\n/**\n * @frank-auth/react - useOAuth Hook\n *\n * OAuth authentication hook that provides integration with multiple OAuth providers\n * including Google, Microsoft, GitHub, and other social authentication services.\n */\n\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport type {AuthProvider, SSOCallbackRequest, SSOLoginRequest,} from '@frank-auth/client';\n\nimport {useAuth} from './use-auth';\nimport {useConfig} from '../provider/config-provider';\n\nimport type {AuthError} from '../provider/types';\n\n// ============================================================================\n// OAuth Hook Interface\n// ============================================================================\n\nexport interface UseOAuthReturn {\n // OAuth state\n providers: AuthProvider[];\n isLoading: boolean;\n error: AuthError | null;\n\n // OAuth authentication\n signInWithProvider: (provider: string, options?: OAuthSignInOptions) => Promise<void>;\n handleCallback: (provider: string, code?: string, state?: string) => Promise<OAuthCallbackResult>;\n\n // Provider management\n connectProvider: (provider: string, options?: OAuthConnectOptions) => Promise<void>;\n disconnectProvider: (provider: string) => Promise<void>;\n\n // Provider information\n isProviderConnected: (provider: string) => boolean;\n getProviderInfo: (provider: string) => AuthProvider | null;\n\n // Common providers\n signInWithGoogle: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithMicrosoft: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithGitHub: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithApple: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithFacebook: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithTwitter: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithLinkedIn: (options?: OAuthSignInOptions) => Promise<void>;\n signInWithDiscord: (options?: OAuthSignInOptions) => Promise<void>;\n\n // Utility methods\n refreshProviders: () => Promise<void>;\n getAuthUrl: (provider: string, options?: OAuthSignInOptions) => Promise<string>;\n}\n\nexport interface OAuthSignInOptions {\n redirectUrl?: string;\n scopes?: string[];\n state?: string;\n prompt?: 'none' | 'consent' | 'select_account';\n organizationId?: string;\n connection?: string;\n}\n\nexport interface OAuthConnectOptions {\n redirectUrl?: string;\n scopes?: string[];\n state?: string;\n}\n\nexport interface OAuthCallbackResult {\n success: boolean;\n user?: any;\n session?: any;\n error?: string;\n}\n\n// ============================================================================\n// OAuth Provider Configurations\n// ============================================================================\n\nexport const OAUTH_PROVIDERS = {\n google: {\n name: 'Google',\n displayName: 'Google',\n icon: '🔴',\n color: '#4285f4',\n defaultScopes: ['openid', 'profile', 'email'],\n },\n microsoft: {\n name: 'Microsoft',\n displayName: 'Microsoft',\n icon: '🟦',\n color: '#00a1f1',\n defaultScopes: ['openid', 'profile', 'email'],\n },\n github: {\n name: 'GitHub',\n displayName: 'GitHub',\n icon: '⚫',\n color: '#333333',\n defaultScopes: ['user:email'],\n },\n apple: {\n name: 'Apple',\n displayName: 'Apple',\n icon: '🍎',\n color: '#000000',\n defaultScopes: ['name', 'email'],\n },\n facebook: {\n name: 'Facebook',\n displayName: 'Facebook',\n icon: '🔵',\n color: '#1877f2',\n defaultScopes: ['email', 'public_profile'],\n },\n twitter: {\n name: 'Twitter',\n displayName: 'Twitter',\n icon: '🐦',\n color: '#1da1f2',\n defaultScopes: ['users.read', 'tweet.read'],\n },\n linkedin: {\n name: 'LinkedIn',\n displayName: 'LinkedIn',\n icon: '🔵',\n color: '#0077b5',\n defaultScopes: ['r_liteprofile', 'r_emailaddress'],\n },\n discord: {\n name: 'Discord',\n displayName: 'Discord',\n icon: '🎮',\n color: '#5865f2',\n defaultScopes: ['identify', 'email'],\n },\n} as const;\n\nexport type OAuthProviderType = keyof typeof OAUTH_PROVIDERS;\n\n// ============================================================================\n// Main useOAuth Hook\n// ============================================================================\n\n/**\n * OAuth authentication hook providing integration with multiple providers\n *\n * @example Basic OAuth sign-in\n * ```tsx\n * import { useOAuth } from '@frank-auth/react';\n *\n * function OAuthSignIn() {\n * const {\n * providers,\n * signInWithGoogle,\n * signInWithGitHub,\n * signInWithProvider,\n * isLoading\n * } = useOAuth();\n *\n * return (\n * <div>\n * <h3>Sign in with</h3>\n * <button\n * onClick={() => signInWithGoogle()}\n * disabled={isLoading}\n * >\n * Continue with Google\n * </button>\n * <button\n * onClick={() => signInWithGitHub()}\n * disabled={isLoading}\n * >\n * Continue with GitHub\n * </button>\n *\n * {providers.map(provider => (\n * <button\n * key={provider.name}\n * onClick={() => signInWithProvider(provider.name)}\n * disabled={isLoading}\n * >\n * Continue with {provider.displayName}\n * </button>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @example OAuth callback handling\n * ```tsx\n * import { useEffect } from 'react';\n * import { useOAuth } from '@frank-auth/react';\n * import { useSearchParams } from 'react-router-dom';\n *\n * function OAuthCallback() {\n * const { handleCallback } = useOAuth();\n * const [searchParams] = useSearchParams();\n *\n * useEffect(() => {\n * const code = searchParams.get('code');\n * const state = searchParams.get('state');\n * const provider = searchParams.get('provider') || 'google';\n *\n * if (code) {\n * handleCallback(provider, code, state)\n * .then(result => {\n * if (result.success) {\n * console.log('OAuth sign-in successful:', result.user);\n * // Redirect to dashboard or handle success\n * } else {\n * console.error('OAuth sign-in failed:', result.error);\n * }\n * })\n * .catch(error => {\n * console.error('OAuth callback error:', error);\n * });\n * }\n * }, [handleCallback, searchParams]);\n *\n * return <div>Processing OAuth callback...</div>;\n * }\n * ```\n *\n * @example Provider connection management\n * ```tsx\n * function ConnectedAccounts() {\n * const {\n * providers,\n * isProviderConnected,\n * connectProvider,\n * disconnectProvider\n * } = useOAuth();\n *\n * return (\n * <div>\n * <h3>Connected Accounts</h3>\n * {providers.map(provider => {\n * const isConnected = isProviderConnected(provider.name);\n *\n * return (\n * <div key={provider.name}>\n * <span>{provider.displayName}</span>\n * {isConnected ? (\n * <button onClick={() => disconnectProvider(provider.name)}>\n * Disconnect\n * </button>\n * ) : (\n * <button onClick={() => connectProvider(provider.name)}>\n * Connect\n * </button>\n * )}\n * </div>\n * );\n * })}\n * </div>\n * );\n * }\n * ```\n */\nexport function useOAuth(): UseOAuthReturn {\n const {user, activeOrganization, reload, sdk} = useAuth();\n const {features} = useConfig();\n\n const [providers, setProviders] = useState<AuthProvider[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // Check if OAuth is available\n const isOAuthAvailable = useMemo(() => features.oauth, [features.oauth]);\n\n // Error handler\n const handleError = useCallback((err: any) => {\n const authError: AuthError = {\n code: err.code || 'UNKNOWN_ERROR',\n message: err.message || 'An unknown error occurred',\n details: err.details,\n field: err.field,\n };\n setError(authError);\n throw authError;\n }, []);\n\n // Load available OAuth providers\n const loadProviders = useCallback(async () => {\n if (!isOAuthAvailable) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n const providersList = await sdk.auth.getOAuthProviders();\n setProviders(providersList);\n } catch (err) {\n console.error('Failed to load OAuth providers:', err);\n setError({\n code: 'OAUTH_PROVIDERS_LOAD_FAILED',\n message: 'Failed to load OAuth providers',\n });\n } finally {\n setIsLoading(false);\n }\n }, [sdk.auth, isOAuthAvailable]);\n\n useEffect(() => {\n loadProviders();\n }, [loadProviders]);\n\n // Generate OAuth authentication URL\n const getAuthUrl = useCallback(async (provider: string, options?: OAuthSignInOptions): Promise<string> => {\n if (!isOAuthAvailable) throw new Error('OAuth not available');\n\n try {\n const ssoLoginRequest: SSOLoginRequest = {\n provider,\n redirectUrl: options?.redirectUrl || `${window.location.origin}/auth/callback`,\n scopes: options?.scopes,\n state: options?.state,\n prompt: options?.prompt,\n organizationId: options?.organizationId || activeOrganization?.id,\n connection: options?.connection,\n };\n\n const response = await sdk.auth.initiateSSOLogin(ssoLoginRequest);\n return response.authUrl;\n } catch (err) {\n handleError(err);\n return '';\n }\n }, [sdk.auth, isOAuthAvailable, activeOrganization, handleError]);\n\n // Sign in with OAuth provider\n const signInWithProvider = useCallback(async (provider: string, options?: OAuthSignInOptions): Promise<void> => {\n if (!isOAuthAvailable) throw new Error('OAuth not available');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const authUrl = await getAuthUrl(provider, options);\n\n // Redirect to OAuth provider\n window.location.href = authUrl;\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [getAuthUrl, isOAuthAvailable, handleError]);\n\n // Handle OAuth callback\n const handleCallback = useCallback(async (\n provider: string,\n code?: string,\n state?: string\n ): Promise<OAuthCallbackResult> => {\n if (!isOAuthAvailable) throw new Error('OAuth not available');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const callbackRequest: SSOCallbackRequest = {\n provider,\n code: code || new URLSearchParams(window.location.search).get('code') || '',\n state: state || new URLSearchParams(window.location.search).get('state') || '',\n };\n\n const response = await sdk.auth.handleSSOCallback(callbackRequest);\n\n if (response.success) {\n // Reload user data\n await reload();\n\n return {\n success: true,\n user: response.user,\n session: response.session,\n };\n } else {\n return {\n success: false,\n error: response.error || 'OAuth authentication failed',\n };\n }\n } catch (err) {\n return {\n success: false,\n error: err.message || 'OAuth callback failed',\n };\n } finally {\n setIsLoading(false);\n }\n }, [sdk.auth, isOAuthAvailable, reload]);\n\n // Connect OAuth provider to existing account\n const connectProvider = useCallback(async (provider: string, options?: OAuthConnectOptions): Promise<void> => {\n if (!user) throw new Error('User not authenticated');\n if (!isOAuthAvailable) throw new Error('OAuth not available');\n\n try {\n setIsLoading(true);\n setError(null);\n\n const authUrl = await getAuthUrl(provider, {\n ...options,\n state: `connect:${provider}:${user.id}`,\n });\n\n // Redirect to OAuth provider for connection\n window.location.href = authUrl;\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [user, getAuthUrl, isOAuthAvailable, handleError]);\n\n // Disconnect OAuth provider\n const disconnectProvider = useCallback(async (provider: string): Promise<void> => {\n if (!user) throw new Error('User not authenticated');\n if (!isOAuthAvailable) throw new Error('OAuth not available');\n\n try {\n setIsLoading(true);\n setError(null);\n\n await sdk.auth.disconnectOAuthProvider(provider);\n\n // Reload user data\n await reload();\n } catch (err) {\n handleError(err);\n } finally {\n setIsLoading(false);\n }\n }, [sdk.auth, user, isOAuthAvailable, reload, handleError]);\n\n // Check if provider is connected\n const isProviderConnected = useCallback((provider: string): boolean => {\n if (!user?.connectedAccounts) return false;\n return user.connectedAccounts.some((account: any) => account.provider === provider);\n }, [user]);\n\n // Get provider information\n const getProviderInfo = useCallback((provider: string): AuthProvider | null => {\n return providers.find(p => p.name === provider) || null;\n }, [providers]);\n\n // Common provider sign-in methods\n const signInWithGoogle = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('google', {\n scopes: OAUTH_PROVIDERS.google.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithMicrosoft = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('microsoft', {\n scopes: OAUTH_PROVIDERS.microsoft.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithGitHub = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('github', {\n scopes: OAUTH_PROVIDERS.github.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithApple = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('apple', {\n scopes: OAUTH_PROVIDERS.apple.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithFacebook = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('facebook', {\n scopes: OAUTH_PROVIDERS.facebook.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithTwitter = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('twitter', {\n scopes: OAUTH_PROVIDERS.twitter.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithLinkedIn = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('linkedin', {\n scopes: OAUTH_PROVIDERS.linkedin.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n const signInWithDiscord = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider('discord', {\n scopes: OAUTH_PROVIDERS.discord.defaultScopes,\n ...options,\n });\n }, [signInWithProvider]);\n\n // Refresh providers\n const refreshProviders = useCallback(async (): Promise<void> => {\n await loadProviders();\n }, [loadProviders]);\n\n return {\n // OAuth state\n providers,\n isLoading,\n error,\n\n // OAuth authentication\n signInWithProvider,\n handleCallback,\n\n // Provider management\n connectProvider,\n disconnectProvider,\n\n // Provider information\n isProviderConnected,\n getProviderInfo,\n\n // Common providers\n signInWithGoogle,\n signInWithMicrosoft,\n signInWithGitHub,\n signInWithApple,\n signInWithFacebook,\n signInWithTwitter,\n signInWithLinkedIn,\n signInWithDiscord,\n\n // Utility methods\n refreshProviders,\n getAuthUrl,\n };\n}\n\n// ============================================================================\n// Specialized OAuth Hooks\n// ============================================================================\n\n/**\n * Hook for specific OAuth provider\n */\nexport function useOAuthProvider(providerName: OAuthProviderType) {\n const {\n signInWithProvider,\n connectProvider,\n disconnectProvider,\n isProviderConnected,\n getProviderInfo,\n isLoading,\n error,\n } = useOAuth();\n\n const provider = useMemo(() => OAUTH_PROVIDERS[providerName], [providerName]);\n const providerInfo = useMemo(() => getProviderInfo(providerName), [getProviderInfo, providerName]);\n const isConnected = useMemo(() => isProviderConnected(providerName), [isProviderConnected, providerName]);\n\n const signIn = useCallback((options?: OAuthSignInOptions) => {\n return signInWithProvider(providerName, {\n scopes: provider.defaultScopes,\n ...options,\n });\n }, [signInWithProvider, providerName, provider.defaultScopes]);\n\n const connect = useCallback((options?: OAuthConnectOptions) => {\n return connectProvider(providerName, options);\n }, [connectProvider, providerName]);\n\n const disconnect = useCallback(() => {\n return disconnectProvider(providerName);\n }, [disconnectProvider, providerName]);\n\n return {\n provider,\n providerInfo,\n isConnected,\n signIn,\n connect,\n disconnect,\n isLoading,\n error,\n isEnabled: !!providerInfo?.enabled,\n };\n}\n\n/**\n * Hook for OAuth callback handling\n */\nexport function useOAuthCallback() {\n const {handleCallback} = useOAuth();\n const [callbackState, setCallbackState] = useState<'idle' | 'processing' | 'success' | 'error'>('idle');\n const [callbackResult, setCallbackResult] = useState<OAuthCallbackResult | null>(null);\n\n const processCallback = useCallback(async (\n provider?: string,\n code?: string,\n state?: string\n ) => {\n // Extract from URL if not provided\n const urlParams = new URLSearchParams(window.location.search);\n const callbackProvider = provider || urlParams.get('provider') || 'google';\n const callbackCode = code || urlParams.get('code') || '';\n const callbackState = state || urlParams.get('state') || '';\n\n if (!callbackCode) {\n setCallbackState('error');\n setCallbackResult({\n success: false,\n error: 'No authorization code received',\n });\n return;\n }\n\n try {\n setCallbackState('processing');\n const result = await handleCallback(callbackProvider, callbackCode, callbackState);\n\n setCallbackResult(result);\n setCallbackState(result.success ? 'success' : 'error');\n\n return result;\n } catch (error) {\n const errorResult = {\n success: false,\n error: error.message || 'OAuth callback failed',\n };\n\n setCallbackResult(errorResult);\n setCallbackState('error');\n\n return errorResult;\n }\n }, [handleCallback]);\n\n return {\n processCallback,\n state: callbackState,\n result: callbackResult,\n isProcessing: callbackState === 'processing',\n isSuccess: callbackState === 'success',\n isError: callbackState === 'error',\n };\n}\n"],"names":["OAUTH_PROVIDERS","useOAuth","user","activeOrganization","reload","sdk","useAuth","features","useConfig","providers","setProviders","useState","isLoading","setIsLoading","error","setError","isOAuthAvailable","useMemo","handleError","useCallback","err","authError","loadProviders","providersList","useEffect","getAuthUrl","provider","options","ssoLoginRequest","signInWithProvider","authUrl","handleCallback","code","state","callbackRequest","response","connectProvider","disconnectProvider","isProviderConnected","account","getProviderInfo","p","signInWithGoogle","signInWithMicrosoft","signInWithGitHub","signInWithApple","signInWithFacebook","signInWithTwitter","signInWithLinkedIn","signInWithDiscord","refreshProviders","useOAuthProvider","providerName","providerInfo","isConnected","signIn","connect","disconnect","useOAuthCallback","callbackState","setCallbackState","callbackResult","setCallbackResult","urlParams","callbackProvider","callbackCode","result","errorResult"],"mappings":"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"}