import { useMutation, useSuspenseQuery } from '@tanstack/react-query' import { createFileRoute } from '@tanstack/react-router' import { orpc } from '@/client/orpc' import { useInvalidateTodos } from '@/client/queries/todo' import { TodoForm } from '@/components/TodoForm' import { TodoItem } from '@/components/TodoItem' export const Route = createFileRoute('/')({ component: Todos, loader: async ({ context }) => { await context.queryClient.ensureQueryData(orpc.todo.list.queryOptions()) }, }) function Todos() { const listQuery = useSuspenseQuery(orpc.todo.list.queryOptions()) const invalidateTodos = useInvalidateTodos() const createMutation = useMutation(orpc.todo.create.mutationOptions({ onSuccess: invalidateTodos })) const updateMutation = useMutation(orpc.todo.update.mutationOptions({ onSuccess: invalidateTodos })) const deleteMutation = useMutation(orpc.todo.remove.mutationOptions({ onSuccess: invalidateTodos })) const todos = listQuery.data const completedCount = todos.filter((todo) => todo.completed).length const totalCount = todos.length const progress = totalCount > 0 ? (completedCount / totalCount) * 100 : 0 return (

我的待办

保持专注,逐个击破

{completedCount} /{totalCount}
已完成
createMutation.mutate({ title })} isPending={createMutation.isPending} /> {totalCount > 0 && (
)}
{todos.length === 0 ? (

没有待办事项

输入上方内容添加您的第一个任务

) : ( todos.map((todo) => ( updateMutation.mutate({ id, data: { completed: !completed } })} onDelete={(id) => deleteMutation.mutate({ id })} /> )) )}
) }