import { gql } from '@apollo/client'; import { bookListQuery } from '@app/client/components/BookSearchList'; import { useToastMutation } from '@app/client/hooks/useToastMutation'; import { Heading, Input, Stack, Textarea } from '@chakra-ui/react'; import { Button } from '@client/components/ui/button'; import { Field } from '@client/components/ui/field'; import { CreateNewBookMutation } from '@generated/types'; import { valibotResolver } from '@hookform/resolvers/valibot'; import { createFileRoute, redirect, useNavigate } from '@tanstack/react-router'; import { useForm } from 'react-hook-form'; import * as v from 'valibot'; export const Route = createFileRoute('/new/book')({ component: RouteComponent, beforeLoad: ({ context }) => { if (!context.isAuthenticated) throw redirect({ to: '/' }); } }); function RouteComponent() { return ( New book ); } interface FormValues { title: string; description: string; } function NewBookForm() { const navigate = useNavigate(); const { update: bookCreate } = useToastMutation({ mutation: bookCreateMutation, successMsg: 'Book created successfully!', refetchQueries: [bookListQuery] }); const schema = v.pipe( v.object({ title: v.pipe(v.string(), v.nonEmpty('Title is required'), v.maxLength(60)), description: v.pipe(v.string(), v.nonEmpty('Description is required'), v.maxLength(900)) }) ); const { register, handleSubmit, formState: { errors } } = useForm({ resolver: valibotResolver(schema) }); return (
{ const { data } = await bookCreate({ variables: { input: { title: values.title, description: values.description } } }); if (data != null) navigate({ to: `/work/book/${data.bookCreate.id}/overview` }); })} >