"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 username or password"; const OAUTH_FAILED = "OAuth login failed: "; 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) { setSigninError(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) { setErrorMessage("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.

) : ( )}
); }