'use client' import * as React from 'react' import { useRouter } from 'next/navigation' import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import * as z from 'zod' import { graphql } from '@/lib/gql/generates' import { useSignIn } from '@/lib/tabby/auth' import { useGraphQLForm } from '@/lib/tabby/gql' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' import { IconSpinner } from '@/components/ui/icons' import { Input } from '@/components/ui/input' export const tokenAuth = graphql(/* GraphQL */ ` mutation tokenAuth($email: String!, $password: String!) { tokenAuth(email: $email, password: $password) { accessToken refreshToken } } `) const formSchema = z.object({ email: z.string().email('Invalid email address'), password: z.string() }) interface UserAuthFormProps extends React.HTMLAttributes { invitationCode?: string } export default function UserSignInForm({ className, invitationCode, ...props }: UserAuthFormProps) { const form = useForm>({ resolver: zodResolver(formSchema) }) const router = useRouter() const signIn = useSignIn() const { isSubmitting } = form.formState const { onSubmit } = useGraphQLForm(tokenAuth, { onSuccess: async values => { if (await signIn(values.tokenAuth)) { router.replace('/') } }, onError: (path, message) => form.setError(path as any, { message }) }) return (
( Email )} /> ( Password )} />
) }