import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { httpBatchLink, loggerLink } from '@trpc/client'; import { useNavigate } from 'react-router-dom'; import { useState } from 'react'; import { toast } from 'sonner'; import { isTRPCClientError, trpc } from '../utils/trpc'; import { getAuthCode, setAuthCode } from '../utils/auth'; import { enabledAuthCode, serverOriginUrl } from '../utils/env'; export const TrpcProvider: React.FC<{ children: React.ReactNode }> = ({ children, }) => { const navigate = useNavigate(); const handleNoAuth = () => { if (enabledAuthCode) { setAuthCode(''); navigate('/login'); } }; const [queryClient] = useState( () => new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, refetchOnReconnect: true, refetchIntervalInBackground: false, retryDelay: (retryCount) => Math.min(retryCount * 1000, 60 * 1000), retry(failureCount, error) { console.log('failureCount: ', failureCount); if (isTRPCClientError(error)) { if (error.data?.httpStatus === 401) { return false; } } return failureCount < 3; }, onError(error) { console.error('queries onError: ', error); if (isTRPCClientError(error)) { if (error.data?.httpStatus === 401) { toast.error('无权限', { description: error.message, }); handleNoAuth(); } else { toast.error('请求失败!', { description: error.message, }); } } }, }, mutations: { onError(error) { console.error('mutations onError: ', error); if (isTRPCClientError(error)) { if (error.data?.httpStatus === 401) { toast.error('无权限', { description: error.message, }); handleNoAuth(); } else { toast.error('请求失败!', { description: error.message, }); } } }, }, }, }), ); const [trpcClient] = useState(() => trpc.createClient({ links: [ loggerLink({ enabled: () => true, }), httpBatchLink({ url: serverOriginUrl + '/trpc', async headers() { const token = getAuthCode(); if (!token) { handleNoAuth(); return {}; } return token ? { Authorization: `${token}`, } : {}; }, }), ], }), ); return ( {children} ); };