Spaces:
Paused
Paused
| 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> | |
| ); | |
| }; | |