"use client"; import { useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { ActionButton } from "@/components/ui/action-button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useClientConfig } from "@/lib/clientConfig"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; import { TRPCClientError } from "@trpc/client"; import { signIn } from "next-auth/react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zSignUpSchema } from "@karakeep/shared/types/users"; const signInSchema = z.object({ email: z.string().email(), password: z.string(), }); const SIGNIN_FAILED = "Incorrect email or password"; const OAUTH_FAILED = "OAuth login failed: "; const VERIFY_EMAIL_ERROR = "Please verify your email address before signing in"; function SignIn() { const [signinError, setSigninError] = useState(""); const router = useRouter(); const searchParams = useSearchParams(); const clientConfig = useClientConfig(); const oAuthError = searchParams.get("error"); if (oAuthError && !signinError) { setSigninError(`${OAUTH_FAILED} ${oAuthError}`); } const form = useForm>({ resolver: zodResolver(signInSchema), }); if (clientConfig.auth.disablePasswordAuth) { return ( <> {signinError && (

{signinError}

)}

Password authentication is currently disabled.

); } return (
{ const resp = await signIn("credentials", { redirect: false, email: value.email.trim(), password: value.password, }); if (!resp || !resp?.ok || resp.error) { if (resp?.error === "CredentialsSignin") { setSigninError(SIGNIN_FAILED); } else if (resp?.error === VERIFY_EMAIL_ERROR) { router.replace( `/check-email?email=${encodeURIComponent(value.email.trim())}`, ); } else { setSigninError(resp?.error ?? SIGNIN_FAILED); } return; } router.replace("/"); })} >
{signinError && (

{signinError}

)} { return ( Email ); }} /> { return ( Password ); }} /> Sign In
); } function SignUp() { const form = useForm>({ resolver: zodResolver(zSignUpSchema), }); const [errorMessage, setErrorMessage] = useState(""); const router = useRouter(); const createUserMutation = api.users.create.useMutation(); return (
{ try { await createUserMutation.mutateAsync(value); } catch (e) { if (e instanceof TRPCClientError) { setErrorMessage(e.message); } return; } const resp = await signIn("credentials", { redirect: false, email: value.email.trim(), password: value.password, }); if (!resp || !resp.ok || resp.error) { if (resp?.error === VERIFY_EMAIL_ERROR) { router.replace( `/check-email?email=${encodeURIComponent(value.email.trim())}`, ); } else { setErrorMessage( resp?.error ?? "Hit an unexpected error while signing in", ); } return; } router.replace("/"); })} >
{errorMessage && (

{errorMessage}

)} { return ( Name ); }} /> { return ( Email ); }} /> { return ( Password ); }} /> { return ( Confirm Password ); }} /> Sign Up
); } export default function CredentialsForm() { const clientConfig = useClientConfig(); return ( Sign In Sign Up {clientConfig.auth.disableSignups || clientConfig.auth.disablePasswordAuth ? (

Signups are currently disabled.

) : ( )}
); }