UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 34.7 kB
{"version":3,"file":"auth-provider.cjs","sources":["../../../src/provider/auth-provider.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Auth Provider\n *\n * Main authentication provider that manages auth state, session management,\n * and organization context for multi-tenant authentication.\n */\n\n\"use client\";\n\nimport React, {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseReducer,\n} from \"react\";\n\nimport type {\n\tLoginRequest,\n\tOrganization,\n\tPasswordResetConfirmRequest,\n\tRegisterRequest,\n\tResendVerificationRequest,\n\tSession,\n\tUser,\n\tValidateTokenInputBody,\n\tVerificationRequest,\n} from \"@frank-auth/client\";\nimport {\n\tAuthSDK,\n\tFrankAuthError,\n\tOrganizationSDK,\n\ttype PasswordResetRequest,\n\tSessionSDK,\n\tUserSDK,\n} from \"@frank-auth/sdk\";\n\nimport type {\n\tAuthContextValue,\n\tAuthError,\n\tAuthFeatures,\n\tAuthProviderProps,\n\tAuthState,\n\tOrganizationMembership,\n\tSetActiveParams,\n\tSignInParams,\n\tSignInResult,\n\tSignUpParams,\n\tSignUpResult,\n\tUpdateUserParams,\n} from \"./types\";\n\n// ============================================================================\n// Auth Context\n// ============================================================================\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\n// ============================================================================\n// Auth Reducer\n// ============================================================================\n\ntype AuthAction =\n\t| { type: \"SET_LOADING\"; payload: boolean }\n\t| { type: \"SET_LOADED\"; payload: boolean }\n\t| { type: \"SET_USER\"; payload: User | null }\n\t| { type: \"SET_SESSION\"; payload: Session | null }\n\t| { type: \"SET_ORGANIZATION\"; payload: Organization | null }\n\t| { type: \"SET_ACTIVE_ORGANIZATION\"; payload: Organization | null }\n\t| { type: \"SET_MEMBERSHIPS\"; payload: OrganizationMembership[] }\n\t| { type: \"SET_FEATURES\"; payload: AuthFeatures }\n\t| { type: \"SET_ERROR\"; payload: AuthError | null }\n\t| { type: \"RESET_STATE\" };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n\tswitch (action.type) {\n\t\tcase \"SET_LOADING\":\n\t\t\treturn { ...state, isLoading: action.payload };\n\n\t\tcase \"SET_LOADED\":\n\t\t\treturn { ...state, isLoaded: action.payload };\n\n\t\tcase \"SET_USER\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tuser: action.payload,\n\t\t\t\tisSignedIn: !!action.payload,\n\t\t\t\terror: null,\n\t\t\t};\n\n\t\tcase \"SET_SESSION\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsession: action.payload,\n\t\t\t\terror: null,\n\t\t\t};\n\n\t\tcase \"SET_ORGANIZATION\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\torganization: action.payload,\n\t\t\t\terror: null,\n\t\t\t};\n\n\t\tcase \"SET_ACTIVE_ORGANIZATION\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tactiveOrganization: action.payload,\n\t\t\t\terror: null,\n\t\t\t};\n\n\t\tcase \"SET_MEMBERSHIPS\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\torganizationMemberships: action.payload,\n\t\t\t\terror: null,\n\t\t\t};\n\n\t\tcase \"SET_FEATURES\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfeatures: action.payload,\n\t\t\t};\n\n\t\tcase \"SET_ERROR\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\terror: action.payload,\n\t\t\t\tisLoading: false,\n\t\t\t};\n\n\t\tcase \"RESET_STATE\":\n\t\t\treturn {\n\t\t\t\t...initialAuthState,\n\t\t\t\tisLoaded: true,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialAuthState: AuthState = {\n\tisLoaded: false,\n\tisLoading: false,\n\tisSignedIn: false,\n\tuser: null,\n\tsession: null,\n\torganization: null,\n\torganizationMemberships: [],\n\tactiveOrganization: null,\n\terror: null,\n\tfeatures: {\n\t\tsignUp: true,\n\t\tsignIn: true,\n\t\tpasswordReset: true,\n\t\tmfa: false,\n\t\tpasskeys: false,\n\t\toauth: false,\n\t\tmagicLink: false,\n\t\tsso: false,\n\t\torganizationManagement: false,\n\t\tuserProfile: true,\n\t\tsessionManagement: true,\n\t},\n\t// @ts-expect-error\n\tsdk: undefined,\n};\n\n// ============================================================================\n// Auth Provider Component\n// ============================================================================\n\nexport function AuthProvider({\n\tchildren,\n\tpublishableKey,\n\tuserType = \"external\",\n\tapiUrl,\n\tsecretKey,\n\tprojectId,\n\tinitialState,\n\tonError,\n\tonSignIn,\n\tonSignOut,\n\tdebug = false,\n}: AuthProviderProps) {\n\tconst [state, dispatch] = useReducer(authReducer, {\n\t\t...initialAuthState,\n\t\t...initialState,\n\t});\n\n\t// Initialize Frank Auth SDK\n\tconst authSdk = useMemo(() => {\n\t\treturn new AuthSDK({\n\t\t\tpublishableKey,\n\t\t\tapiUrl,\n\t\t\tenableDevMode: debug,\n\t\t\tuserType: userType,\n\t\t\tprojectId,\n\t\t\tsecretKey,\n\t\t});\n\t}, [publishableKey, apiUrl, debug]);\n\n\t// Initialize Frank Auth SDK\n\tconst orgSdk = useMemo(() => {\n\t\treturn new OrganizationSDK({\n\t\t\tpublishableKey,\n\t\t\tapiUrl,\n\t\t\tenableDevMode: debug,\n\t\t\tuserType: userType,\n\t\t\tprojectId,\n\t\t\tsecretKey,\n\t\t});\n\t}, [publishableKey, apiUrl, debug]);\n\n\t// Initialize Frank Auth SDK\n\tconst sessionSdk = useMemo(() => {\n\t\treturn new SessionSDK({\n\t\t\tpublishableKey,\n\t\t\tapiUrl,\n\t\t\tenableDevMode: debug,\n\t\t\tuserType: userType,\n\t\t\tprojectId,\n\t\t\tsecretKey,\n\t\t});\n\t}, [publishableKey, apiUrl, debug]);\n\tconst userSdk = useMemo(() => {\n\t\treturn new UserSDK({\n\t\t\tpublishableKey,\n\t\t\tapiUrl,\n\t\t\tenableDevMode: debug,\n\t\t\tuserType: userType,\n\t\t\tprojectId,\n\t\t\tsecretKey,\n\t\t});\n\t}, [publishableKey, apiUrl, debug]);\n\tconst allSdk = useMemo(() => {\n\t\treturn {\n\t\t\tauth: authSdk,\n\t\t\torganization: orgSdk,\n\t\t\tsession: sessionSdk,\n\t\t\tuser: userSdk,\n\t\t};\n\t}, [userSdk, authSdk, orgSdk, sessionSdk]);\n\n\t// Error handler\n\tconst handleError = useCallback(\n\t\t(error: any) => {\n\t\t\tconst authError: AuthError = {\n\t\t\t\tcode: error.code || \"UNKNOWN_ERROR\",\n\t\t\t\tmessage: error.message || \"An unknown error occurred\",\n\t\t\t\tdetails: error.details,\n\t\t\t\tfield: error.field,\n\t\t\t};\n\n\t\t\tdispatch({ type: \"SET_ERROR\", payload: authError });\n\t\t\tonError?.(authError);\n\n\t\t\tif (debug) {\n\t\t\t\tconsole.error(\"[FrankAuth] Error:\", authError);\n\t\t\t}\n\t\t},\n\t\t[onError, debug],\n\t);\n\n\t// Load initial auth state\n\tconst loadAuthState = useCallback(async () => {\n\t\ttry {\n\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\n\t\t\t// Get auth status\n\t\t\tconst authStatus = await authSdk.getAuthStatus();\n\n\t\t\tif (authStatus.isAuthenticated && authStatus.user) {\n\t\t\t\tdispatch({ type: \"SET_USER\", payload: authStatus.user });\n\t\t\t\tdispatch({ type: \"SET_SESSION\", payload: authStatus.session });\n\n\t\t\t\t// Load organization context if available\n\t\t\t\tif (projectId || authStatus.user.organizationId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst orgId = projectId || authStatus.user.organizationId || \"\";\n\t\t\t\t\t\tconst org = await orgSdk.getOrganization(orgId);\n\t\t\t\t\t\tdispatch({ type: \"SET_ORGANIZATION\", payload: org });\n\t\t\t\t\t\tdispatch({ type: \"SET_ACTIVE_ORGANIZATION\", payload: org });\n\n\t\t\t\t\t\t// Load organization memberships\n\t\t\t\t\t\tconst memberships = await orgSdk.listMembers(orgId);\n\t\t\t\t\t\tdispatch({ type: \"SET_MEMBERSHIPS\", payload: memberships.data });\n\t\t\t\t\t} catch (orgError) {\n\t\t\t\t\t\tif (debug) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\"[FrankAuth] Failed to load organization:\",\n\t\t\t\t\t\t\t\torgError,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Determine available features based on user type and organization\n\t\t\t\tconst features = await determineFeatures(\n\t\t\t\t\tauthStatus.user,\n\t\t\t\t\tstate.organization,\n\t\t\t\t\tuserType,\n\t\t\t\t);\n\t\t\t\tdispatch({ type: \"SET_FEATURES\", payload: features });\n\t\t\t}\n\n\t\t\tdispatch({ type: \"SET_LOADED\", payload: true });\n\t\t} catch (error) {\n\t\t\thandleError(error);\n\t\t} finally {\n\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t}\n\t}, [authSdk, projectId, userType, debug, handleError]);\n\n\t// Determine available features based on context\n\tconst determineFeatures = async (\n\t\tuser: User | null,\n\t\torganization: Organization | null,\n\t\tuserType: string,\n\t): Promise<AuthFeatures> => {\n\t\t// Base features for all user types\n\t\tconst baseFeatures: AuthFeatures = {\n\t\t\tsignUp: true,\n\t\t\tsignIn: true,\n\t\t\tpasswordReset: true,\n\t\t\tmfa: false,\n\t\t\tpasskeys: false,\n\t\t\toauth: false,\n\t\t\tmagicLink: false,\n\t\t\tsso: false,\n\t\t\torganizationManagement: false,\n\t\t\tuserProfile: true,\n\t\t\tsessionManagement: true,\n\t\t};\n\n\t\tif (!user) return baseFeatures;\n\n\t\t// Features based on user type\n\t\tswitch (userType) {\n\t\t\tcase \"internal\":\n\t\t\t\treturn {\n\t\t\t\t\t...baseFeatures,\n\t\t\t\t\tmfa: true,\n\t\t\t\t\tpasskeys: true,\n\t\t\t\t\torganizationManagement: true,\n\t\t\t\t\tsso: true,\n\t\t\t\t};\n\n\t\t\tcase \"external\":\n\t\t\t\treturn {\n\t\t\t\t\t...baseFeatures,\n\t\t\t\t\tmfa: organization?.settings?.mfaSettings?.enabled || false,\n\t\t\t\t\tpasskeys:\n\t\t\t\t\t\torganization?.settings?.authConfig?.passkeysEnabled || false,\n\t\t\t\t\toauth: organization?.settings?.authConfig?.oauthEnabled || false,\n\t\t\t\t\tsso: organization?.settings?.authConfig?.ssoEnabled || false,\n\t\t\t\t\torganizationManagement: true,\n\t\t\t\t};\n\n\t\t\tcase \"end_user\":\n\t\t\t\treturn {\n\t\t\t\t\t...baseFeatures,\n\t\t\t\t\tmfa: organization?.settings?.mfaSettings?.enabled || false,\n\t\t\t\t\tpasskeys:\n\t\t\t\t\t\torganization?.settings?.authConfig?.passkeysEnabled || false,\n\t\t\t\t\toauth: organization?.settings?.authConfig?.oauthEnabled || false,\n\t\t\t\t\torganizationManagement: false,\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\treturn baseFeatures;\n\t\t}\n\t};\n\n\t// Sign in method\n\tconst signIn = useCallback(\n\t\tasync (params: SignInParams): Promise<SignInResult> => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\tdispatch({ type: \"SET_ERROR\", payload: null });\n\n\t\t\t\tlet result;\n\t\t\t\tlet status = \"complete\";\n\n\t\t\t\tswitch (params.strategy) {\n\t\t\t\t\tcase \"password\":\n\t\t\t\t\t\tif (!params.identifier || !params.password) {\n\t\t\t\t\t\t\tthrow new Error(\"Email/username and password are required\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst loginRequest: LoginRequest = {\n\t\t\t\t\t\t\temail: params.identifier,\n\t\t\t\t\t\t\tpassword: params.password,\n\t\t\t\t\t\t\torganizationId: params.organizationId,\n\t\t\t\t\t\t\trememberMe: true,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tresult = await authSdk.signIn(loginRequest);\n\n\t\t\t\t\t\tif (result.mfaRequired) {\n\t\t\t\t\t\t\tstatus = \"needs_mfa\";\n\t\t\t\t\t\t} else if (result.verificationRequired) {\n\t\t\t\t\t\t\tstatus = \"needs_verification\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"oauth\":\n\t\t\t\t\t\tif (!params.provider) {\n\t\t\t\t\t\t\tthrow new Error(\"OAuth provider is required\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresult = await authSdk.initiateOAuthLogin(params.provider, {\n\t\t\t\t\t\t\tredirectUrl: params.redirectUrl,\n\t\t\t\t\t\t\torganizationId: params.organizationId,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"magic_link\":\n\t\t\t\t\t\tif (!params.identifier) {\n\t\t\t\t\t\t\tthrow new Error(\"Email is required for magic link\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresult = await authSdk.sendMagicLink({\n\t\t\t\t\t\t\temail: params.identifier,\n\t\t\t\t\t\t\tredirectUrl: params.redirectUrl,\n\t\t\t\t\t\t\t// organizationId: params.organizationId,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"passkey\":\n\t\t\t\t\t\tresult = await authSdk.beginPasskeyAuthentication({\n\t\t\t\t\t\t\t// todo fix\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tstatus = \"needs_passkey\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"sso\":\n\t\t\t\t\t\tif (!params.organizationId) {\n\t\t\t\t\t\t\tthrow new Error(\"Organization ID is required for SSO\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresult = await authSdk.initiateSSOLogin(params.organizationId, {\n\t\t\t\t\t\t\tredirectUrl: params.redirectUrl,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error(`Unsupported sign-in strategy: ${params.strategy}`);\n\t\t\t\t}\n\n\t\t\t\t// Handle successful authentication\n\t\t\t\tif (result.user && result.session) {\n\t\t\t\t\tdispatch({ type: \"SET_USER\", payload: result.user });\n\t\t\t\t\tdispatch({ type: \"SET_SESSION\", payload: result.session });\n\t\t\t\t\tonSignIn?.(result.user);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tstatus: status as any,\n\t\t\t\t\tuser: result.user,\n\t\t\t\t\tsession: result.session,\n\t\t\t\t\tverificationId: result.verificationId,\n\t\t\t\t\tmfaToken: result.mfaToken,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"complete\",\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"SIGN_IN_FAILED\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\terror instanceof FrankAuthError\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: \"Sign in failed\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, onSignIn, handleError],\n\t);\n\n\t// Sign up method\n\tconst signUp = useCallback(\n\t\tasync (params: SignUpParams): Promise<SignUpResult> => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\tdispatch({ type: \"SET_ERROR\", payload: null });\n\n\t\t\t\tconst registerRequest: RegisterRequest = {\n\t\t\t\t\temail: params.emailAddress,\n\t\t\t\t\tpassword: params.password,\n\t\t\t\t\tfirstName: params.firstName,\n\t\t\t\t\tlastName: params.lastName,\n\t\t\t\t\tusername: params.username,\n\t\t\t\t\tuserType: userType,\n\t\t\t\t\tacceptTerms: params.acceptTerms,\n\t\t\t\t\tmarketingConsent: params.marketingConsent,\n\t\t\t\t\tphoneNumber: params.phoneNumber,\n\t\t\t\t\tlocale: params.locale ?? \"en\",\n\t\t\t\t\torganizationId: params.organizationId,\n\t\t\t\t\tinvitationToken: params.invitationToken,\n\t\t\t\t\tcustomAttributes: params.unsafeMetadata,\n\t\t\t\t};\n\n\t\t\t\tconst result = await authSdk.signUp(registerRequest);\n\n\t\t\t\t// Handle successful registration\n\t\t\t\tif (result.user && result.session) {\n\t\t\t\t\tdispatch({ type: \"SET_USER\", payload: result.user });\n\t\t\t\t\tdispatch({ type: \"SET_SESSION\", payload: result.session });\n\t\t\t\t\tonSignIn?.(result.user);\n\t\t\t\t}\n\n\t\t\t\tlet status = \"complete\";\n\t\t\t\tif (result.verificationRequired) {\n\t\t\t\t\tstatus = \"needs_verification\";\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tstatus: status as any,\n\t\t\t\t\tuser: result.user,\n\t\t\t\t\tsession: result.session,\n\t\t\t\t\tverificationId: result.verificationToken,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"missing_requirements\",\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"SIGN_UP_FAILED\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Sign up failed\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, onSignIn, handleError],\n\t);\n\n\t// Sign out method\n\tconst signOut = useCallback(async () => {\n\t\ttry {\n\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\tawait authSdk.signOut({ logoutAll: false });\n\t\t\tauthSdk.authStorage.clearAll();\n\n\t\t\tdispatch({ type: \"RESET_STATE\" });\n\t\t\tonSignOut?.();\n\t\t} catch (error) {\n\t\t\thandleError(error);\n\t\t} finally {\n\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t}\n\t}, [authSdk, onSignOut, handleError]);\n\n\t// Create session method\n\tconst createSession = useCallback(\n\t\tasync (token: string): Promise<Session> => {\n\t\t\ttry {\n\t\t\t\tsessionSdk.activeSession = token;\n\t\t\t\tconst session = await sessionSdk.getCurrentSession();\n\t\t\t\tdispatch({ type: \"SET_SESSION\", payload: session });\n\t\t\t\treturn session;\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Set active method\n\tconst setActive = useCallback(\n\t\tasync (params: SetActiveParams) => {\n\t\t\ttry {\n\t\t\t\tif (params.session) {\n\t\t\t\t\tconst session = params.session;\n\t\t\t\t\tif (typeof params.session === \"string\") {\n\t\t\t\t\t\tsessionSdk.activeSession = params.session;\n\t\t\t\t\t\tawait sessionSdk.getCurrentSession();\n\t\t\t\t\t}\n\t\t\t\t\tdispatch({ type: \"SET_SESSION\", payload: session });\n\t\t\t\t}\n\n\t\t\t\tif (params.organization) {\n\t\t\t\t\tconst organization =\n\t\t\t\t\t\ttypeof params.organization === \"string\"\n\t\t\t\t\t\t\t? await orgSdk.getOrganization(params.organization)\n\t\t\t\t\t\t\t: params.organization;\n\t\t\t\t\tdispatch({ type: \"SET_ACTIVE_ORGANIZATION\", payload: organization });\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Set active organization\n\tconst setActiveOrganization = useCallback(\n\t\tasync (org: string | Organization) => {\n\t\t\ttry {\n\t\t\t\tlet organization;\n\t\t\t\tif (typeof org === \"string\") {\n\t\t\t\t\torganization = await orgSdk.getOrganization(org);\n\t\t\t\t} else {\n\t\t\t\t\torganization = org;\n\t\t\t\t}\n\t\t\t\tdispatch({ type: \"SET_ACTIVE_ORGANIZATION\", payload: organization });\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Switch organization\n\tconst switchOrganization = useCallback(\n\t\tasync (organizationId: string) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\n\t\t\t\tconst organization = await authSdk.switchOrganization(organizationId);\n\t\t\t\tdispatch({ type: \"SET_ACTIVE_ORGANIZATION\", payload: organization });\n\n\t\t\t\t// Reload user data with new organization context\n\t\t\t\tawait loadAuthState();\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError, loadAuthState],\n\t);\n\n\t// Update user method\n\tconst updateUser = useCallback(\n\t\tasync (params: UpdateUserParams): Promise<User> => {\n\t\t\ttry {\n\t\t\t\tconst updatedUser = await authSdk.updateProfile(params);\n\t\t\t\tdispatch({ type: \"SET_USER\", payload: updatedUser });\n\t\t\t\treturn updatedUser;\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Delete user method\n\tconst deleteUser = useCallback(async () => {\n\t\ttry {\n\t\t\tawait userSdk.deleteUser();\n\t\t\tdispatch({ type: \"RESET_STATE\" });\n\t\t\tonSignOut?.();\n\t\t} catch (error) {\n\t\t\thandleError(error);\n\t\t}\n\t}, [authSdk, handleError, onSignOut]);\n\n\t// Password request method\n\tconst requestPasswordReset = useCallback(\n\t\tasync (request: PasswordResetRequest) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\treturn await authSdk.requestPasswordReset(request);\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Password request method\n\tconst resetPassword = useCallback(\n\t\tasync (request: PasswordResetConfirmRequest) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\treturn await authSdk.resetPassword(request);\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Resend verification method\n\tconst resendVerification = useCallback(\n\t\tasync (request: ResendVerificationRequest) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\treturn await authSdk.resendVerification(request);\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Resend verification method\n\tconst verifyIdentity = useCallback(\n\t\tasync (type: \"email\" | \"phone\", request: VerificationRequest) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\tif (type === \"phone\") return await authSdk.verifyPhone(request);\n\t\t\t\treturn await authSdk.verifyEmail(request);\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Resend verification method\n\tconst validateToken = useCallback(\n\t\tasync (request: ValidateTokenInputBody) => {\n\t\t\ttry {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: true });\n\t\t\t\treturn await authSdk.validateToken(request);\n\t\t\t} catch (error) {\n\t\t\t\thandleError(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tdispatch({ type: \"SET_LOADING\", payload: false });\n\t\t\t}\n\t\t},\n\t\t[authSdk, handleError],\n\t);\n\n\t// Reload method\n\tconst reload = useCallback(async () => {\n\t\tawait loadAuthState();\n\t}, [loadAuthState]);\n\n\t// Load initial state on mount\n\tuseEffect(() => {\n\t\tloadAuthState();\n\t}, [loadAuthState]);\n\n\t// Context value\n\tconst contextValue: AuthContextValue = {\n\t\t// State\n\t\t...state,\n\n\t\t// Methods\n\t\tsignIn,\n\t\tsignUp,\n\t\tsignOut,\n\t\tcreateSession,\n\t\tsetActive,\n\t\tsetActiveOrganization,\n\t\tswitchOrganization,\n\t\tupdateUser,\n\t\tdeleteUser,\n\t\treload,\n\t\trequestPasswordReset,\n\t\tresetPassword,\n\t\tvalidateToken,\n\t\tresendVerification,\n\t\tverifyIdentity,\n\t\tsdk: allSdk,\n\t};\n\n\treturn (\n\t\t<AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>\n\t);\n}\n\n// ============================================================================\n// Hook to use auth context\n// ============================================================================\n\nexport function useAuth() {\n\tconst context = useContext(AuthContext);\n\n\tif (!context) {\n\t\tthrow new Error(\"useAuth must be used within an AuthProvider\");\n\t}\n\n\treturn context;\n}\n\n// ============================================================================\n// Hook for authentication guard\n// ============================================================================\n\nexport function useAuthGuard() {\n\tconst { isLoaded, isSignedIn, user } = useAuth();\n\n\treturn {\n\t\tisLoaded,\n\t\tisSignedIn,\n\t\tuser,\n\t\tisAuthenticated: isLoaded && isSignedIn,\n\t\trequireAuth: () => {\n\t\t\tif (!isLoaded) {\n\t\t\t\tthrow new Error(\"Authentication not loaded\");\n\t\t\t}\n\t\t\tif (!isSignedIn) {\n\t\t\t\tthrow new Error(\"Authentication required\");\n\t\t\t}\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Export auth provider\n// ============================================================================\n\nexport { AuthContext };\nexport type { AuthContextValue };\n"],"names":["AuthContext","createContext","authReducer","state","action","initialAuthState","AuthProvider","children","publishableKey","userType","apiUrl","secretKey","projectId","initialState","onError","onSignIn","onSignOut","debug","dispatch","useReducer","authSdk","useMemo","AuthSDK","orgSdk","OrganizationSDK","sessionSdk","SessionSDK","userSdk","UserSDK","allSdk","handleError","useCallback","error","authError","loadAuthState","authStatus","orgId","org","memberships","orgError","features","determineFeatures","user","organization","baseFeatures","signIn","params","result","status","loginRequest","FrankAuthError","signUp","registerRequest","signOut","createSession","token","session","setActive","setActiveOrganization","switchOrganization","organizationId","updateUser","updatedUser","deleteUser","requestPasswordReset","request","resetPassword","resendVerification","verifyIdentity","type","validateToken","reload","useEffect","contextValue","useAuth","context","useContext","useAuthGuard","isLoaded","isSignedIn"],"mappings":"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"}