"use client" import { AppRouter } from "@server/shared/trpc/trpc.instance" import { inferProcedureInput } from "@trpc/server" import { trpc } from "~/trpc/react" export function TodoList() { const utils = trpc.useUtils() const [todos, { refetch }] = trpc.todo.list.useSuspenseQuery({}) const addTodo = trpc.todo.create.useMutation({ async onSuccess() { // refetches posts after a post is added await utils.todo.list.invalidate() }, }) const deleteTodo = trpc.todo.delete.useMutation({ async onSuccess() { await utils.todo.list.invalidate() } }) const updateTodo = trpc.todo.update.useMutation({ async onSuccess() { await utils.todo.list.invalidate() } }) return (

Todo List

{ /** * In a real app you probably don't want to use this manually * Checkout React Hook Form - it works great with tRPC * @link https://react-hook-form.com/ * @link https://kitchen-sink.trpc.io/react-hook-form */ e.preventDefault() const $form = e.currentTarget const values = Object.fromEntries(new FormData($form)) type Input = inferProcedureInput // ^? const input: Input = { value: values.value as string, } try { await addTodo.mutateAsync(input) $form.reset() } catch (cause) { console.error({ cause }, 'Failed to add todo') } }} >
{addTodo.error && (

{addTodo.error.message}

)}
) }