{"version":3,"sources":["../src/navigation/NavigationContext.tsx","../src/provider/InsforgeProvider.tsx","../src/hooks/useAuth.ts","../src/hooks/useUser.ts","../src/hooks/usePublicAuthConfig.ts"],"names":["createContext","useContext","InsforgeContext","useState","useEffect"],"mappings":"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","file":"hooks.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\r\nimport type { NavigationAdapter } from './types';\r\n\r\nconst NavigationContext = createContext<NavigationAdapter | null>(null);\r\n\r\nexport interface NavigationProviderProps {\r\n  adapter: NavigationAdapter;\r\n  children: ReactNode;\r\n}\r\n\r\n/**\r\n * Navigation Provider\r\n * Injects navigation adapter into the component tree\r\n */\r\nexport function NavigationProvider({ adapter, children }: NavigationProviderProps) {\r\n  return <NavigationContext.Provider value={adapter}>{children}</NavigationContext.Provider>;\r\n}\r\n\r\n/**\r\n * Hook to access navigation adapter\r\n * @throws Error if used outside NavigationProvider\r\n */\r\nexport function useNavigationAdapter(): NavigationAdapter {\r\n  const adapter = useContext(NavigationContext);\r\n\r\n  if (!adapter) {\r\n    return {\r\n      useSearchParams: () => new URLSearchParams(),\r\n      Link: ({ href, children, className }) => (\r\n        <a href={href} className={className}>\r\n          {children}\r\n        </a>\r\n      ),\r\n    };\r\n  }\r\n\r\n  return adapter;\r\n}\r\n","import { useContext, useEffect, useState, useMemo, type ReactNode } from 'react';\r\nimport type { InsforgeUser, OAuthProvider } from '../types';\r\nimport { NavigationProvider, BrowserNavigationAdapter } from '../navigation';\r\nimport { InsforgeManager, type InsforgeManagerState } from '../core/InsforgeManager';\r\nimport {\r\n  InsforgeContext,\r\n  InsforgeAuthStateContext,\r\n  InsforgeMethodsContext,\r\n  InsforgeConfigContext,\r\n  type InsforgeContextValue,\r\n  type InsforgeAuthState,\r\n  type InsforgeAuthMethods,\r\n  type InsforgeAuthConfig,\r\n} from '../contexts';\r\nimport { StyleProvider } from '../styles/StyleProvider';\r\nimport { InsForgeClient } from '@insforge/sdk';\r\n\r\nexport interface InitialAuthState {\r\n  user?: InsforgeUser | null;\r\n  userId?: string | null;\r\n}\r\n\r\nexport interface InsforgeProviderProps {\r\n  /**\r\n   * The base URL of the InsForge backend.\r\n   * @deprecated This prop is no longer used.\r\n   * Use the client prop instead.\r\n   */\r\n  baseUrl?: string;\r\n  children: ReactNode;\r\n  /**\r\n   * The InsForge SDK client instance.\r\n   */\r\n  client: InsForgeClient;\r\n  /**\r\n   * URL to redirect to after successful sign in (when token is detected in URL)\r\n   * @default '/'\r\n   */\r\n  afterSignInUrl?: string;\r\n  onAuthChange?: (user: InsforgeUser | null) => void;\r\n  onSignIn?: (authToken: string, user: InsforgeUser) => Promise<void>;\r\n  onSignOut?: () => Promise<void>;\r\n  onRefresh?: (authToken: string, user: InsforgeUser) => Promise<void>;\r\n  /**\r\n   * Initial auth state from server (for SSR hydration)\r\n   * @internal - Not intended for public use, used by Next.js package\r\n   */\r\n  initialState?: InitialAuthState;\r\n}\r\n\r\n/**\r\n * Unified Insforge Provider - manages authentication state and configuration\r\n *\r\n * Uses singleton InsforgeManager to manage state across packages.\r\n * Context only subscribes to Manager and triggers React re-renders.\r\n *\r\n * Architecture (pattern learned from Clerk):\r\n * - InsforgeMethodsContext: Stable method references (NEVER change)\r\n * - InsforgeAuthStateContext: Reactive auth state (changes on sign in/out)\r\n * - InsforgeConfigContext: Static configuration values\r\n * - InsforgeContext: Combined context for backward compatibility\r\n *\r\n * This architecture prevents useEffect re-runs when auth state changes,\r\n * solving the \"duplicate request\" bug in components like VerifyEmail.\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage (React/Vite)\r\n * import { InsforgeProvider } from '@insforge/react';\r\n * import { createClient } from '@insforge/sdk';\r\n *\r\n * const client = createClient({\r\n *   baseUrl: import.meta.env.VITE_INSFORGE_BASE_URL,\r\n * });\r\n *\r\n * export default function MyApp() {\r\n *   return (\r\n *     <InsforgeProvider client={client}>\r\n *       <App />\r\n *     </InsforgeProvider>\r\n *   );\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```tsx\r\n * // With cookie sync (Next.js optimization)\r\n * <InsforgeProvider\r\n *   client={client}\r\n *   afterSignInUrl=\"/dashboard\"\r\n *   onSignIn={async (authToken) => {\r\n *     await signIn(authToken);\r\n *   }}\r\n *   onSignOut={async () => {\r\n *     await signOut();\r\n *   }}\r\n * >\r\n *   {children}\r\n * </InsforgeProvider>\r\n * ```\r\n */\r\nexport function InsforgeProviderCore({\r\n  children,\r\n  client,\r\n  afterSignInUrl = '/',\r\n  onAuthChange,\r\n  onSignIn,\r\n  onSignOut,\r\n  onRefresh,\r\n  initialState,\r\n}: InsforgeProviderProps) {\r\n  // Get singleton Manager instance\r\n  const manager: InsforgeManager = useMemo(\r\n    () =>\r\n      InsforgeManager.getInstance({\r\n        client,\r\n        afterSignInUrl,\r\n        onAuthChange,\r\n        onSignIn,\r\n        onSignOut,\r\n        onRefresh,\r\n      }),\r\n    [client, afterSignInUrl, onAuthChange, onSignIn, onSignOut, onRefresh]\r\n  );\r\n\r\n  // Set initialState if provided (from Server Component)\r\n  // This must happen during render, before useState initialization\r\n  if (initialState) {\r\n    const currentState = manager.getState();\r\n    if (currentState.userId === undefined && initialState.userId !== undefined) {\r\n      manager.setInitialState(initialState);\r\n    }\r\n  }\r\n\r\n  // Subscribe to Manager state\r\n  // Start with initial state from manager (will include initialState if set above)\r\n  const [state, setState] = useState<InsforgeManagerState>(() => manager.getState());\r\n\r\n  useEffect(() => {\r\n    // Subscribe to state changes\r\n    const unsubscribe = manager.subscribe((newState: InsforgeManagerState) => {\r\n      setState(newState);\r\n    });\r\n\r\n    // Initialize auth state\r\n    void manager.initialize();\r\n\r\n    return () => {\r\n      unsubscribe();\r\n    };\r\n  }, [manager]);\r\n\r\n  // ============================================\r\n  // STABLE METHOD REFERENCES\r\n  // These NEVER change once created (only depend on manager)\r\n  // This prevents useEffect re-runs when state changes\r\n  // ============================================\r\n  const stableMethods = useMemo<InsforgeAuthMethods>(\r\n    () => ({\r\n      setUser: (user: InsforgeUser | null) => manager.setUser(user),\r\n      signIn: (email: string, password: string) => manager.signIn(email, password),\r\n      signUp: (email: string, password: string, options?: { emailRedirectTo?: string }) =>\r\n        manager.signUp(email, password, options),\r\n      signOut: () => manager.signOut(),\r\n      updateUser: (data: InsforgeUser['profile']) => manager.updateUser(data),\r\n      reloadAuth: () => manager.reloadAuth(),\r\n      resendVerificationEmail: (email: string, options?: { emailRedirectTo?: string }) =>\r\n        manager.resendVerificationEmail(email, options),\r\n      sendResetPasswordEmail: (email: string) => manager.sendResetPasswordEmail(email),\r\n      resetPassword: (token: string, newPassword: string) =>\r\n        manager.resetPassword(token, newPassword),\r\n      verifyEmail: (otp: string, email?: string) => manager.verifyEmail(otp, email),\r\n      exchangeResetPasswordToken: (email: string, code: string) =>\r\n        manager.exchangeResetPasswordToken(email, code),\r\n      loginWithOAuth: (provider: OAuthProvider, redirectTo: string) =>\r\n        manager.loginWithOAuth(provider, redirectTo),\r\n      getPublicAuthConfig: () => manager.getPublicAuthConfig(),\r\n      getSession: () => manager.getSession(),\r\n    }),\r\n    [manager] // Only depends on manager (stable)\r\n  );\r\n\r\n  // ============================================\r\n  // STABLE CONFIG REFERENCES\r\n  // These rarely change after initialization\r\n  // ============================================\r\n  const stableConfig = useMemo<InsforgeAuthConfig>(\r\n    () => ({\r\n      baseUrl: manager.getConfig().client.getHttpClient().baseUrl,\r\n      afterSignInUrl: manager.getConfig().afterSignInUrl || '/',\r\n    }),\r\n    [manager] // Only depends on manager (stable)\r\n  );\r\n\r\n  // ============================================\r\n  // REACTIVE AUTH STATE\r\n  // This updates when auth state changes (sign in/out)\r\n  // ============================================\r\n  const authState = useMemo<InsforgeAuthState>(\r\n    () => ({\r\n      user: state.user,\r\n      userId: state.userId,\r\n      isLoaded: state.isLoaded,\r\n      isSignedIn: state.isSignedIn,\r\n    }),\r\n    [state.user, state.userId, state.isLoaded, state.isSignedIn]\r\n  );\r\n\r\n  // ============================================\r\n  // COMBINED CONTEXT VALUE (for backward compatibility)\r\n  // Uses stable method references from stableMethods\r\n  // ============================================\r\n  const contextValue = useMemo<InsforgeContextValue>(\r\n    () => ({\r\n      // Reactive state\r\n      ...authState,\r\n      // Stable methods (references don't change!)\r\n      ...stableMethods,\r\n      // Stable config\r\n      ...stableConfig,\r\n    }),\r\n    [authState, stableMethods, stableConfig]\r\n  );\r\n\r\n  // Multi-context architecture: each context has its own responsibility\r\n  // - MethodsContext: stable method references\r\n  // - AuthStateContext: reactive auth state\r\n  // - ConfigContext: static configuration\r\n  // - InsforgeContext: combined for backward compatibility\r\n  return (\r\n    <InsforgeMethodsContext.Provider value={stableMethods}>\r\n      <InsforgeConfigContext.Provider value={stableConfig}>\r\n        <InsforgeAuthStateContext.Provider value={authState}>\r\n          <InsforgeContext.Provider value={contextValue}>{children}</InsforgeContext.Provider>\r\n        </InsforgeAuthStateContext.Provider>\r\n      </InsforgeConfigContext.Provider>\r\n    </InsforgeMethodsContext.Provider>\r\n  );\r\n}\r\n\r\nexport function InsforgeProvider(props: InsforgeProviderProps) {\r\n  return (\r\n    <StyleProvider>\r\n      <NavigationProvider adapter={BrowserNavigationAdapter}>\r\n        <InsforgeProviderCore {...props} />\r\n      </NavigationProvider>\r\n    </StyleProvider>\r\n  );\r\n}\r\n\r\n/**\r\n * Hook to access Insforge context\r\n *\r\n * Works seamlessly across packages thanks to singleton Manager.\r\n * Context instance is guaranteed to be consistent.\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n *   const { user, isSignedIn, signOut } = useInsforge();\r\n *\r\n *   if (!isSignedIn) return <SignIn />;\r\n *\r\n *   return (\r\n *     <div>\r\n *       <p>Welcome {user.email}</p>\r\n *       <button onClick={signOut}>Sign Out</button>\r\n *     </div>\r\n *   );\r\n * }\r\n * ```\r\n */\r\nexport function useInsforge(): InsforgeContextValue {\r\n  const context: InsforgeContextValue | undefined = useContext(InsforgeContext);\r\n\r\n  if (!context) {\r\n    return {\r\n      user: undefined,\r\n      userId: undefined,\r\n      isLoaded: false,\r\n      isSignedIn: undefined,\r\n      setUser: () => {},\r\n      signIn: () => Promise.resolve({ error: 'SSR mode' }),\r\n      signUp: () => Promise.resolve({ error: 'SSR mode' }),\r\n      signOut: () => Promise.resolve(),\r\n      updateUser: () => Promise.resolve({ error: 'SSR mode' }),\r\n      reloadAuth: () => Promise.resolve({ success: false, error: 'SSR mode' }),\r\n      resendVerificationEmail: () => Promise.resolve(null),\r\n      sendResetPasswordEmail: () => Promise.resolve(null),\r\n      resetPassword: () => Promise.resolve(null),\r\n      verifyEmail: () => Promise.resolve({ error: 'SSR mode' }),\r\n      exchangeResetPasswordToken: () => Promise.resolve({ error: { message: 'SSR mode' } }),\r\n      loginWithOAuth: () => Promise.resolve(),\r\n      getPublicAuthConfig: () => Promise.resolve(null),\r\n      getSession: () => Promise.resolve(null),\r\n      baseUrl: '',\r\n      afterSignInUrl: '/',\r\n    };\r\n  }\r\n\r\n  return context;\r\n}\r\n","import { CreateSessionResponse, CreateUserResponse } from '@insforge/shared-schemas';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to access authentication methods\r\n *\r\n * @returns Object containing:\r\n *   - `signIn`: Function to sign in with email and password\r\n *   - `signUp`: Function to sign up with email and password\r\n *   - `signOut`: Function to sign out the current user\r\n *   - `isLoaded`: Boolean indicating if auth state has been loaded\r\n *   - `isSignedIn`: Boolean indicating if user is currently signed in\r\n *\r\n * @example\r\n * ```tsx\r\n * function LoginForm() {\r\n *   const { signIn, signUp, signOut, isLoaded, isSignedIn } = useAuth();\r\n *\r\n *   async function handleLogin(email: string, password: string) {\r\n *     try {\r\n *       await signIn(email, password);\r\n *       // User is now signed in\r\n *     } catch (error) {\r\n *       console.error('Sign in failed:', error);\r\n *     }\r\n *   }\r\n *\r\n *   if (!isLoaded) return <div>Loading...</div>;\r\n *\r\n *   return (\r\n *     <form onSubmit={(e) => { e.preventDefault(); handleLogin(email, password); }}>\r\n *       {/* form fields *\\/}\r\n *     </form>\r\n *   );\r\n * }\r\n * ```\r\n */\r\nexport function useAuth(): {\r\n  signIn: (\r\n    email: string,\r\n    password: string\r\n  ) => Promise<CreateSessionResponse | { error: string; statusCode?: number; errorCode?: string }>;\r\n  signUp: (\r\n    email: string,\r\n    password: string\r\n  ) => Promise<CreateUserResponse | { error: string; statusCode?: number; errorCode?: string }>;\r\n  signOut: () => Promise<void>;\r\n  isLoaded: boolean;\r\n  isSignedIn: boolean | undefined;\r\n} {\r\n  const { signIn, signUp, signOut, isLoaded, isSignedIn } = useInsforge();\r\n  return { signIn, signUp, signOut, isLoaded, isSignedIn };\r\n}\r\n","import { InsforgeUser } from '@insforge/shared';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\nexport interface useUserReturn {\r\n  user: InsforgeUser | null | undefined;\r\n  isLoaded: boolean;\r\n  updateUser: (data: InsforgeUser['profile']) => Promise<{ error: string } | null>;\r\n  setUser: (user: InsforgeUser | null) => void;\r\n}\r\n\r\n/**\r\n * Hook to access current user data\r\n *\r\n * @returns Object containing:\r\n *   - `user`: Current user object (InsforgeUser | null)\r\n *   - `isLoaded`: Boolean indicating if auth state has been loaded\r\n *   - `updateUser`: Function to update user profile data (returns { error: string } | null)\r\n *   - `setUser`: Internal function to manually set user state\r\n *\r\n * @example\r\n * ```tsx\r\n * function UserProfile() {\r\n *   const { user, isLoaded, updateUser } = useUser();\r\n *\r\n *   if (!isLoaded) return <div>Loading...</div>;\r\n *   if (!user) return <div>Not signed in</div>;\r\n *\r\n *   async function handleUpdate(name: string) {\r\n *     const result = await updateUser({ name });\r\n *     if (result?.error) {\r\n *       console.error(result.error);\r\n *     } else {\r\n *       console.log('User updated successfully');\r\n *     }\r\n *   }\r\n *\r\n *   return (\r\n *     <div>\r\n *       <p>Email: {user.email}</p>\r\n *       {user.name && <p>Name: {user.name}</p>}\r\n *       {user.avatarUrl && <img src={user.avatarUrl} alt=\"Avatar\" />}\r\n *     </div>\r\n *   );\r\n * }\r\n * ```\r\n */\r\nexport function useUser(): useUserReturn {\r\n  const { user, isLoaded, updateUser, setUser } = useInsforge();\r\n  return { user, isLoaded, updateUser, setUser };\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { GetPublicAuthConfigResponse } from '@insforge/shared-schemas';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to get all public authentication configuration (OAuth + Email) from Insforge backend\r\n *\r\n * **IMPORTANT: This hook should ONLY be used in SignIn and SignUp components.**\r\n *\r\n * This hook lazily fetches all public authentication configuration from the backend\r\n * only when the component mounts. Using it in other components will cause unnecessary\r\n * API calls on every page load.\r\n *\r\n * @returns Object containing OAuth providers, email auth config, and loading state\r\n * - `authConfig`: Email authentication configuration object with password rules\r\n * - `isLoaded`: Boolean indicating if the config has been fetched\r\n *\r\n * @example\r\n * ```tsx\r\n * // ✅ Correct usage - only in SignIn/SignUp components\r\n * function SignUp() {\r\n *   const { authConfig, isLoaded } = usePublicAuthConfig();\r\n *\r\n *   if (!isLoaded) return <div>Loading...</div>;\r\n *\r\n *   return (\r\n *     <div>\r\n *       <p>OAuth providers: {authConfig?.oauthProviders.length}</p>\r\n *       <p>Password min length: {authConfig?.passwordMinLength}</p>\r\n *     </div>\r\n *   );\r\n * }\r\n * ```\r\n *\r\n * @requires Must be used within InsforgeProvider\r\n */\r\nexport function usePublicAuthConfig(): {\r\n  authConfig: GetPublicAuthConfigResponse | null;\r\n  isLoaded: boolean;\r\n} {\r\n  const { getPublicAuthConfig } = useInsforge();\r\n  const [authConfig, setAuthConfig] = useState<GetPublicAuthConfigResponse | null>(null);\r\n  const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n  useEffect(() => {\r\n    async function fetchConfig() {\r\n      const result = await getPublicAuthConfig();\r\n      if (result) {\r\n        setAuthConfig(result);\r\n      } else {\r\n        console.error('[usePublicAuthConfig] Failed to get public auth config');\r\n        setAuthConfig(null);\r\n      }\r\n      setIsLoaded(true);\r\n    }\r\n\r\n    void fetchConfig();\r\n  }, [getPublicAuthConfig]);\r\n\r\n  return { authConfig, isLoaded };\r\n}\r\n"]}