import type { AppAuthOAuthStrategy, AppAuthSchema } from "auth/auth-schema"; import clsx from "clsx"; import { NativeForm } from "ui/components/form/native-form/NativeForm"; import { transformObject } from "bknd/utils"; import { useEffect, useState, type ComponentPropsWithoutRef, type FormEvent } from "react"; import { Button } from "ui/components/buttons/Button"; import { Group, Input, Password, Label } from "ui/components/form/Formy/components"; import { SocialLink } from "./SocialLink"; import { useAuth } from "bknd/client"; import { Alert } from "ui/components/display/Alert"; import { useLocation } from "wouter"; export type LoginFormProps = Omit, "action"> & { className?: string; formData?: any; action: "login" | "register"; method?: "POST" | "GET"; auth?: Partial>; buttonLabel?: string; }; export function AuthForm({ formData, className, method = "POST", action, auth, buttonLabel = action === "login" ? "Sign in" : "Sign up", onSubmit: _onSubmit, ...props }: LoginFormProps) { const $auth = useAuth(); const basepath = auth?.basepath ?? "/api/auth"; const [error, setError] = useState(); const [, navigate] = useLocation(); const password = { action: `${basepath}/password/${action}`, strategy: auth?.strategies?.password ?? ({ type: "password" } as const), }; const oauth = transformObject(auth?.strategies ?? {}, (value) => { return value.type !== "password" ? value.config : undefined; }) as Record; const has_oauth = Object.keys(oauth).length > 0; async function onSubmit( data: any, ctx: { event: FormEvent; form: HTMLFormElement }, ) { if ($auth?.local) { ctx.event.preventDefault(); const res = await $auth.login(data); if ("token" in res) { navigate("/"); } else { setError((res as any).error); return; } } await _onSubmit?.(ctx.event); // submit form ctx.form.submit(); } useEffect(() => { if ($auth.user) { navigate("/"); } }, [$auth.user]); return (
{has_oauth && ( <>
{Object.entries(oauth)?.map(([name, oauth], key) => ( ))}
)} {error && }
); } const Or = () => (
or
);