@puzzle-ui/fullstack 0.0.0-stage → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +558 -2
- package/dist/LICENSE +21 -0
- package/dist/auth/client/auth.css +206 -0
- package/dist/auth/client/experience.cjs +340 -0
- package/dist/auth/client/experience.cjs.map +1 -0
- package/dist/auth/client/experience.d.cts +67 -0
- package/dist/auth/client/experience.d.ts +67 -0
- package/dist/auth/client/experience.js +340 -0
- package/dist/auth/client/experience.js.map +1 -0
- package/dist/auth/client/index.cjs +234 -0
- package/dist/auth/client/index.cjs.map +1 -0
- package/dist/auth/client/index.d.cts +48 -0
- package/dist/auth/client/index.d.ts +48 -0
- package/dist/auth/client/index.js +216 -0
- package/dist/auth/client/index.js.map +1 -0
- package/dist/auth/client/messages.cjs +80 -0
- package/dist/auth/client/messages.cjs.map +1 -0
- package/dist/auth/client/messages.d.cts +92 -0
- package/dist/auth/client/messages.d.ts +92 -0
- package/dist/auth/client/messages.js +79 -0
- package/dist/auth/client/messages.js.map +1 -0
- package/dist/auth/client/passkeys.cjs +43 -0
- package/dist/auth/client/passkeys.cjs.map +1 -0
- package/dist/auth/client/passkeys.d.cts +23 -0
- package/dist/auth/client/passkeys.d.ts +23 -0
- package/dist/auth/client/passkeys.js +40 -0
- package/dist/auth/client/passkeys.js.map +1 -0
- package/dist/auth/client/react.cjs +859 -0
- package/dist/auth/client/react.cjs.map +1 -0
- package/dist/auth/client/react.d.cts +72 -0
- package/dist/auth/client/react.d.ts +72 -0
- package/dist/auth/client/react.js +850 -0
- package/dist/auth/client/react.js.map +1 -0
- package/dist/auth/next/index.cjs +40 -0
- package/dist/auth/next/index.cjs.map +1 -0
- package/dist/auth/next/index.d.cts +12 -0
- package/dist/auth/next/index.d.ts +12 -0
- package/dist/auth/next/index.js +38 -0
- package/dist/auth/next/index.js.map +1 -0
- package/dist/auth/server/health.cjs +51 -0
- package/dist/auth/server/health.cjs.map +1 -0
- package/dist/auth/server/health.d.cts +15 -0
- package/dist/auth/server/health.d.ts +15 -0
- package/dist/auth/server/health.js +51 -0
- package/dist/auth/server/health.js.map +1 -0
- package/dist/auth/server/index.cjs +108 -0
- package/dist/auth/server/index.cjs.map +1 -0
- package/dist/auth/server/index.d.cts +22 -0
- package/dist/auth/server/index.d.ts +22 -0
- package/dist/auth/server/index.js +88 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/lifecycle.cjs +126 -0
- package/dist/auth/server/lifecycle.cjs.map +1 -0
- package/dist/auth/server/lifecycle.d.cts +20 -0
- package/dist/auth/server/lifecycle.d.ts +20 -0
- package/dist/auth/server/lifecycle.js +126 -0
- package/dist/auth/server/lifecycle.js.map +1 -0
- package/dist/auth/server/mfa.cjs +682 -0
- package/dist/auth/server/mfa.cjs.map +1 -0
- package/dist/auth/server/mfa.d.cts +90 -0
- package/dist/auth/server/mfa.d.ts +90 -0
- package/dist/auth/server/mfa.js +673 -0
- package/dist/auth/server/mfa.js.map +1 -0
- package/dist/auth/server/session.cjs +58 -0
- package/dist/auth/server/session.cjs.map +1 -0
- package/dist/auth/server/session.d.cts +14 -0
- package/dist/auth/server/session.d.ts +14 -0
- package/dist/auth/server/session.js +53 -0
- package/dist/auth/server/session.js.map +1 -0
- package/dist/auth/shared/index.cjs +0 -0
- package/dist/auth/shared/index.d.cts +64 -0
- package/dist/auth/shared/index.d.ts +64 -0
- package/dist/auth/shared/index.js +1 -0
- package/dist/auth/tanstack/index.cjs +34 -0
- package/dist/auth/tanstack/index.cjs.map +1 -0
- package/dist/auth/tanstack/index.d.cts +7 -0
- package/dist/auth/tanstack/index.d.ts +7 -0
- package/dist/auth/tanstack/index.js +32 -0
- package/dist/auth/tanstack/index.js.map +1 -0
- package/package.json +108 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.cjs","names":["useState","Alert","FormField","TextInput","Button","createContext","createAuthClient","getAuthLocale","useMemo","resolveAuthMessages","useCallback","useContext"],"sources":["../../../src/auth/client/react.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\n\nimport { Alert, Button, FormField, TextInput } from \"@puzzle-ui/ui\";\n\nimport {\n createAuthClient,\n type AuthClient,\n type AuthClientOptions,\n type AuthClientSnapshot,\n type AuthClientTotpEnrollment,\n} from \"./index\";\n\nimport {\n getAuthLocale,\n resolveAuthMessages,\n type AuthLocale,\n type AuthMessageOverrides,\n type AuthMessages,\n} from \"./messages\";\n\nimport \"./auth.css\";\n\nexport type AuthProviderProps = {\n readonly children: ReactNode;\n readonly client?: AuthClient;\n readonly options?: AuthClientOptions;\n readonly initialSnapshot?: AuthClientSnapshot;\n readonly locale?: string;\n readonly messages?: AuthMessageOverrides;\n readonly onAuthStateChange?: (snapshot: AuthClientSnapshot) => void;\n};\n\nexport type AuthContextValue = {\n readonly client: AuthClient;\n readonly snapshot: AuthClientSnapshot;\n readonly messages: AuthMessages;\n readonly locale: AuthLocale;\n readonly error: Error | null;\n readonly isLoading: boolean;\n readonly isAuthenticated: boolean;\n readonly isPendingMfa: boolean;\n refresh: () => Promise<AuthClientSnapshot>;\n signIn: AuthClient[\"signIn\"];\n signUp: AuthClient[\"register\"];\n signOut: AuthClient[\"signOut\"];\n verifyMfaTotp: AuthClient[\"verifyMfaTotp\"];\n verifyMfaRecoveryCode: AuthClient[\"verifyMfaRecoveryCode\"];\n signInWithPasskey: AuthClient[\"signInWithPasskey\"];\n verifyMfaWithPasskey: AuthClient[\"verifyMfaWithPasskey\"];\n requestEmailVerification: AuthClient[\"requestEmailVerification\"];\n verifyEmail: AuthClient[\"verifyEmail\"];\n requestPasswordReset: AuthClient[\"requestPasswordReset\"];\n resetPassword: AuthClient[\"resetPassword\"];\n changePassword: AuthClient[\"changePassword\"];\n};\n\nexport type RequiredMfaEnrollmentProps = {\n readonly className?: string;\n};\n\nconst RequiredMfaEnrollment = ({ className }: RequiredMfaEnrollmentProps) => {\n const { client, snapshot, messages, refresh } = useAuth();\n\n const [enrollment, setEnrollment] = useState<AuthClientTotpEnrollment | null>(\n null,\n );\n\n const [code, setCode] = useState(\"\");\n const [recoveryCodes, setRecoveryCodes] = useState<readonly string[]>([]);\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (\n snapshot.status !== \"mfa-enrollment-required\" &&\n snapshot.status !== \"mfa-enrollment-pending\"\n ) {\n return null;\n }\n\n const handleTotpStart = async () => {\n setError(null);\n setLoading(true);\n\n try {\n setEnrollment(await client.beginRequiredTotpEnrollment());\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const handleTotpFinish = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!enrollment) return;\n\n setError(null);\n setLoading(true);\n\n try {\n const result = await client.verifyRequiredTotpEnrollment(\n enrollment.factorId,\n code,\n );\n\n setRecoveryCodes(result.recoveryCodes);\n setEnrollment(null);\n\n await refresh();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasskey = async () => {\n setError(null);\n setLoading(true);\n\n try {\n const result = await client.registerRequiredPasskey();\n\n setRecoveryCodes(result.recoveryCodes);\n\n await refresh();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.mfaTitle}</h1>\n <p>\n Additional authentication setup is required before you can continue.\n </p>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {recoveryCodes.length > 0 ? (\n <div className=\"puzzle-auth__recovery-codes\">\n <Alert severity=\"success\">{messages.saveRecoveryCodes}</Alert>\n\n <ul>\n {recoveryCodes.map((value) => (\n <li key={value}>\n <code>{value}</code>\n </li>\n ))}\n </ul>\n </div>\n ) : enrollment ? (\n <form className=\"puzzle-auth__form\" onSubmit={handleTotpFinish}>\n <FormField label={messages.totpSecret}>\n <TextInput\n value={enrollment.secret}\n readOnly\n aria-label={messages.totpSecret}\n />\n </FormField>\n\n <p>\n <a href={enrollment.otpauthUrl}>Open authenticator application</a>\n </p>\n\n <FormField\n label={messages.verificationCode}\n required\n controlId=\"puzzle-auth-required-totp\"\n >\n <TextInput\n value={code}\n autoComplete=\"one-time-code\"\n onChange={(event) => setCode(event.currentTarget.value)}\n required\n />\n </FormField>\n\n <Button type=\"submit\" loading={loading} disabled={!code.trim()}>\n {messages.verifyTotp}\n </Button>\n </form>\n ) : (\n <div className=\"puzzle-auth__actions\">\n <Button\n disabled={loading}\n loading={loading}\n onClick={() => void handleTotpStart()}\n >\n {messages.addTotp}\n </Button>\n\n {client.isPasskeySupported() && (\n <Button\n variant=\"outline\"\n disabled={loading}\n onClick={() => void handlePasskey()}\n >\n {messages.addPasskey}\n </Button>\n )}\n </div>\n )}\n </section>\n );\n};\n\nexport type EmailVerificationFormProps = {\n readonly token: string;\n readonly className?: string;\n};\n\nconst EmailVerificationForm = ({\n token,\n className,\n}: EmailVerificationFormProps) => {\n const { verifyEmail, messages } = useAuth();\n\n const [loading, setLoading] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleVerify = async () => {\n setLoading(true);\n setError(null);\n\n try {\n await verifyEmail(token);\n setCompleted(true);\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <h1>{messages.verifyEmail}</h1>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {completed ? (\n <Alert severity=\"success\">Email verified successfully.</Alert>\n ) : (\n <Button\n loading={loading}\n disabled={!token || loading}\n onClick={() => void handleVerify()}\n >\n {messages.verifyEmail}\n </Button>\n )}\n </section>\n );\n};\n\nconst loadingSnapshot: AuthClientSnapshot = {\n status: \"loading\",\n user: null,\n};\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nconst AuthProvider = ({\n children,\n client: suppliedClient,\n options,\n initialSnapshot = loadingSnapshot,\n locale: localeInput,\n messages: messageOverrides,\n onAuthStateChange,\n}: AuthProviderProps) => {\n const [createdClient] = useState(() => createAuthClient(options));\n const client = suppliedClient ?? createdClient;\n\n const locale = getAuthLocale(localeInput);\n\n const resolvedMessages = useMemo(\n () => resolveAuthMessages(locale, undefined, messageOverrides),\n [locale, messageOverrides],\n );\n\n const [snapshot, setSnapshot] = useState(initialSnapshot);\n const [error, setError] = useState<Error | null>(null);\n\n const publish = useCallback(\n (next: AuthClientSnapshot) => {\n setSnapshot(next);\n setError(null);\n onAuthStateChange?.(next);\n },\n [onAuthStateChange],\n );\n\n const refresh = useCallback(async () => {\n try {\n const next = await client.getSnapshot();\n publish(next);\n return next;\n } catch (cause) {\n const nextError =\n cause instanceof Error\n ? cause\n : new Error(resolvedMessages.unexpectedError);\n\n setError(nextError);\n throw nextError;\n }\n }, [client, publish, resolvedMessages.unexpectedError]);\n\n useEffect(() => {\n let active = true;\n\n client.getSnapshot().then(\n (next) => {\n if (active) publish(next);\n },\n (cause: unknown) => {\n if (active) {\n setError(\n cause instanceof Error\n ? cause\n : new Error(resolvedMessages.unexpectedError),\n );\n }\n },\n );\n\n return () => {\n active = false;\n };\n }, [client, publish, resolvedMessages.unexpectedError]);\n\n const signIn = useCallback<AuthClient[\"signIn\"]>(\n async (input) => {\n const next = await client.signIn(input);\n publish(next);\n return next;\n },\n [client, publish],\n );\n\n const signUp = useCallback<AuthClient[\"register\"]>(\n async (input) => {\n const next = await client.register(input);\n publish(next);\n return next;\n },\n [client, publish],\n );\n\n const signOut = useCallback(async () => {\n await client.signOut();\n\n publish({\n status: \"unauthenticated\",\n user: null,\n });\n }, [client, publish]);\n\n const verifyMfaTotp = useCallback<AuthClient[\"verifyMfaTotp\"]>(\n async (code) => {\n const next = await client.verifyMfaTotp(code);\n publish(next);\n return next;\n },\n [client, publish],\n );\n\n const verifyMfaRecoveryCode = useCallback<\n AuthClient[\"verifyMfaRecoveryCode\"]\n >(\n async (code) => {\n const next = await client.verifyMfaRecoveryCode(code);\n publish(next);\n return next;\n },\n [client, publish],\n );\n\n const signInWithPasskey = useCallback<\n AuthClient[\"signInWithPasskey\"]\n >(async () => {\n const next = await client.signInWithPasskey();\n publish(next);\n return next;\n }, [client, publish]);\n\n const verifyMfaWithPasskey = useCallback<\n AuthClient[\"verifyMfaWithPasskey\"]\n >(async () => {\n const next = await client.verifyMfaWithPasskey();\n publish(next);\n return next;\n }, [client, publish]);\n\n const requestEmailVerification = useCallback(\n () => client.requestEmailVerification(),\n [client],\n );\n\n const verifyEmail = useCallback(\n async (token: string) => {\n const result = await client.verifyEmail(token);\n publish(await client.getSnapshot());\n return result;\n },\n [client, publish],\n );\n\n const requestPasswordReset = useCallback(\n (email: string) => client.requestPasswordReset(email),\n [client],\n );\n\n const resetPassword = useCallback(\n (token: string, newPassword: string) =>\n client.resetPassword(token, newPassword),\n [client],\n );\n\n const changePassword = useCallback(\n async (currentPassword: string, newPassword: string) => {\n const result = await client.changePassword(currentPassword, newPassword);\n\n publish(await client.getSnapshot());\n\n return result;\n },\n [client, publish],\n );\n\n const value = useMemo<AuthContextValue>(\n () => ({\n client,\n snapshot,\n messages: resolvedMessages,\n locale,\n error,\n isLoading: snapshot.status === \"loading\",\n isAuthenticated: snapshot.status === \"authenticated\",\n isPendingMfa:\n snapshot.status === \"mfa-pending\" ||\n snapshot.status === \"step-up-pending\",\n refresh,\n signIn,\n signUp,\n signOut,\n verifyMfaTotp,\n verifyMfaRecoveryCode,\n signInWithPasskey,\n verifyMfaWithPasskey,\n requestEmailVerification,\n verifyEmail,\n requestPasswordReset,\n resetPassword,\n changePassword,\n }),\n [\n client,\n snapshot,\n resolvedMessages,\n locale,\n error,\n refresh,\n signIn,\n signUp,\n signOut,\n verifyMfaTotp,\n verifyMfaRecoveryCode,\n signInWithPasskey,\n verifyMfaWithPasskey,\n ],\n );\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nconst useAuth = (): AuthContextValue => {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error(\"useAuth must be used inside an AuthProvider.\");\n }\n\n return context;\n};\n\nconst useSession = () => {\n const { snapshot, isLoading, isAuthenticated } = useAuth();\n\n return {\n status: snapshot.status,\n mfa: snapshot.mfa,\n isLoading,\n isAuthenticated,\n };\n};\n\nconst useUser = () => useAuth().snapshot.user;\n\nconst getErrorMessage = (error: unknown, messages: AuthMessages): string => {\n if (typeof error === \"object\" && error !== null && \"code\" in error) {\n const code = (error as { code?: string }).code;\n\n if (code === \"INVALID_CREDENTIALS\") {\n return messages.invalidCredentials;\n }\n }\n\n return error instanceof Error ? error.message : messages.unexpectedError;\n};\n\nconst redirectAfterSuccess = (redirectTo?: string) => {\n if (\n !redirectTo ||\n typeof window === \"undefined\" ||\n !redirectTo.startsWith(\"/\") ||\n redirectTo.startsWith(\"//\")\n ) {\n return;\n }\n\n window.location.assign(redirectTo);\n};\n\nexport type PasswordResetRequestFormProps = AuthFormProps & {\n readonly defaultEmail?: string;\n};\n\nconst PasswordResetRequestForm = ({\n className,\n defaultEmail = \"\",\n onSuccess,\n}: PasswordResetRequestFormProps) => {\n const { requestPasswordReset, messages } = useAuth();\n\n const [email, setEmail] = useState(defaultEmail);\n const [loading, setLoading] = useState(false);\n const [sent, setSent] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLoading(true);\n setError(null);\n\n try {\n await requestPasswordReset(email);\n setSent(true);\n onSuccess?.();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.requestPasswordReset}</h1>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {sent ? (\n <Alert severity=\"success\">{messages.passwordResetSent}</Alert>\n ) : (\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit}>\n <FormField\n label={messages.email}\n required\n controlId=\"puzzle-auth-reset-email\"\n >\n <TextInput\n type=\"email\"\n value={email}\n autoComplete=\"email\"\n onChange={(event) => setEmail(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <Button\n type=\"submit\"\n fullWidth\n loading={loading}\n disabled={!email.trim()}\n >\n {messages.sendResetLink}\n </Button>\n </form>\n )}\n </section>\n );\n};\n\nexport type PasswordResetFormProps = AuthFormProps & {\n readonly token: string;\n};\n\nconst PasswordResetForm = ({\n className,\n token,\n onSuccess,\n}: PasswordResetFormProps) => {\n const { resetPassword, messages } = useAuth();\n\n const [password, setPassword] = useState(\"\");\n const [confirmation, setConfirmation] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n if (password !== confirmation) {\n setError(messages.passwordMismatch);\n return;\n }\n\n setLoading(true);\n\n try {\n await resetPassword(token, password);\n setCompleted(true);\n onSuccess?.();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.resetPassword}</h1>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {completed ? (\n <Alert severity=\"success\">{messages.passwordChanged}</Alert>\n ) : (\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit}>\n <FormField\n label={messages.newPassword}\n required\n controlId=\"puzzle-auth-new-password\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(event) => setPassword(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.confirmPassword}\n required\n controlId=\"puzzle-auth-new-password-confirm\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"new-password\"\n value={confirmation}\n onChange={(event) => setConfirmation(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <Button\n type=\"submit\"\n fullWidth\n loading={loading}\n disabled={!token || !password || !confirmation}\n >\n {messages.resetPassword}\n </Button>\n </form>\n )}\n </section>\n );\n};\n\nexport type EmailVerificationNoticeProps = {\n readonly className?: string;\n};\n\nconst EmailVerificationNotice = ({\n className,\n}: EmailVerificationNoticeProps) => {\n const { snapshot, requestEmailVerification, messages } = useAuth();\n\n const [loading, setLoading] = useState(false);\n const [sent, setSent] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n if (!snapshot.user || snapshot.user.emailVerified) {\n return null;\n }\n\n const handleRequest = async () => {\n setLoading(true);\n setError(null);\n\n try {\n await requestEmailVerification();\n setSent(true);\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <Alert severity=\"warning\">\n {sent ? messages.verificationSent : messages.verifyEmail}\n </Alert>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {!sent && (\n <Button loading={loading} disabled={loading} onClick={handleRequest}>\n {messages.verifyEmail}\n </Button>\n )}\n </section>\n );\n};\n\nexport type ChangePasswordFormProps = AuthFormProps;\n\nconst ChangePasswordForm = ({\n className,\n onSuccess,\n}: ChangePasswordFormProps) => {\n const { changePassword, messages } = useAuth();\n\n const [currentPassword, setCurrentPassword] = useState(\"\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmation, setConfirmation] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n if (newPassword !== confirmation) {\n setError(messages.passwordMismatch);\n return;\n }\n\n setLoading(true);\n\n try {\n await changePassword(currentPassword, newPassword);\n setCompleted(true);\n onSuccess?.();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <h2>{messages.changePassword}</h2>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {completed ? (\n <Alert severity=\"success\">{messages.passwordChanged}</Alert>\n ) : (\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit}>\n <FormField\n label={messages.currentPassword}\n required\n controlId=\"puzzle-auth-current-password\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"current-password\"\n value={currentPassword}\n onChange={(event) =>\n setCurrentPassword(event.currentTarget.value)\n }\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.newPassword}\n required\n controlId=\"puzzle-auth-change-password\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"new-password\"\n value={newPassword}\n onChange={(event) => setNewPassword(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.confirmPassword}\n required\n controlId=\"puzzle-auth-change-password-confirm\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"new-password\"\n value={confirmation}\n onChange={(event) => setConfirmation(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <Button\n type=\"submit\"\n loading={loading}\n disabled={!currentPassword || !newPassword || !confirmation}\n >\n {messages.changePassword}\n </Button>\n </form>\n )}\n </section>\n );\n};\n\nexport type AuthFormProps = {\n readonly className?: string;\n readonly redirectTo?: string;\n readonly onSuccess?: () => void;\n};\n\nexport type SignInFormProps = AuthFormProps & {\n readonly onForgotPassword?: () => void;\n readonly onSignUp?: () => void;\n};\n\nconst SignInForm = ({\n className,\n redirectTo,\n onSuccess,\n onForgotPassword,\n onSignUp,\n}: SignInFormProps) => {\n const { signIn, signInWithPasskey, messages, client } = useAuth();\n\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n setLoading(true);\n\n try {\n const result = await signIn({ email, password });\n\n if (result.status === \"authenticated\") {\n onSuccess?.();\n redirectAfterSuccess(redirectTo);\n }\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasskey = async () => {\n setError(null);\n setLoading(true);\n\n try {\n const result = await signInWithPasskey();\n\n if (result.status === \"authenticated\") {\n onSuccess?.();\n redirectAfterSuccess(redirectTo);\n }\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.signIn}</h1>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit} noValidate>\n <FormField\n label={messages.email}\n required\n controlId=\"puzzle-auth-email\"\n >\n <TextInput\n type=\"email\"\n name=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(event) => setEmail(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.password}\n required\n controlId=\"puzzle-auth-password\"\n >\n <TextInput\n type=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(event) => setPassword(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n {onForgotPassword && (\n <button\n className=\"puzzle-auth__text-button\"\n type=\"button\"\n onClick={onForgotPassword}\n >\n {messages.forgotPassword}\n </button>\n )}\n\n <Button\n type=\"submit\"\n fullWidth\n loading={loading}\n disabled={!email.trim() || !password}\n >\n {loading ? messages.signingIn : messages.submit}\n </Button>\n </form>\n\n {client.isPasskeySupported() && (\n <Button\n variant=\"outline\"\n fullWidth\n disabled={loading}\n onClick={handlePasskey}\n >\n {messages.usePasskey}\n </Button>\n )}\n\n {onSignUp && (\n <footer className=\"puzzle-auth__footer\">\n <span>{messages.noAccount}</span>\n <button\n type=\"button\"\n className=\"puzzle-auth__text-button\"\n onClick={onSignUp}\n >\n {messages.createAccount}\n </button>\n </footer>\n )}\n </section>\n );\n};\n\nexport type SignUpFormProps = AuthFormProps & {\n readonly onSignIn?: () => void;\n};\n\nconst SignUpForm = ({\n className,\n redirectTo,\n onSuccess,\n onSignIn,\n}: SignUpFormProps) => {\n const { signUp, messages } = useAuth();\n\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmation, setConfirmation] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n if (password !== confirmation) {\n setError(messages.passwordMismatch);\n return;\n }\n\n if (!password) {\n setError(messages.passwordRequired);\n return;\n }\n\n setLoading(true);\n\n try {\n const result = await signUp({\n name: name.trim() || null,\n email,\n password,\n });\n\n if (result.status === \"authenticated\") {\n onSuccess?.();\n redirectAfterSuccess(redirectTo);\n }\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.signUp}</h1>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit} noValidate>\n <FormField label={messages.name} controlId=\"puzzle-auth-name\">\n <TextInput\n name=\"name\"\n autoComplete=\"name\"\n value={name}\n onChange={(event) => setName(event.currentTarget.value)}\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.email}\n required\n controlId=\"puzzle-auth-signup-email\"\n >\n <TextInput\n type=\"email\"\n name=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(event) => setEmail(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.password}\n required\n controlId=\"puzzle-auth-signup-password\"\n >\n <TextInput\n type=\"password\"\n name=\"new-password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(event) => setPassword(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <FormField\n label={messages.confirmPassword}\n required\n controlId=\"puzzle-auth-confirm-password\"\n >\n <TextInput\n type=\"password\"\n name=\"confirm-password\"\n autoComplete=\"new-password\"\n value={confirmation}\n onChange={(event) => setConfirmation(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <Button\n type=\"submit\"\n fullWidth\n loading={loading}\n disabled={!email.trim() || !password || !confirmation}\n >\n {loading ? messages.signingUp : messages.createAccount}\n </Button>\n </form>\n\n {onSignIn && (\n <footer className=\"puzzle-auth__footer\">\n <span>{messages.existingAccount}</span>\n <button\n type=\"button\"\n className=\"puzzle-auth__text-button\"\n onClick={onSignIn}\n >\n {messages.signIn}\n </button>\n </footer>\n )}\n </section>\n );\n};\n\nexport type MfaChallengeFormProps = AuthFormProps;\n\nconst MfaChallengeForm = ({\n className,\n redirectTo,\n onSuccess,\n}: MfaChallengeFormProps) => {\n const {\n snapshot,\n verifyMfaTotp,\n verifyMfaRecoveryCode,\n verifyMfaWithPasskey,\n client,\n messages,\n } = useAuth();\n\n const [code, setCode] = useState(\"\");\n const [recoveryMode, setRecoveryMode] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const finish = (result: AuthClientSnapshot) => {\n if (result.status === \"authenticated\") {\n onSuccess?.();\n redirectAfterSuccess(redirectTo);\n }\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n setLoading(true);\n\n try {\n const result = recoveryMode\n ? await verifyMfaRecoveryCode(code)\n : await verifyMfaTotp(code);\n\n finish(result);\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasskey = async () => {\n setError(null);\n setLoading(true);\n\n try {\n finish(await verifyMfaWithPasskey());\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n if (\n snapshot.status !== \"mfa-pending\" &&\n snapshot.status !== \"step-up-pending\"\n ) {\n return null;\n }\n\n const availableFactors = snapshot.mfa?.availableFactors;\n\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n <header className=\"puzzle-auth__header\">\n <h1>{messages.mfaTitle}</h1>\n <p>{messages.mfaDescription}</p>\n </header>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n <form className=\"puzzle-auth__form\" onSubmit={handleSubmit} noValidate>\n <FormField\n label={\n recoveryMode ? messages.recoveryCode : messages.verificationCode\n }\n required\n controlId=\"puzzle-auth-mfa-code\"\n >\n <TextInput\n name=\"code\"\n type=\"text\"\n autoComplete=\"one-time-code\"\n value={code}\n onChange={(event) => setCode(event.currentTarget.value)}\n required\n disabled={loading}\n />\n </FormField>\n\n <Button\n type=\"submit\"\n fullWidth\n loading={loading}\n disabled={!code.trim()}\n >\n {loading ? messages.verifying : messages.verify}\n </Button>\n </form>\n\n <div className=\"puzzle-auth__actions\">\n {availableFactors?.includes(\"recovery-code\") && (\n <button\n type=\"button\"\n className=\"puzzle-auth__text-button\"\n onClick={() => {\n setRecoveryMode((current) => !current);\n setCode(\"\");\n setError(null);\n }}\n >\n {recoveryMode\n ? messages.useAuthenticator\n : messages.useRecoveryCode}\n </button>\n )}\n\n {availableFactors?.includes(\"passkey\") &&\n client.isPasskeySupported() && (\n <Button\n variant=\"outline\"\n fullWidth\n disabled={loading}\n onClick={handlePasskey}\n >\n {messages.usePasskey}\n </Button>\n )}\n </div>\n </section>\n );\n};\n\nexport type AuthScreenProps = AuthFormProps & {\n readonly mode?: \"sign-in\" | \"sign-up\";\n readonly children?: ReactNode;\n readonly onForgotPassword?: () => void;\n};\n\nconst AuthScreen = ({\n mode = \"sign-in\",\n className,\n redirectTo,\n onSuccess,\n onForgotPassword,\n children,\n}: AuthScreenProps) => {\n const { snapshot, messages, signOut } = useAuth();\n\n if (snapshot.status === \"loading\") {\n return (\n <div\n className={`puzzle-auth ${className ?? \"\"}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {messages.loading}\n </div>\n );\n }\n\n if (\n snapshot.status === \"mfa-pending\" ||\n snapshot.status === \"step-up-pending\"\n ) {\n return (\n <MfaChallengeForm\n className={className}\n redirectTo={redirectTo}\n onSuccess={onSuccess}\n />\n );\n }\n\n if (snapshot.status === \"authenticated\") {\n return (\n <section className={`puzzle-auth ${className ?? \"\"}`}>\n {children ?? (\n <>\n <p>{messages.authenticated}</p>\n {snapshot.user && <p>{snapshot.user.email}</p>}\n </>\n )}\n <Button variant=\"outline\" onClick={() => void signOut()}>\n {messages.signOut}\n </Button>\n </section>\n );\n }\n\n if (\n snapshot.status === \"mfa-enrollment-required\" ||\n snapshot.status === \"mfa-enrollment-pending\"\n ) {\n return <RequiredMfaEnrollment className={className} />;\n }\n\n return mode === \"sign-up\" ? (\n <SignUpForm\n className={className}\n redirectTo={redirectTo}\n onSuccess={onSuccess}\n />\n ) : (\n <SignInForm\n className={className}\n redirectTo={redirectTo}\n onSuccess={onSuccess}\n onForgotPassword={onForgotPassword}\n />\n );\n};\n\nexport type MfaSettingsProps = {\n readonly className?: string;\n};\n\nconst MfaSettings = ({ className }: MfaSettingsProps) => {\n const { client, messages } = useAuth();\n\n const [factors, setFactors] = useState<Awaited<\n ReturnType<AuthClient[\"listMfaFactors\"]>\n > | null>(null);\n\n const [enrollment, setEnrollment] = useState<AuthClientTotpEnrollment | null>(\n null,\n );\n\n const [recoveryCodes, setRecoveryCodes] = useState<readonly string[]>([]);\n\n const [password, setPassword] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const loadFactors = useCallback(async () => {\n setFactors(await client.listMfaFactors());\n }, [client]);\n\n useEffect(() => {\n void loadFactors().catch((cause: unknown) => {\n setError(\n cause instanceof Error ? cause.message : messages.unexpectedError,\n );\n });\n }, [loadFactors, messages.unexpectedError]);\n\n const beginTotp = async () => {\n setError(null);\n setLoading(true);\n\n try {\n setEnrollment(await client.beginTotpEnrollment(password));\n setPassword(\"\");\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const finishTotp = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!enrollment) return;\n\n setError(null);\n setLoading(true);\n\n try {\n const result = await client.verifyTotpEnrollment(\n enrollment.factorId,\n code,\n );\n\n setRecoveryCodes(result.recoveryCodes);\n setEnrollment(null);\n setCode(\"\");\n await loadFactors();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const addPasskey = async () => {\n setError(null);\n setLoading(true);\n\n try {\n const result = await client.registerPasskey(password);\n setRecoveryCodes(result.recoveryCodes);\n setPassword(\"\");\n await loadFactors();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const removeFactor = async (factorId: string) => {\n setError(null);\n setLoading(true);\n\n try {\n await client.removeMfaFactor(factorId, password);\n setPassword(\"\");\n await loadFactors();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n const regenerateCodes = async () => {\n setError(null);\n setLoading(true);\n\n try {\n const result = await client.regenerateRecoveryCodes(password);\n setRecoveryCodes(result.recoveryCodes);\n setPassword(\"\");\n await loadFactors();\n } catch (cause) {\n setError(getErrorMessage(cause, messages));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section className={`puzzle-auth puzzle-auth--settings ${className ?? \"\"}`}>\n <h2>{messages.mfaSettings}</h2>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {factors && (\n <ul className=\"puzzle-auth__factor-list\">\n {factors.factors.map((factor) => (\n <li key={factor.id}>\n <div>\n <strong>{factor.label}</strong>\n <span>{factor.type}</span>\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={loading}\n onClick={() => void removeFactor(factor.id)}\n >\n {messages.removeFactor}\n </Button>\n </li>\n ))}\n </ul>\n )}\n\n {!enrollment && (\n <FormField\n label={messages.currentPassword}\n controlId=\"puzzle-auth-settings-password\"\n >\n <TextInput\n type=\"password\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(event) => setPassword(event.currentTarget.value)}\n disabled={loading}\n />\n </FormField>\n )}\n\n {enrollment ? (\n <form className=\"puzzle-auth__form\" onSubmit={finishTotp}>\n <FormField label={messages.totpSecret}>\n <TextInput\n readOnly\n value={enrollment.secret}\n aria-label={messages.totpSecret}\n />\n </FormField>\n\n <p>\n <a href={enrollment.otpauthUrl}>Open authenticator application</a>\n </p>\n\n <FormField\n label={messages.verificationCode}\n controlId=\"puzzle-auth-enrollment-code\"\n >\n <TextInput\n value={code}\n autoComplete=\"one-time-code\"\n onChange={(event) => setCode(event.currentTarget.value)}\n required\n />\n </FormField>\n\n <Button type=\"submit\" loading={loading} disabled={!code.trim()}>\n {messages.verifyTotp}\n </Button>\n\n <Button\n variant=\"ghost\"\n disabled={loading}\n onClick={() => setEnrollment(null)}\n >\n {messages.cancel}\n </Button>\n </form>\n ) : (\n <div className=\"puzzle-auth__actions\">\n <Button\n variant=\"outline\"\n disabled={loading || !password}\n onClick={() => void beginTotp()}\n >\n {messages.addTotp}\n </Button>\n\n {client.isPasskeySupported() && (\n <Button\n variant=\"outline\"\n disabled={loading || !password}\n onClick={() => void addPasskey()}\n >\n {messages.addPasskey}\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n disabled={loading || !password}\n onClick={() => void regenerateCodes()}\n >\n {messages.recoveryCodes}\n </Button>\n </div>\n )}\n\n {recoveryCodes.length > 0 && (\n <div className=\"puzzle-auth__recovery-codes\">\n <Alert severity=\"warning\" title={messages.recoveryCodes}>\n {messages.saveRecoveryCodes}\n </Alert>\n\n <ul>\n {recoveryCodes.map((recoveryCode) => (\n <li key={recoveryCode}>\n <code>{recoveryCode}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n </section>\n );\n};\n\nexport {\n AuthProvider,\n useAuth,\n useSession,\n useUser,\n SignInForm,\n SignUpForm,\n MfaChallengeForm,\n AuthScreen,\n MfaSettings,\n PasswordResetRequestForm,\n PasswordResetForm,\n EmailVerificationNotice,\n ChangePasswordForm,\n RequiredMfaEnrollment,\n EmailVerificationForm,\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { AuthClientMfaState, AuthClientOptions, AuthClientSnapshot, AuthClientStatus, AuthClientUser } from "../shared/index.cjs";
|
|
2
|
+
import { AuthClient } from "./index.cjs";
|
|
3
|
+
import { AuthLocale, AuthMessageOverrides, AuthMessages } from "./messages.cjs";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
export type AuthProviderProps = {
|
|
6
|
+
readonly children: ReactNode;
|
|
7
|
+
readonly client?: AuthClient;
|
|
8
|
+
readonly options?: AuthClientOptions;
|
|
9
|
+
readonly initialSnapshot?: AuthClientSnapshot;
|
|
10
|
+
readonly locale?: string;
|
|
11
|
+
readonly messages?: AuthMessageOverrides;
|
|
12
|
+
readonly onAuthStateChange?: (snapshot: AuthClientSnapshot) => void;
|
|
13
|
+
};
|
|
14
|
+
export type AuthContextValue = {
|
|
15
|
+
readonly client: AuthClient;
|
|
16
|
+
readonly snapshot: AuthClientSnapshot;
|
|
17
|
+
readonly messages: AuthMessages;
|
|
18
|
+
readonly locale: AuthLocale;
|
|
19
|
+
readonly error: Error | null;
|
|
20
|
+
readonly isLoading: boolean;
|
|
21
|
+
readonly isAuthenticated: boolean;
|
|
22
|
+
readonly isPendingMfa: boolean;
|
|
23
|
+
refresh: () => Promise<AuthClientSnapshot>;
|
|
24
|
+
signIn: AuthClient["signIn"];
|
|
25
|
+
signUp: AuthClient["register"];
|
|
26
|
+
signOut: AuthClient["signOut"];
|
|
27
|
+
verifyMfaTotp: AuthClient["verifyMfaTotp"];
|
|
28
|
+
verifyMfaRecoveryCode: AuthClient["verifyMfaRecoveryCode"];
|
|
29
|
+
signInWithPasskey: AuthClient["signInWithPasskey"];
|
|
30
|
+
verifyMfaWithPasskey: AuthClient["verifyMfaWithPasskey"];
|
|
31
|
+
requestEmailVerification: AuthClient["requestEmailVerification"];
|
|
32
|
+
verifyEmail: AuthClient["verifyEmail"];
|
|
33
|
+
requestPasswordReset: AuthClient["requestPasswordReset"];
|
|
34
|
+
resetPassword: AuthClient["resetPassword"];
|
|
35
|
+
changePassword: AuthClient["changePassword"];
|
|
36
|
+
};
|
|
37
|
+
declare const AuthProvider: ({ children, client: suppliedClient, options, initialSnapshot, locale: localeInput, messages: messageOverrides, onAuthStateChange }: AuthProviderProps) => import("react").JSX.Element;
|
|
38
|
+
declare const useAuth: () => AuthContextValue;
|
|
39
|
+
declare const useSession: () => {
|
|
40
|
+
status: AuthClientStatus;
|
|
41
|
+
mfa: AuthClientMfaState | undefined;
|
|
42
|
+
isLoading: boolean;
|
|
43
|
+
isAuthenticated: boolean;
|
|
44
|
+
};
|
|
45
|
+
declare const useUser: () => AuthClientUser | null;
|
|
46
|
+
export type AuthFormProps = {
|
|
47
|
+
readonly className?: string;
|
|
48
|
+
readonly redirectTo?: string;
|
|
49
|
+
readonly onSuccess?: () => void;
|
|
50
|
+
};
|
|
51
|
+
export type SignInFormProps = AuthFormProps & {
|
|
52
|
+
readonly onForgotPassword?: () => void;
|
|
53
|
+
readonly onSignUp?: () => void;
|
|
54
|
+
};
|
|
55
|
+
declare const SignInForm: ({ className, redirectTo, onSuccess, onForgotPassword, onSignUp }: SignInFormProps) => import("react").JSX.Element;
|
|
56
|
+
export type SignUpFormProps = AuthFormProps & {
|
|
57
|
+
readonly onSignIn?: () => void;
|
|
58
|
+
};
|
|
59
|
+
declare const SignUpForm: ({ className, redirectTo, onSuccess, onSignIn }: SignUpFormProps) => import("react").JSX.Element;
|
|
60
|
+
export type MfaChallengeFormProps = AuthFormProps;
|
|
61
|
+
declare const MfaChallengeForm: ({ className, redirectTo, onSuccess }: MfaChallengeFormProps) => import("react").JSX.Element | null;
|
|
62
|
+
export type AuthScreenProps = AuthFormProps & {
|
|
63
|
+
readonly mode?: "sign-in" | "sign-up";
|
|
64
|
+
readonly children?: ReactNode;
|
|
65
|
+
readonly onForgotPassword?: () => void;
|
|
66
|
+
};
|
|
67
|
+
declare const AuthScreen: ({ mode, className, redirectTo, onSuccess, onForgotPassword, children }: AuthScreenProps) => import("react").JSX.Element;
|
|
68
|
+
export type MfaSettingsProps = {
|
|
69
|
+
readonly className?: string;
|
|
70
|
+
};
|
|
71
|
+
declare const MfaSettings: ({ className }: MfaSettingsProps) => import("react").JSX.Element;
|
|
72
|
+
export { AuthProvider, AuthScreen, MfaChallengeForm, MfaSettings, SignInForm, SignUpForm, useAuth, useSession, useUser };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { AuthClientMfaState, AuthClientOptions, AuthClientSnapshot, AuthClientStatus, AuthClientUser } from "../shared/index.js";
|
|
2
|
+
import { AuthClient } from "./index.js";
|
|
3
|
+
import { AuthLocale, AuthMessageOverrides, AuthMessages } from "./messages.js";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
export type AuthProviderProps = {
|
|
6
|
+
readonly children: ReactNode;
|
|
7
|
+
readonly client?: AuthClient;
|
|
8
|
+
readonly options?: AuthClientOptions;
|
|
9
|
+
readonly initialSnapshot?: AuthClientSnapshot;
|
|
10
|
+
readonly locale?: string;
|
|
11
|
+
readonly messages?: AuthMessageOverrides;
|
|
12
|
+
readonly onAuthStateChange?: (snapshot: AuthClientSnapshot) => void;
|
|
13
|
+
};
|
|
14
|
+
export type AuthContextValue = {
|
|
15
|
+
readonly client: AuthClient;
|
|
16
|
+
readonly snapshot: AuthClientSnapshot;
|
|
17
|
+
readonly messages: AuthMessages;
|
|
18
|
+
readonly locale: AuthLocale;
|
|
19
|
+
readonly error: Error | null;
|
|
20
|
+
readonly isLoading: boolean;
|
|
21
|
+
readonly isAuthenticated: boolean;
|
|
22
|
+
readonly isPendingMfa: boolean;
|
|
23
|
+
refresh: () => Promise<AuthClientSnapshot>;
|
|
24
|
+
signIn: AuthClient["signIn"];
|
|
25
|
+
signUp: AuthClient["register"];
|
|
26
|
+
signOut: AuthClient["signOut"];
|
|
27
|
+
verifyMfaTotp: AuthClient["verifyMfaTotp"];
|
|
28
|
+
verifyMfaRecoveryCode: AuthClient["verifyMfaRecoveryCode"];
|
|
29
|
+
signInWithPasskey: AuthClient["signInWithPasskey"];
|
|
30
|
+
verifyMfaWithPasskey: AuthClient["verifyMfaWithPasskey"];
|
|
31
|
+
requestEmailVerification: AuthClient["requestEmailVerification"];
|
|
32
|
+
verifyEmail: AuthClient["verifyEmail"];
|
|
33
|
+
requestPasswordReset: AuthClient["requestPasswordReset"];
|
|
34
|
+
resetPassword: AuthClient["resetPassword"];
|
|
35
|
+
changePassword: AuthClient["changePassword"];
|
|
36
|
+
};
|
|
37
|
+
declare const AuthProvider: ({ children, client: suppliedClient, options, initialSnapshot, locale: localeInput, messages: messageOverrides, onAuthStateChange }: AuthProviderProps) => import("react").JSX.Element;
|
|
38
|
+
declare const useAuth: () => AuthContextValue;
|
|
39
|
+
declare const useSession: () => {
|
|
40
|
+
status: AuthClientStatus;
|
|
41
|
+
mfa: AuthClientMfaState | undefined;
|
|
42
|
+
isLoading: boolean;
|
|
43
|
+
isAuthenticated: boolean;
|
|
44
|
+
};
|
|
45
|
+
declare const useUser: () => AuthClientUser | null;
|
|
46
|
+
export type AuthFormProps = {
|
|
47
|
+
readonly className?: string;
|
|
48
|
+
readonly redirectTo?: string;
|
|
49
|
+
readonly onSuccess?: () => void;
|
|
50
|
+
};
|
|
51
|
+
export type SignInFormProps = AuthFormProps & {
|
|
52
|
+
readonly onForgotPassword?: () => void;
|
|
53
|
+
readonly onSignUp?: () => void;
|
|
54
|
+
};
|
|
55
|
+
declare const SignInForm: ({ className, redirectTo, onSuccess, onForgotPassword, onSignUp }: SignInFormProps) => import("react").JSX.Element;
|
|
56
|
+
export type SignUpFormProps = AuthFormProps & {
|
|
57
|
+
readonly onSignIn?: () => void;
|
|
58
|
+
};
|
|
59
|
+
declare const SignUpForm: ({ className, redirectTo, onSuccess, onSignIn }: SignUpFormProps) => import("react").JSX.Element;
|
|
60
|
+
export type MfaChallengeFormProps = AuthFormProps;
|
|
61
|
+
declare const MfaChallengeForm: ({ className, redirectTo, onSuccess }: MfaChallengeFormProps) => import("react").JSX.Element | null;
|
|
62
|
+
export type AuthScreenProps = AuthFormProps & {
|
|
63
|
+
readonly mode?: "sign-in" | "sign-up";
|
|
64
|
+
readonly children?: ReactNode;
|
|
65
|
+
readonly onForgotPassword?: () => void;
|
|
66
|
+
};
|
|
67
|
+
declare const AuthScreen: ({ mode, className, redirectTo, onSuccess, onForgotPassword, children }: AuthScreenProps) => import("react").JSX.Element;
|
|
68
|
+
export type MfaSettingsProps = {
|
|
69
|
+
readonly className?: string;
|
|
70
|
+
};
|
|
71
|
+
declare const MfaSettings: ({ className }: MfaSettingsProps) => import("react").JSX.Element;
|
|
72
|
+
export { AuthProvider, AuthScreen, MfaChallengeForm, MfaSettings, SignInForm, SignUpForm, useAuth, useSession, useUser };
|