Openstatus www.openstatus.dev
at 4c0f4c00a38753a5d0dfd7e7b7b7706dec6f1503 65 lines 2.0 kB view raw
1"use client"; 2 3import { endingLink } from "@/lib/trpc/shared"; 4import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; 5import { createTRPCClient, loggerLink } from "@trpc/client"; 6import { createTRPCContext } from "@trpc/tanstack-react-query"; 7import { useState } from "react"; 8 9import type { AppRouter } from "@openstatus/api"; 10 11export const { TRPCProvider, useTRPC, useTRPCClient } = 12 createTRPCContext<AppRouter>(); 13 14function makeQueryClient() { 15 return new QueryClient({ 16 defaultOptions: { 17 queries: { 18 // With SSR, we usually want to set some default staleTime 19 // above 0 to avoid refetching immediately on the client 20 staleTime: 60 * 1000, 21 }, 22 }, 23 }); 24} 25let browserQueryClient: QueryClient | undefined = undefined; 26function getQueryClient() { 27 if (typeof window === "undefined") { 28 // Server: always make a new query client 29 return makeQueryClient(); 30 } 31 // Browser: make a new query client if we don't already have one 32 // This is very important, so we don't re-make a new client if React 33 // suspends during the initial render. This may not be needed if we 34 // have a suspense boundary BELOW the creation of the query client 35 if (!browserQueryClient) browserQueryClient = makeQueryClient(); 36 return browserQueryClient; 37} 38 39export function TRPCReactProvider({ children }: { children: React.ReactNode }) { 40 const queryClient = getQueryClient(); 41 const [trpcClient] = useState(() => 42 createTRPCClient<AppRouter>({ 43 links: [ 44 loggerLink({ 45 enabled: (opts) => 46 process.env.NODE_ENV === "development" || 47 (opts.direction === "down" && opts.result instanceof Error), 48 }), 49 endingLink({ 50 headers: { 51 "x-trpc-source": "client", 52 }, 53 }), 54 ], 55 }), 56 ); 57 58 return ( 59 <QueryClientProvider client={queryClient}> 60 <TRPCProvider trpcClient={trpcClient} queryClient={queryClient}> 61 {children} 62 </TRPCProvider> 63 </QueryClientProvider> 64 ); 65}