/** * tRPC Demo Component * * This component demonstrates how to use tRPC hooks for queries and mutations. * Can be used as a reference for migrating existing components. */ "use client"; import { Loader2, RefreshCw } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { trpc } from "@/lib/trpc-client"; export function TRPCDemo() { const [sessionFilters, setSessionFilters] = useState({ search: "", page: 1, limit: 5, }); // Queries const { data: sessions, isLoading: sessionsLoading, error: sessionsError, refetch: refetchSessions, } = trpc.dashboard.getSessions.useQuery(sessionFilters); const { data: overview, isLoading: overviewLoading } = trpc.dashboard.getOverview.useQuery({}); const { data: topQuestions, isLoading: questionsLoading } = trpc.dashboard.getTopQuestions.useQuery({ limit: 3 }); // Mutations const refreshSessionsMutation = trpc.dashboard.refreshSessions.useMutation({ onSuccess: (data) => { toast.success(data.message); // Invalidate and refetch sessions refetchSessions(); }, onError: (error) => { toast.error(`Failed to refresh sessions: ${error.message}`); }, }); const handleRefreshSessions = () => { refreshSessionsMutation.mutate(); }; const handleSearchChange = (search: string) => { setSessionFilters((prev) => ({ ...prev, search, page: 1 })); }; return (
{session.summary}
{session.questions && session.questions.length > 0 && (