panel-web/apps/user/components/providers.tsx
speakeloudest b0c8cfb024
Some checks failed
CI / build (20.15.1) (push) Failing after 55s
feat: 去除配置项等待
2025-12-10 04:41:15 -08:00

77 lines
2.0 KiB
TypeScript

'use client';
import useGlobalStore, { GlobalStore } from '@/config/use-global';
import { Logout } from '@/utils/common';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental';
import { ThemeProvider as NextThemesProvider } from 'next-themes';
import { usePathname } from 'next/navigation';
import React, { useEffect, useState } from 'react';
import Loading from './loading';
export default function Providers({
children,
common,
user,
}: {
children: React.ReactNode;
common: Partial<GlobalStore['common']>;
user: GlobalStore['user'];
}) {
const [loading, setLoading] = useState(true);
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 5 * 1000,
retry: false,
},
},
}),
);
const { setCommon, setUser } = useGlobalStore();
const pathname = usePathname();
const whiteList = ['/', '/register'];
const isWhite = whiteList.includes(pathname);
useEffect(() => {
const initializeData = async () => {
try {
if (user) {
setUser(user);
} else {
Logout();
}
setCommon(common);
} finally {
setTimeout(() => {
setLoading(false);
}, 1000);
}
};
initializeData();
}, [setUser, setCommon, user, common]);
useEffect(() => {
const searchParams = new URLSearchParams(location.search);
const invite = searchParams.get('invite');
if (invite) {
localStorage.setItem('invite', invite);
}
}, []);
return (
<NextThemesProvider attribute='class' defaultTheme='light' enableSystem>
<QueryClientProvider client={queryClient}>
<ReactQueryStreamedHydration>
<Loading loading={!isWhite && (loading || queryClient.isMutating() > 0)} />
{children}
</ReactQueryStreamedHydration>
</QueryClientProvider>
</NextThemesProvider>
);
}