import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { trpc } from "@/lib/trpc"; import { Users, Plus, Edit2, Check, X, Trash2 } from "lucide-react"; import { DemoCard, LoadingSpinner, InlineSpinner, EmptyState, ItemRow, Avatar, } from "@/components/demo"; interface User { id: number; name: string; email: string; } export function UsersExample() { const [newName, setNewName] = useState(""); const [newEmail, setNewEmail] = useState(""); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(""); const [editEmail, setEditEmail] = useState(""); const utils = trpc.useUtils(); const { data: users, isLoading } = trpc.users.getAll.useQuery(); const createMutation = trpc.users.create.useMutation({ onSuccess: () => { utils.users.getAll.invalidate(); setNewName(""); setNewEmail(""); }, }); const updateMutation = trpc.users.update.useMutation({ onSuccess: () => { utils.users.getAll.invalidate(); setEditingId(null); }, }); const deleteMutation = trpc.users.delete.useMutation({ onSuccess: () => utils.users.getAll.invalidate(), }); const startEditing = (user: User) => { setEditingId(user.id); setEditName(user.name); setEditEmail(user.email); }; const handleCreate = () => { createMutation.mutate({ name: newName, email: newEmail }); }; const handleUpdate = (id: number) => { updateMutation.mutate({ id, name: editName, email: editEmail }); }; return ( {/* Create Form */} {/* Users List */} {isLoading ? ( ) : (
{users?.length === 0 && ( )} {users?.map((user) => ( startEditing(user)} onCancelEdit={() => setEditingId(null)} onSaveEdit={() => handleUpdate(user.id)} onDelete={() => deleteMutation.mutate({ id: user.id })} /> ))}
)}
); } // ============================================================================ // Sub-components // ============================================================================ interface CreateUserFormProps { name: string; email: string; onNameChange: (value: string) => void; onEmailChange: (value: string) => void; onSubmit: () => void; isLoading: boolean; } function CreateUserForm({ name, email, onNameChange, onEmailChange, onSubmit, isLoading, }: CreateUserFormProps) { return (
onNameChange(e.target.value)} placeholder="Name" className="flex-1" /> onEmailChange(e.target.value)} placeholder="Email" className="flex-1" />
); } interface UserRowProps { user: User; isEditing: boolean; editName: string; editEmail: string; onEditNameChange: (value: string) => void; onEditEmailChange: (value: string) => void; onStartEdit: () => void; onCancelEdit: () => void; onSaveEdit: () => void; onDelete: () => void; } function UserRow({ user, isEditing, editName, editEmail, onEditNameChange, onEditEmailChange, onStartEdit, onCancelEdit, onSaveEdit, onDelete, }: UserRowProps) { if (isEditing) { return ( onEditNameChange(e.target.value)} className="flex-1" /> onEditEmailChange(e.target.value)} className="flex-1" /> ); } return (
{user.name}
{user.email}
); }