div-wang's picture
上传文件
95d29a5 verified
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 (
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</trpc.Provider>
);
};