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