import { createFileRoute } from '@tanstack/solid-router' import { Trash2, Plus, Check, Circle } from 'lucide-solid' import { api } from '../../../convex/_generated/api' import type { Id } from '../../../convex/_generated/dataModel' import { createSignal, For, Show } from 'solid-js' import { useMutation, useQuery } from 'convex-solidjs' export const Route = createFileRoute('/demo/convex')({ ssr: false, component: ConvexTodos, }) function ConvexTodos() { const todos = useQuery(api.todos.list, () => ({})) const addTodo = useMutation(api.todos.add) const toggleTodo = useMutation(api.todos.toggle) const removeTodo = useMutation(api.todos.remove) const [newTodo, setNewTodo] = createSignal('') const handleAddTodo = async () => { if (newTodo().trim()) { await addTodo.mutate({ text: newTodo().trim() }) setNewTodo('') } } const handleToggleTodo = async (id: Id<'todos'>) => { await toggleTodo.mutate({ id }) } const handleRemoveTodo = async (id: Id<'todos'>) => { await removeTodo.mutate({ id }) } const completedCount = () => todos?.data()?.filter((todo) => todo.completed).length || 0 const totalCount = () => todos?.data()?.length || 0 return (

Convex

Todos

Powered by real-time sync

0}>
{completedCount()} completed {totalCount() - completedCount()} remaining
setNewTodo(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { handleAddTodo() } }} placeholder="What needs to be done?" class="demo-input min-w-0 flex-1" />

Loading todos...

No todos yet

Add your first todo above to get started!

} >
{(todo, index) => (
{todo.text}
)}

Built with Convex, real-time updates, and synced state.

) }