UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 27.4 kB
{"version":3,"file":"config-provider.cjs","sources":["../../../src/provider/config-provider.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Config Provider\n *\n * Configuration provider that manages UI configuration, themes, localization,\n * and organization-specific settings for the authentication components.\n */\n\n'use client';\n\nimport type React from 'react';\nimport {createContext, useCallback, useContext, useEffect, useMemo, useReducer} from 'react';\n\nimport type {Organization, OrganizationSettings} from '@frank-auth/client';\n\nimport type {\n AppearanceConfig,\n ComponentOverrides,\n FrankAuthUIConfig,\n LocalizationConfig,\n OrganizationConfig,\n Theme,\n} from '../config';\nimport {ConfigManager, createFrankAuthConfig, defaultConfig, validateFrankAuthConfig,} from '../config';\n\nimport type {AuthFeatures, ConfigContextValue, ConfigProviderProps, ConfigState,} from './types';\n\n// ============================================================================\n// Config Context\n// ============================================================================\n\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\n// ============================================================================\n// Config Reducer\n// ============================================================================\n\ntype ConfigAction =\n | { type: 'SET_LOADED'; payload: boolean }\n | { type: 'SET_CONFIG'; payload: FrankAuthUIConfig }\n | { type: 'UPDATE_CONFIG'; payload: Partial<FrankAuthUIConfig> }\n | { type: 'SET_ORGANIZATION'; payload: OrganizationConfig }\n | { type: 'SET_ORGANIZATION_SETTINGS'; payload: OrganizationSettings }\n | { type: 'SET_THEME'; payload: Theme }\n | { type: 'SET_APPEARANCE'; payload: AppearanceConfig }\n | { type: 'SET_LOCALIZATION'; payload: LocalizationConfig }\n | { type: 'SET_COMPONENTS'; payload: ComponentOverrides }\n | { type: 'SET_FEATURES'; payload: AuthFeatures }\n | { type: 'SET_DEBUG'; payload: boolean }\n | { type: 'RESET_CONFIG' };\n\nfunction configReducer(state: ConfigState, action: ConfigAction): ConfigState {\n switch (action.type) {\n case 'SET_LOADED':\n return {...state, isLoaded: action.payload};\n\n case 'SET_CONFIG':\n return {\n ...state,\n config: action.payload,\n publishableKey: action.payload.publishableKey,\n secretKey: action.payload.secretKey,\n projectId: action.payload.projectId,\n userType: action.payload.userType,\n apiUrl: action.payload.apiUrl || state.apiUrl,\n theme: action.payload.theme || state.theme,\n appearance: action.payload.appearance || state.appearance,\n localization: action.payload.localization || state.localization,\n components: action.payload.components || state.components,\n linksPath: {...(state.linksPath ?? {}), ...action.payload.linksPath},\n features: action.payload.features || state.features,\n debug: action.payload.debug || state.debug,\n frontendUrl: action.payload.frontendUrl || state.frontendUrl,\n };\n\n case 'UPDATE_CONFIG':\n const updatedConfig = {...state.config, ...action.payload};\n return {\n ...state,\n config: updatedConfig,\n// secretKey: action.payload.secretKey,\n// projectId: action.payload.projectId,\n theme: action.payload.theme || state.theme,\n appearance: action.payload.appearance || state.appearance,\n localization: action.payload.localization || state.localization,\n components: action.payload.components || state.components,\n linksPath: {...(state.linksPath ?? {}), ...action.payload.linksPath},\n features: action.payload.features || state.features,\n debug: action.payload.debug !== undefined ? action.payload.debug : state.debug,\n frontendUrl: action.payload.frontendUrl || state.frontendUrl,\n };\n\n case 'SET_ORGANIZATION':\n return {\n ...state,\n organizationConfig: action.payload,\n config: {\n ...state.config,\n organization: action.payload,\n projectId: action.payload.id,\n },\n };\n\n case 'SET_ORGANIZATION_SETTINGS':\n return {\n ...state,\n organizationSettings: action.payload,\n };\n\n case 'SET_THEME':\n return {\n ...state,\n theme: action.payload,\n config: {\n ...state.config,\n theme: action.payload,\n },\n };\n\n case 'SET_APPEARANCE':\n return {\n ...state,\n appearance: action.payload,\n config: {\n ...state.config,\n appearance: action.payload,\n },\n };\n\n case 'SET_LOCALIZATION':\n return {\n ...state,\n localization: action.payload,\n config: {\n ...state.config,\n localization: action.payload,\n },\n };\n\n case 'SET_COMPONENTS':\n return {\n ...state,\n components: action.payload,\n config: {\n ...state.config,\n components: action.payload,\n },\n };\n\n case 'SET_FEATURES':\n return {\n ...state,\n features: action.payload,\n config: {\n ...state.config,\n features: action.payload,\n },\n };\n\n case 'SET_DEBUG':\n return {\n ...state,\n debug: action.payload,\n config: {\n ...state.config,\n debug: action.payload,\n },\n };\n\n case 'RESET_CONFIG':\n return {\n ...initialConfigState,\n publishableKey: state.publishableKey,\n secretKey: state.secretKey,\n projectId: state.projectId,\n userType: state.userType,\n apiUrl: state.apiUrl,\n isLoaded: true,\n };\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialConfigState: ConfigState = {\n isLoaded: false,\n config: defaultConfig as FrankAuthUIConfig,\n publishableKey: '',\n userType: 'external',\n apiUrl: 'https://api.frankauth.com',\n theme: defaultConfig.theme!,\n appearance: defaultConfig.appearance!,\n localization: defaultConfig.localization!,\n components: {},\n linksPath: {\n signUp: '/auth/sign-up',\n magicLink: '/auth/magic-link',\n verify: '/auth/verify',\n signIn: '/auth/sign-in',\n resetPassword: '/auth/reset-password',\n forgotPassword: '/auth/forgot-password',\n signOut: '/auth/sign-out'\n },\n features: {\n signUp: true,\n signIn: true,\n passwordReset: true,\n mfa: false,\n passkeys: false,\n oauth: false,\n magicLink: false,\n sso: false,\n organizationManagement: false,\n userProfile: true,\n sessionManagement: true,\n },\n debug: false,\n};\n\n// ============================================================================\n// Config Provider Component\n// ============================================================================\n\nexport function ConfigProvider({\n children,\n config: initialConfig,\n onConfigChange,\n }: ConfigProviderProps) {\n const [state, dispatch] = useReducer(configReducer, initialConfigState);\n\n // Initialize config manager\n const configManager = useMemo(() => {\n try {\n const validatedConfig = createFrankAuthConfig(initialConfig);\n return new ConfigManager(validatedConfig);\n } catch (error) {\n console.error('[FrankAuth] Invalid configuration:', error);\n throw error;\n }\n }, [initialConfig]);\n\n // Initialize state with provided config\n useEffect(() => {\n const validatedConfig = configManager.getConfig();\n dispatch({type: 'SET_CONFIG', payload: validatedConfig});\n dispatch({type: 'SET_LOADED', payload: true});\n }, [configManager]);\n\n // Subscribe to config manager changes\n useEffect(() => {\n const unsubscribe = configManager.subscribe((updatedConfig) => {\n dispatch({type: 'SET_CONFIG', payload: updatedConfig});\n onConfigChange?.(updatedConfig);\n });\n\n return unsubscribe;\n }, [configManager, onConfigChange]);\n\n // Apply configuration to DOM\n useEffect(() => {\n if (typeof window !== 'undefined' && state.isLoaded) {\n configManager.applyToDOM();\n }\n }, [configManager, state.isLoaded, state.theme, state.appearance]);\n\n // Update config method\n const updateConfig = useCallback((updates: Partial<FrankAuthUIConfig>) => {\n try {\n // Validate updates\n const validation = validateFrankAuthConfig({...state.config, ...updates});\n if (!validation.isValid) {\n const errorMessages = validation.errors.map(e => e.message).join(', ');\n throw new Error(`Configuration validation failed: ${errorMessages}`);\n }\n\n configManager.updateConfig(updates);\n dispatch({type: 'UPDATE_CONFIG', payload: updates});\n } catch (error) {\n console.error('[FrankAuth] Configuration update failed:', error);\n throw error;\n }\n }, [configManager, state.config]);\n\n // Set organization method\n const setOrganization = useCallback((organization: Organization) => {\n try {\n // Transform organization to config format\n const organizationConfig: OrganizationConfig = {\n id: organization.id,\n name: organization.name,\n slug: organization.slug || '',\n settings: organization.settings || {} as any,\n features: {\n sso: organization.ssoEnabled || false,\n mfa: organization.settings?.mfaSettings?.enabled || false,\n auditLogs: organization.settings?.auditSettings?.enabled || false,\n customBranding: organization.settings?.branding ? true : false,\n apiAccess: organization.apiEnabled || false,\n },\n limits: {\n maxUsers: organization.userLimit || 100,\n maxSessions: organization.sessionLimit || 10,\n apiRequestLimit: organization.apiRequestLimit || 1000,\n },\n };\n\n configManager.setOrganization(organizationConfig);\n dispatch({type: 'SET_ORGANIZATION', payload: organizationConfig});\n\n // Update features based on organization settings\n const updatedFeatures = determineOrganizationFeatures(organizationConfig);\n dispatch({type: 'SET_FEATURES', payload: updatedFeatures});\n } catch (error) {\n console.error('[FrankAuth] Failed to set organization:', error);\n throw error;\n }\n }, [configManager]);\n\n // Set theme method\n const setTheme = useCallback((theme: Partial<Theme>) => {\n try {\n configManager.getThemeManager().setTheme(theme);\n dispatch({type: 'SET_THEME', payload: configManager.getThemeManager().getTheme()});\n } catch (error) {\n console.error('[FrankAuth] Failed to set theme:', error);\n throw error;\n }\n }, [configManager]);\n\n // Set appearance method\n const setAppearance = useCallback((appearance: Partial<AppearanceConfig>) => {\n try {\n configManager.getAppearanceManager().updateConfig(appearance);\n dispatch({type: 'SET_APPEARANCE', payload: configManager.getAppearanceManager().getConfig()});\n } catch (error) {\n console.error('[FrankAuth] Failed to set appearance:', error);\n throw error;\n }\n }, [configManager]);\n\n // Set locale method\n const setLocale = useCallback((locale: string) => {\n try {\n configManager.getLocalizationManager().setLocale(locale as any);\n dispatch({\n type: 'SET_LOCALIZATION', payload: {\n ...state.localization,\n defaultLocale: locale as any,\n }\n });\n } catch (error) {\n console.error('[FrankAuth] Failed to set locale:', error);\n throw error;\n }\n }, [configManager, state.localization]);\n\n // Apply organization branding method\n const applyOrganizationBranding = useCallback((organization: Organization) => {\n try {\n if (organization.settings?.branding) {\n const branding = {\n logo: {\n url: organization.logoUrl,\n alt: organization.name,\n },\n colors: {\n primary: organization.settings.branding.primaryColor || '#3b82f6',\n secondary: organization.settings.branding.secondaryColor || '#64748b',\n },\n fonts: {\n primary: 'Inter, ui-sans-serif, system-ui, sans-serif',\n },\n customCSS: organization.settings.branding.customCSS,\n };\n\n configManager.getThemeManager().applyBranding(branding);\n configManager.getAppearanceManager().applyOrganizationBranding(organization as any);\n }\n } catch (error) {\n console.error('[FrankAuth] Failed to apply organization branding:', error);\n throw error;\n }\n }, [configManager]);\n\n // Reset to defaults method\n const resetToDefaults = useCallback(() => {\n try {\n configManager.reset();\n dispatch({type: 'RESET_CONFIG'});\n } catch (error) {\n console.error('[FrankAuth] Failed to reset configuration:', error);\n throw error;\n }\n }, [configManager]);\n\n // Helper function to determine organization features\n const determineOrganizationFeatures = (organizationConfig: OrganizationConfig): AuthFeatures => {\n const settings = organizationConfig.settings;\n\n return {\n signUp: settings.allowPublicSignup || false,\n signIn: true,\n passwordReset: true,\n mfa: organizationConfig.features.mfa,\n passkeys: (settings.authConfig as any)?.passkeysEnabled || false,\n oauth: (settings.authConfig as any)?.oauthEnabled || false,\n magicLink: (settings.authConfig as any)?.magicLinkEnabled || false,\n sso: organizationConfig.features.sso,\n organizationManagement: true,\n userProfile: true,\n sessionManagement: true,\n };\n };\n\n // Context value\n const contextValue: ConfigContextValue = {\n // State\n ...state,\n\n // Methods\n updateConfig,\n setOrganization,\n setTheme,\n setAppearance,\n setLocale,\n applyOrganizationBranding,\n resetToDefaults,\n };\n\n return (\n <ConfigContext.Provider value={contextValue}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\n// ============================================================================\n// Hook to use config context\n// ============================================================================\n\nexport function useConfig() {\n const context = useContext(ConfigContext);\n\n if (!context) {\n throw new Error('useConfig must be used within a ConfigProvider');\n }\n\n return context;\n}\n\n// ============================================================================\n// Hook for feature flags\n// ============================================================================\n\nexport function useFeatures() {\n const {features} = useConfig();\n\n return {\n ...features,\n hasFeature: (feature: keyof AuthFeatures) => features[feature],\n requireFeature: (feature: keyof AuthFeatures) => {\n if (!features[feature]) {\n throw new Error(`Feature ${feature} is not enabled`);\n }\n },\n };\n}\n\n// ============================================================================\n// Hook for organization configuration\n// ============================================================================\n\nexport function useOrganizationConfig() {\n const {organizationConfig, organizationSettings, setOrganization, applyOrganizationBranding} = useConfig();\n\n return {\n organization: organizationConfig,\n settings: organizationSettings,\n setOrganization,\n applyBranding: applyOrganizationBranding,\n hasOrganization: !!organizationConfig,\n isMultiTenant: !!organizationConfig,\n };\n}\n\n// ============================================================================\n// Hook for component overrides\n// ============================================================================\n\nexport function useComponentOverrides() {\n const {components} = useConfig();\n\n const getComponent = useCallback(<T extends keyof ComponentOverrides>(\n componentName: T,\n defaultComponent: any\n ) => {\n return components[componentName] || defaultComponent;\n }, [components]);\n\n return {\n components,\n getComponent,\n hasOverride: (componentName: keyof ComponentOverrides) => !!components[componentName],\n };\n}\n\n// ============================================================================\n// Higher-order component for configuration\n// ============================================================================\n\nexport function withConfig<T extends object>(Component: React.ComponentType<T>) {\n const WithConfigComponent = (props: T) => {\n const config = useConfig();\n\n return <Component {...props} config={config}/>;\n };\n\n WithConfigComponent.displayName = `withConfig(${Component.displayName || Component.name})`;\n\n return WithConfigComponent;\n}\n\n// ============================================================================\n// Export config provider\n// ============================================================================\n\nexport {ConfigContext};\nexport type {ConfigContextValue};\n"],"names":["ConfigContext","createContext","configReducer","state","action","updatedConfig","initialConfigState","defaultConfig","ConfigProvider","children","initialConfig","onConfigChange","dispatch","useReducer","configManager","useMemo","validatedConfig","createFrankAuthConfig","ConfigManager","error","useEffect","updateConfig","useCallback","updates","validation","validateFrankAuthConfig","errorMessages","e","setOrganization","organization","organizationConfig","updatedFeatures","determineOrganizationFeatures","setTheme","theme","setAppearance","appearance","setLocale","locale","applyOrganizationBranding","branding","resetToDefaults","settings","contextValue","useConfig","context","useContext","useFeatures","features","feature","useOrganizationConfig","organizationSettings","useComponentOverrides","components","getComponent","componentName","defaultComponent","withConfig","Component","WithConfigComponent","props","config","jsx"],"mappings":"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"}