/** * Auth Init Module Factory * Creates a ready-to-use InitModule for app initialization */ import type { InitModule } from '@umituz/react-native-design-system/init'; import { initializeAuth } from '../infrastructure/services/initializeAuth'; import type { InitializeAuthOptions } from '../infrastructure/services/initializeAuth'; export interface AuthInitModuleConfig { /** * Whether to auto sign-in as anonymous user * @default true */ autoAnonymousSignIn?: boolean; /** * Storage provider for auth persistence */ storageProvider?: InitializeAuthOptions['storageProvider']; /** * Callback to restore purchases after user conversion * If provided, will be called after anonymous user converts to authenticated */ onRestorePurchases?: () => Promise; /** * Custom callback when user converts from anonymous to authenticated */ onUserConverted?: (anonymousId: string, authenticatedId: string) => Promise; /** * Whether this module is critical for app startup * @default true */ critical?: boolean; /** * Module dependencies * @default ["firebase"] */ dependsOn?: string[]; } /** * Creates an Auth initialization module for use with createAppInitializer * * @example * ```typescript * import { createAppInitializer } from "@umituz/react-native-design-system"; * import { createFirebaseInitModule } from "@umituz/react-native-firebase"; * import { createAuthInitModule } from "@umituz/react-native-auth"; * import { storageRepository, collectDeviceExtras } from "@umituz/react-native-design-system"; * * export const initializeApp = createAppInitializer({ * modules: [ * createFirebaseInitModule(), * createAuthInitModule({ * userCollection: "users", * collectExtras: collectDeviceExtras, * storageProvider: storageRepository, * }), * ], * }); * ``` */ export function createAuthInitModule( config: AuthInitModuleConfig = {} ): InitModule { const { autoAnonymousSignIn = true, storageProvider, onRestorePurchases, onUserConverted, critical = true, // Auth is CRITICAL for app functionality dependsOn = ['firebase'], } = config; return { name: 'auth', critical, dependsOn, init: async () => { try { await initializeAuth({ autoAnonymousSignIn, storageProvider, onUserConverted: async (anonymousId: string, authenticatedId: string) => { // Restore purchases after conversion (if callback provided) if (onRestorePurchases) { try { await onRestorePurchases(); } catch (error) { if (__DEV__) { console.error('[AuthInitModule] Purchase restoration failed:', error instanceof Error ? error.message : String(error)); } } } // Call custom callback if provided if (onUserConverted) { try { await onUserConverted(anonymousId, authenticatedId); } catch (error) { if (__DEV__) { console.error('[AuthInitModule] onUserConverted callback failed:', error instanceof Error ? error.message : String(error)); } } } }, }); return true; } catch (error) { if (__DEV__) { console.error('[AuthInitModule] Auth initialization failed:', error instanceof Error ? error.message : String(error)); } throw error; } }, }; }