UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 12.7 kB
{"version":3,"file":"index.cjs","sources":["../../../../../src/components/auth/common/index.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Common Auth Components Index\n *\n * Main entry point for common authentication components shared across\n * different auth flows. Exports all utilities and shared components.\n */\n\nimport ErrorBoundary, {\n ApiErrorBoundary,\n AuthErrorBoundary,\n type ErrorBoundaryProps,\n FormErrorBoundary,\n withErrorBoundary\n} from './error-boundary';\nimport LoadingSpinner, {LoadingButton, LoadingProvider, type LoadingSpinnerProps} from './loading-spinner';\nimport MagicLink, {MagicLinkVerification} from './magic-link';\nimport OAuthButtons, {OAuthDivider} from './oauth-buttons';\nimport RedirectHandler from './redirect-handler';\n\n// ============================================================================\n// Loading Components\n// ============================================================================\n\nexport {\n LoadingSpinner,\n LoadingButton,\n LoadingProvider,\n useLoading,\n LoadingStates,\n type LoadingSpinnerProps,\n type LoadingButtonProps,\n} from './loading-spinner';\n\n// ============================================================================\n// Error Handling Components\n// ============================================================================\n\nexport {\n ErrorBoundary,\n AuthErrorBoundary,\n FormErrorBoundary,\n ApiErrorBoundary,\n withErrorBoundary,\n useAsyncError,\n type ErrorBoundaryProps,\n type ErrorFallbackProps,\n} from './error-boundary';\n\n// ============================================================================\n// Redirect Handling Components\n// ============================================================================\n\nexport {\n RedirectHandler,\n useRedirectHandler,\n type RedirectHandlerProps,\n} from './redirect-handler';\n\n// ============================================================================\n// OAuth Components\n// ============================================================================\n\nexport {\n OAuthButtons,\n OAuthDivider,\n type OAuthButtonsProps,\n} from './oauth-buttons';\n\n// ============================================================================\n// Magic Link Components\n// ============================================================================\n\nexport {\n MagicLink,\n MagicLinkVerification,\n type MagicLinkProps,\n type MagicLinkVerificationProps,\n} from './magic-link';\n\n// ============================================================================\n// Verification Components\n// ============================================================================\n\nexport * from './verification';\n\n// ============================================================================\n// Component Collections\n// ============================================================================\n\n/**\n * Collection of all common authentication components\n */\nexport const CommonAuthComponents = {\n LoadingSpinner,\n LoadingButton,\n ErrorBoundary,\n RedirectHandler,\n OAuthButtons,\n OAuthDivider,\n MagicLink,\n MagicLinkVerification,\n} as const;\n\n/**\n * Collection of loading-related components\n */\nexport const LoadingComponents = {\n LoadingSpinner,\n LoadingButton,\n LoadingProvider,\n} as const;\n\n/**\n * Collection of error handling components\n */\nexport const ErrorComponents = {\n ErrorBoundary,\n AuthErrorBoundary,\n FormErrorBoundary,\n ApiErrorBoundary,\n} as const;\n\n/**\n * Collection of OAuth-related components\n */\nexport const OAuthComponents = {\n OAuthButtons,\n OAuthDivider,\n} as const;\n\n/**\n * Collection of magic link components\n */\nexport const MagicLinkComponents = {\n MagicLink,\n MagicLinkVerification,\n} as const;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Common authentication states\n */\nexport const AuthStates = {\n LOADING: 'loading',\n SUCCESS: 'success',\n ERROR: 'error',\n IDLE: 'idle',\n PROCESSING: 'processing',\n VERIFYING: 'verifying',\n REDIRECTING: 'redirecting',\n} as const;\n\n/**\n * Authentication error types\n */\nexport const AuthErrorTypes = {\n NETWORK_ERROR: 'network_error',\n AUTHENTICATION_ERROR: 'authentication_error',\n AUTHORIZATION_ERROR: 'authorization_error',\n VALIDATION_ERROR: 'validation_error',\n TIMEOUT_ERROR: 'timeout_error',\n UNKNOWN_ERROR: 'unknown_error',\n} as const;\n\n/**\n * Redirect types for authentication flows\n */\nexport const RedirectTypes = {\n OAUTH: 'oauth',\n MAGIC_LINK: 'magic-link',\n INVITATION: 'invitation',\n VERIFICATION: 'verification',\n ERROR: 'error',\n} as const;\n\n// ============================================================================\n// Higher-Order Components\n// ============================================================================\n\n/**\n * HOC to wrap components with loading state\n */\nexport function withLoading<P extends object>(\n Component: React.ComponentType<P>,\n loadingProps?: Partial<LoadingSpinnerProps>\n) {\n const WithLoadingComponent = (props: P & { isLoading?: boolean }) => {\n const { isLoading, ...componentProps } = props;\n\n if (isLoading) {\n return <LoadingSpinner {...loadingProps} />;\n }\n\n return <Component {...(componentProps as P)} />;\n };\n\n WithLoadingComponent.displayName = `withLoading(${Component.displayName || Component.name})`;\n\n return WithLoadingComponent;\n}\n\n/**\n * HOC to wrap components with auth error boundary\n */\nexport function withAuthErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Partial<ErrorBoundaryProps>\n) {\n return withErrorBoundary(Component, {\n title: 'Authentication Error',\n subtitle: 'There was a problem with the authentication process.',\n showDetails: process.env.NODE_ENV === 'development',\n ...errorBoundaryProps,\n });\n}\n\n// ============================================================================\n// Auth Flow Utilities\n// ============================================================================\n\n/**\n * Utility to determine if current page is an auth redirect\n */\nexport function isAuthRedirect(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const hash = new URLSearchParams(window.location.hash.slice(1));\n\n // Check for OAuth callback parameters\n if (params.has('code') || hash.has('code')) return true;\n\n // Check for magic link parameters\n if (params.has('token') || hash.has('token')) return true;\n\n // Check for invitation parameters\n if (params.has('invitation_token') || params.has('invite')) return true;\n\n // Check for error parameters\n if (params.has('error') || hash.has('error')) return true;\n\n return false;\n}\n\n/**\n * Utility to extract auth parameters from URL\n */\nexport function getAuthParams(): Record<string, string> {\n if (typeof window === 'undefined') return {};\n\n const params = new URLSearchParams(window.location.search);\n const hash = new URLSearchParams(window.location.hash.slice(1));\n\n const authParams: Record<string, string> = {};\n\n // Merge query params and hash params\n [...params.entries(), ...hash.entries()].forEach(([key, value]) => {\n authParams[key] = value;\n });\n\n return authParams;\n}\n\n/**\n * Utility to clean auth parameters from URL\n */\nexport function cleanAuthParams(): void {\n if (typeof window === 'undefined') return;\n\n const authParamKeys = [\n 'code', 'state', 'error', 'error_description', 'token', 'type',\n 'invitation_token', 'invite', 'verification_token', 'verify'\n ];\n\n const params = new URLSearchParams(window.location.search);\n let hasAuthParams = false;\n\n authParamKeys.forEach(key => {\n if (params.has(key)) {\n params.delete(key);\n hasAuthParams = true;\n }\n });\n\n if (hasAuthParams) {\n const newUrl = params.toString()\n ? `${window.location.pathname}?${params.toString()}`\n : window.location.pathname;\n\n window.history.replaceState({}, document.title, newUrl);\n }\n\n // Clean hash parameters\n if (window.location.hash) {\n const hashParams = new URLSearchParams(window.location.hash.slice(1));\n let hasHashAuthParams = false;\n\n authParamKeys.forEach(key => {\n if (hashParams.has(key)) {\n hashParams.delete(key);\n hasHashAuthParams = true;\n }\n });\n\n if (hasHashAuthParams) {\n const newHash = hashParams.toString() ? `#${hashParams.toString()}` : '';\n window.history.replaceState({}, document.title, window.location.pathname + window.location.search + newHash);\n }\n }\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default CommonAuthComponents;"],"names":["CommonAuthComponents","LoadingSpinner","LoadingButton","ErrorBoundary","RedirectHandler","OAuthButtons","OAuthDivider","MagicLink","MagicLinkVerification","LoadingComponents","LoadingProvider","ErrorComponents","AuthErrorBoundary","FormErrorBoundary","ApiErrorBoundary","OAuthComponents","MagicLinkComponents","AuthStates","AuthErrorTypes","RedirectTypes","withLoading","Component","loadingProps","WithLoadingComponent","props","isLoading","componentProps","jsx","withAuthErrorBoundary","errorBoundaryProps","withErrorBoundary","isAuthRedirect","params","hash","getAuthParams","authParams","key","value","cleanAuthParams","authParamKeys","hasAuthParams","newUrl","hashParams","hasHashAuthParams","newHash"],"mappings":"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"}