import { QueryClient } from '@tanstack/react-query'; import { createTRPCClient, httpLink } from '@trpc/client'; import { createTRPCOptionsProxy } from '@trpc/tanstack-react-query'; import superjson from 'superjson'; import { TRPCProvider } from '@/integrations/trpc/react'; import type { AppRouter } from '@openpanel/trpc'; import { createIsomorphicFn } from '@tanstack/react-start'; import { getRequestHeaders } from '@tanstack/react-start/server'; import { useMemo } from 'react'; export const getIsomorphicHeaders = createIsomorphicFn() .server(() => { return getRequestHeaders(); }) .client(() => { return {}; }); // Create a function that returns a tRPC client with optional cookies export function createTRPCClientWithHeaders(apiUrl: string) { return createTRPCClient({ links: [ httpLink({ transformer: superjson, url: `${apiUrl}/trpc`, headers: () => getIsomorphicHeaders(), fetch: (url, options) => { return fetch(url, { ...options, mode: 'cors', credentials: 'include', }); }, }), ], }); } export function getContext(apiUrl: string) { const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 1000 * 60 * 5, gcTime: 1000 * 60 * 10, refetchOnReconnect: false, }, dehydrate: { serializeData: superjson.serialize }, hydrate: { deserializeData: superjson.deserialize }, }, }); // Create a tRPC client with cookies if provided const client = createTRPCClientWithHeaders(apiUrl); const serverHelpers = createTRPCOptionsProxy({ client: client, queryClient: queryClient, }); return { queryClient, trpc: serverHelpers, }; } export function Provider({ children, queryClient, apiUrl, }: { children: React.ReactNode; queryClient: QueryClient; apiUrl: string; }) { const trpcClient = useMemo( () => createTRPCClientWithHeaders(apiUrl), [apiUrl], ); return ( {children} ); }