"use client";
import {
defaultShouldDehydrateQuery,
QueryClient,
QueryClientProvider,
} from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { FC, useEffect, useState } from "react";
import { Toaster } from "../../components/ui/toaster";
import { httpBatchLink } from "@trpc/client";
import { trpc } from "./client";
import { ClerkProvider } from "@clerk/nextjs";
import { esES } from "@clerk/localizations";
import { ReactNode } from "react";
import { useRouter } from "next/router";
interface ProviderProps {
children?: ReactNode;
}
const ProviderClient: FC<ProviderProps> = ({ children }) => {
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000 * 10,
},
dehydrate: {
shouldDehydrateQuery: (query) =>
defaultShouldDehydrateQuery(query) ||
query.state.status === "pending",
},
},
})
);
const getBaseUrl = () => {
if (typeof window !== "undefined") return ""; //browser whould use relative url
if (process.env.VERCEL_URL) {
return `https://${process.env.VERCEL_URL}`;
}
return `http://localhost:${process.env.PORT ?? 3000}`;
};
const [trpcClient] = useState(() =>
trpc.createClient({
links: [
httpBatchLink({
url: `${getBaseUrl()}/api/trpc`,
fetch(url, options) {
return fetch(url, {
...options,
credentials: "include",
});
},
}),
],
})
);
return (
<ClerkProvider
localization={esES}
publishableKey={process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY}
appearance={{
elements: {
footer: "hidden",
},
}}
>
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>
<div>{children}</div>
<Toaster />
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</trpc.Provider>
</ClerkProvider>
);
};
export default ProviderClient;