/** * 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, error: overviewError, } = trpc.dashboard.getOverview.useQuery({}); const { data: topQuestions, isLoading: questionsLoading, error: questionsError, } = 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 (

tRPC Demo

{/* Overview Stats */}
Total Sessions {overviewError && (
Error: {overviewError.message}
)} {overviewLoading ? (
Loading...
) : (
{overview?.totalSessions || 0}
)}
Avg Messages {overviewError && (
Error: {overviewError.message}
)} {overviewLoading ? (
Loading...
) : (
{Math.round(overview?.avgMessagesSent || 0)}
)}
Sentiment Distribution {overviewError && (
Error: {overviewError.message}
)} {overviewLoading ? (
Loading...
) : (
{overview?.sentimentDistribution.map((item) => (
{item.sentiment} {item.count}
))}
)}
{/* Top Questions */} Top Questions {questionsError && (
Error loading questions: {questionsError.message}
)} {questionsLoading ? (
Loading questions...
) : (
{topQuestions?.map((item) => (
{item.question} {item.count}
))}
)}
{/* Sessions List */} Sessions
handleSearchChange(e.target.value)} className="w-64" />
{sessionsError && (
Error loading sessions: {sessionsError.message}
)} {sessionsLoading ? (
Loading sessions...
) : (
{sessions?.sessions.map((session) => (
Session {session.id} {session.sentiment}
{session.messagesSent} messages

{session.summary}

{session.questions && session.questions.length > 0 && (
{session.questions.slice(0, 3).map((question) => ( {question.length > 50 ? `${question.slice(0, 50)}...` : question} ))}
)}
))} {/* Pagination Info */} {sessions && (
Showing {sessions.sessions.length} of{" "} {sessions.pagination.totalCount} sessions (Page{" "} {sessions.pagination.page} of {sessions.pagination.totalPages} )
)}
)}
); }