{"version":3,"sources":["../../src/hooks/useAuth.ts"],"names":["verifyEmailCall","signIn","signInCall","signUp","signUpCall","forgotPassword","forgotPasswordCall","resetPassword","resetPasswordCall","verifyEmail","resendVerification","resendVerificationCall","signOut","signOutCall"],"mappings":"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","file":"useAuth.mjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n  AuthClientError,\n  fetchLoginMethods,\n  fetchSession,\n  forgotPassword as forgotPasswordCall,\n  resendVerification as resendVerificationCall,\n  resetPassword as resetPasswordCall,\n  resolveAuthBasePath,\n  signIn as signInCall,\n  signOut as signOutCall,\n  signUp as signUpCall,\n  verifyEmail as verifyEmailCall,\n} from '../lib/authClient';\nimport type {\n  AuthError,\n  AuthMode,\n  AuthUser,\n  LoginMethods,\n} from '../types/auth';\n\nconst RESET_QUERY_KEY = 'bffless_reset';\nconst VERIFY_QUERY_KEY = 'bffless_verify';\n\nexport interface UseAuthOptions {\n  /**\n   * Override the auth base path. Default: auto-detect from `window.location.hostname`\n   * via `resolveAuthBasePath()`.\n   */\n  basePath?: string;\n  /**\n   * Called once a sign-in/sign-up/reset/verify completes successfully.\n   * Use this to revalidate data, navigate, etc. The dialog auto-closes\n   * separately via its own `onAuthenticated` prop.\n   */\n  onAuthenticated?: (user: AuthUser) => void;\n  /** Disable the initial GET /session probe (e.g. in SSR or tests). */\n  skipInitialSession?: boolean;\n  /** Disable URL token detection (e.g. if the host page handles its own routing). */\n  skipUrlTokenDetection?: boolean;\n}\n\nexport interface UseAuthResult {\n  /** Resolved auth base path (`/api/auth` or `/_bffless/auth`). */\n  basePath: string;\n  /** Current signed-in user, or null. */\n  user: AuthUser | null;\n  /** True until the initial session probe + URL detection finish. */\n  ready: boolean;\n  /** True while any auth operation is in flight. */\n  loading: boolean;\n  /** Last error from a failed operation. Cleared on next successful op. */\n  error: AuthError | null;\n  /** Active mode — drives which form the dialog renders. */\n  mode: AuthMode;\n  setMode: (mode: AuthMode) => void;\n  /** Optional discovered login methods (e.g. for showing a Google button). */\n  loginMethods: LoginMethods | null;\n  /** Token stashed from `?bffless_reset=` (only present when mode='reset'). */\n  resetToken: string | null;\n  /** Token stashed from `?bffless_verify=` (only present when mode='verify'). */\n  verifyToken: string | null;\n  /** Email captured from sign-up flow (used by verify-sent screen). */\n  pendingVerifyEmail: string | null;\n\n  signIn: (email: string, password: string) => Promise<void>;\n  signUp: (email: string, password: string, redirectOverride?: string) => Promise<void>;\n  forgotPassword: (email: string) => Promise<void>;\n  resetPassword: (password: string, token?: string) => Promise<void>;\n  verifyEmail: (token?: string) => Promise<void>;\n  resendVerification: () => Promise<void>;\n  signOut: () => Promise<void>;\n  refresh: () => Promise<void>;\n  /** Clear the current error without changing other state. */\n  clearError: () => void;\n}\n\nfunction stripTokenParam(key: string): void {\n  if (typeof window === 'undefined') return;\n  try {\n    const url = new URL(window.location.href);\n    if (!url.searchParams.has(key)) return;\n    url.searchParams.delete(key);\n    const search = url.searchParams.toString();\n    const next = `${url.pathname}${search ? '?' + search : ''}${url.hash}`;\n    window.history.replaceState({}, '', next);\n  } catch {\n    // ignore\n  }\n}\n\nfunction readUrlToken(key: string): string | null {\n  if (typeof window === 'undefined' || !window.location) return null;\n  try {\n    const params = new URLSearchParams(window.location.search);\n    return params.get(key);\n  } catch {\n    return null;\n  }\n}\n\nfunction toError(err: unknown): AuthError {\n  if (err instanceof AuthClientError) {\n    return { code: err.code, message: err.message };\n  }\n  if (err instanceof Error) {\n    return { code: 'unknown', message: err.message };\n  }\n  return { code: 'unknown', message: 'Something went wrong.' };\n}\n\nexport function useAuth(opts: UseAuthOptions = {}): UseAuthResult {\n  const basePath = useMemo(\n    () => opts.basePath ?? resolveAuthBasePath(),\n    [opts.basePath],\n  );\n\n  const [user, setUser] = useState<AuthUser | null>(null);\n  const [ready, setReady] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<AuthError | null>(null);\n  const [mode, setMode] = useState<AuthMode>('signin');\n  const [loginMethods, setLoginMethods] = useState<LoginMethods | null>(null);\n  const [resetToken, setResetToken] = useState<string | null>(null);\n  const [verifyToken, setVerifyToken] = useState<string | null>(null);\n  const [pendingVerifyEmail, setPendingVerifyEmail] = useState<string | null>(null);\n\n  const onAuthenticatedRef = useRef(opts.onAuthenticated);\n  onAuthenticatedRef.current = opts.onAuthenticated;\n\n  const fireAuthenticated = useCallback((next: AuthUser) => {\n    setUser(next);\n    setError(null);\n    onAuthenticatedRef.current?.(next);\n  }, []);\n\n  // Initial session probe + URL-token capture.\n  useEffect(() => {\n    let cancelled = false;\n    const ac = new AbortController();\n\n    const init = async () => {\n      // 1) Capture URL tokens first so the dialog opens to the right mode.\n      if (!opts.skipUrlTokenDetection) {\n        const reset = readUrlToken(RESET_QUERY_KEY);\n        const verify = readUrlToken(VERIFY_QUERY_KEY);\n        if (reset) {\n          setResetToken(reset);\n          setMode('reset');\n          stripTokenParam(RESET_QUERY_KEY);\n        } else if (verify) {\n          setVerifyToken(verify);\n          setMode('verify');\n          stripTokenParam(VERIFY_QUERY_KEY);\n        }\n      }\n\n      // 2) Probe session in the background.\n      if (!opts.skipInitialSession) {\n        try {\n          const result = await fetchSession({ basePath, signal: ac.signal });\n          if (!cancelled) setUser(result.user);\n        } catch {\n          // ignore\n        }\n      }\n\n      // 3) Best-effort login-methods probe (non-blocking on errors).\n      try {\n        const methods = await fetchLoginMethods({ basePath, signal: ac.signal });\n        if (!cancelled) setLoginMethods(methods);\n      } catch {\n        // ignore\n      }\n\n      if (!cancelled) setReady(true);\n    };\n\n    init();\n\n    return () => {\n      cancelled = true;\n      ac.abort();\n    };\n  }, [basePath, opts.skipInitialSession, opts.skipUrlTokenDetection]);\n\n  // Auto-verify if we landed with a verify token (and aren't already signed in).\n  useEffect(() => {\n    if (mode !== 'verify' || !verifyToken || loading) return;\n    let cancelled = false;\n    (async () => {\n      setLoading(true);\n      try {\n        const result = await verifyEmailCall({ basePath }, { token: verifyToken });\n        if (cancelled) return;\n        setVerifyToken(null);\n        if (result.user) {\n          fireAuthenticated(result.user);\n          setMode('signin');\n        } else {\n          // Verified but no session minted (e.g. user disabled). Send to signin.\n          setMode('signin');\n        }\n      } catch (err) {\n        if (cancelled) return;\n        setError(toError(err));\n      } finally {\n        if (!cancelled) setLoading(false);\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [verifyToken]);\n\n  const wrapOp = useCallback(\n    async <T,>(fn: () => Promise<T>): Promise<T> => {\n      setLoading(true);\n      setError(null);\n      try {\n        return await fn();\n      } catch (err) {\n        setError(toError(err));\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [],\n  );\n\n  const signIn = useCallback(\n    async (email: string, password: string) => {\n      const result = await wrapOp(() => signInCall({ basePath }, { email, password }));\n      fireAuthenticated(result.user);\n    },\n    [basePath, wrapOp, fireAuthenticated],\n  );\n\n  const signUp = useCallback(\n    async (email: string, password: string, redirectOverride?: string) => {\n      // Default redirect to the current page so the verify-email flow can\n      // (1) bounce back here after the user clicks the email link, and\n      // (2) tell the backend which host they signed up from when the proxy\n      //     chain strips Origin/Referer (the backend uses this to construct\n      //     the email's verify link host: admin.<workspace>.<domain>).\n      const redirect =\n        redirectOverride ??\n        (typeof window !== 'undefined' && window.location ? window.location.href : undefined);\n      const result = await wrapOp(() =>\n        signUpCall({ basePath }, { email, password, redirect }),\n      );\n      if (result.emailVerificationRequired) {\n        setPendingVerifyEmail(result.user.email);\n        setMode('verify-sent');\n      } else {\n        fireAuthenticated(result.user);\n      }\n    },\n    [basePath, wrapOp, fireAuthenticated],\n  );\n\n  const forgotPassword = useCallback(\n    async (email: string) => {\n      await wrapOp(() => forgotPasswordCall({ basePath }, { email }));\n    },\n    [basePath, wrapOp],\n  );\n\n  const resetPassword = useCallback(\n    async (password: string, tokenOverride?: string) => {\n      const token = tokenOverride ?? resetToken;\n      if (!token) {\n        const e: AuthError = { code: 'invalid_token', message: 'No reset token available.' };\n        setError(e);\n        throw new AuthClientError(e.code, e.message);\n      }\n      const result = await wrapOp(() =>\n        resetPasswordCall({ basePath }, { token, password }),\n      );\n      setResetToken(null);\n      if (result.user) {\n        fireAuthenticated(result.user);\n        setMode('signin');\n      } else {\n        setMode('signin');\n      }\n    },\n    [basePath, resetToken, wrapOp, fireAuthenticated],\n  );\n\n  const verifyEmail = useCallback(\n    async (tokenOverride?: string) => {\n      const token = tokenOverride ?? verifyToken;\n      if (!token) {\n        const e: AuthError = { code: 'invalid_token', message: 'No verification token available.' };\n        setError(e);\n        throw new AuthClientError(e.code, e.message);\n      }\n      const result = await wrapOp(() => verifyEmailCall({ basePath }, { token }));\n      setVerifyToken(null);\n      if (result.user) {\n        fireAuthenticated(result.user);\n        setMode('signin');\n      } else {\n        setMode('signin');\n      }\n    },\n    [basePath, verifyToken, wrapOp, fireAuthenticated],\n  );\n\n  const resendVerification = useCallback(async () => {\n    await wrapOp(() => resendVerificationCall({ basePath }));\n  }, [basePath, wrapOp]);\n\n  const signOut = useCallback(async () => {\n    await wrapOp(() => signOutCall({ basePath }));\n    setUser(null);\n  }, [basePath, wrapOp]);\n\n  const refresh = useCallback(async () => {\n    const result = await fetchSession({ basePath });\n    setUser(result.user);\n  }, [basePath]);\n\n  const clearError = useCallback(() => setError(null), []);\n\n  return {\n    basePath,\n    user,\n    ready,\n    loading,\n    error,\n    mode,\n    setMode,\n    loginMethods,\n    resetToken,\n    verifyToken,\n    pendingVerifyEmail,\n    signIn,\n    signUp,\n    forgotPassword,\n    resetPassword,\n    verifyEmail,\n    resendVerification,\n    signOut,\n    refresh,\n    clearError,\n  };\n}\n"]}