import { useMutation, useSuspenseQuery } from '@tanstack/react-query' import { createFileRoute } from '@tanstack/react-router' import type { ChangeEventHandler, FormEventHandler } from 'react' import { useState } from 'react' import { orpc } from '@/client/query-client' export const Route = createFileRoute('/')({ component: Todos, loader: async ({ context }) => { await context.queryClient.ensureQueryData(orpc.todo.list.queryOptions()) }, }) function Todos() { const [newTodoTitle, setNewTodoTitle] = useState('') const listQuery = useSuspenseQuery(orpc.todo.list.queryOptions()) const createMutation = useMutation(orpc.todo.create.mutationOptions()) const updateMutation = useMutation(orpc.todo.update.mutationOptions()) const deleteMutation = useMutation(orpc.todo.remove.mutationOptions()) const handleCreateTodo: FormEventHandler = (e) => { e.preventDefault() if (newTodoTitle.trim()) { createMutation.mutate({ title: newTodoTitle.trim() }) setNewTodoTitle('') } } const handleInputChange: ChangeEventHandler = (e) => { setNewTodoTitle(e.target.value) } const handleToggleTodo = (id: string, currentCompleted: boolean) => { updateMutation.mutate({ id, data: { completed: !currentCompleted }, }) } const handleDeleteTodo = (id: string) => { deleteMutation.mutate({ id }) } 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 (
{/* Header */}

我的待办

保持专注,逐个击破

{completedCount} /{totalCount}
已完成
{/* Add Todo Form */}
{/* Progress Bar (Only visible when there are tasks) */} {totalCount > 0 && (
)} {/* Todo List */}
{todos.length === 0 ? (

没有待办事项

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

) : ( todos.map((todo) => (

{todo.title}

{new Date(todo.createdAt).toLocaleDateString('zh-CN')}
)) )}
) }