|
|
@@ -1,19 +1,106 @@
|
|
|
-import React from 'react'
|
|
|
+import { StrictMode } from 'react'
|
|
|
import ReactDOM from 'react-dom/client'
|
|
|
-import { RouterProvider } from 'react-router-dom'
|
|
|
-import { Toaster } from '@/components/ui/toaster'
|
|
|
-import { ThemeProvider } from '@/components/theme-provider'
|
|
|
-import { LanguageProvider } from '@/components/language-provider'
|
|
|
-import router from '@/router'
|
|
|
-import '@/index.css'
|
|
|
+import { AxiosError } from 'axios'
|
|
|
+import {
|
|
|
+ QueryCache,
|
|
|
+ QueryClient,
|
|
|
+ QueryClientProvider,
|
|
|
+} from '@tanstack/react-query'
|
|
|
+import { RouterProvider, createRouter } from '@tanstack/react-router'
|
|
|
+import { useAuthStore } from '@/stores/authStore'
|
|
|
+import { handleServerError } from '@/utils/handle-server-error'
|
|
|
+import { toast } from '@/hooks/use-toast'
|
|
|
+import { ThemeProvider } from './context/theme-context'
|
|
|
+import './index.css'
|
|
|
+// Generated Routes
|
|
|
+import { routeTree } from './routeTree.gen'
|
|
|
|
|
|
-ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
|
- <React.StrictMode>
|
|
|
- <ThemeProvider defaultTheme='dark' storageKey='vite-ui-theme'>
|
|
|
- <LanguageProvider defaultLanguage='en' storageKey='vite-ui-language'>
|
|
|
- <RouterProvider router={router} />
|
|
|
- <Toaster />
|
|
|
- </LanguageProvider>
|
|
|
- </ThemeProvider>
|
|
|
- </React.StrictMode>
|
|
|
-)
|
|
|
+const queryClient = new QueryClient({
|
|
|
+ defaultOptions: {
|
|
|
+ queries: {
|
|
|
+ retry: (failureCount, error) => {
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
+ if (import.meta.env.DEV) console.log({ failureCount, error })
|
|
|
+
|
|
|
+ if (failureCount >= 0 && import.meta.env.DEV) return false
|
|
|
+ if (failureCount > 3 && import.meta.env.PROD) return false
|
|
|
+
|
|
|
+ return !(
|
|
|
+ error instanceof AxiosError &&
|
|
|
+ [401, 403].includes(error.response?.status ?? 0)
|
|
|
+ )
|
|
|
+ },
|
|
|
+ refetchOnWindowFocus: import.meta.env.PROD,
|
|
|
+ staleTime: 10 * 1000, // 10s
|
|
|
+ },
|
|
|
+ mutations: {
|
|
|
+ onError: (error) => {
|
|
|
+ handleServerError(error)
|
|
|
+
|
|
|
+ if (error instanceof AxiosError) {
|
|
|
+ if (error.response?.status === 304) {
|
|
|
+ toast({
|
|
|
+ variant: 'destructive',
|
|
|
+ title: 'Content not modified!',
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ queryCache: new QueryCache({
|
|
|
+ onError: (error) => {
|
|
|
+ if (error instanceof AxiosError) {
|
|
|
+ if (error.response?.status === 401) {
|
|
|
+ toast({
|
|
|
+ variant: 'destructive',
|
|
|
+ title: 'Session expired!',
|
|
|
+ })
|
|
|
+ useAuthStore.getState().auth.reset()
|
|
|
+ const redirect = `${router.history.location.href}`
|
|
|
+ router.navigate({ to: '/sign-in', search: { redirect } })
|
|
|
+ }
|
|
|
+ if (error.response?.status === 500) {
|
|
|
+ toast({
|
|
|
+ variant: 'destructive',
|
|
|
+ title: 'Internal Server Error!',
|
|
|
+ })
|
|
|
+ router.navigate({ to: '/500' })
|
|
|
+ }
|
|
|
+ if (error.response?.status === 403) {
|
|
|
+ // router.navigate("/forbidden", { replace: true });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ }),
|
|
|
+})
|
|
|
+
|
|
|
+// Create a new router instance
|
|
|
+const router = createRouter({
|
|
|
+ routeTree,
|
|
|
+ context: { queryClient },
|
|
|
+ defaultPreload: 'intent',
|
|
|
+ defaultPreloadStaleTime: 0,
|
|
|
+})
|
|
|
+
|
|
|
+// Register the router instance for type safety
|
|
|
+declare module '@tanstack/react-router' {
|
|
|
+ interface Register {
|
|
|
+ router: typeof router
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Render the app
|
|
|
+const rootElement = document.getElementById('root')!
|
|
|
+if (!rootElement.innerHTML) {
|
|
|
+ const root = ReactDOM.createRoot(rootElement)
|
|
|
+ root.render(
|
|
|
+ <StrictMode>
|
|
|
+ <QueryClientProvider client={queryClient}>
|
|
|
+ <ThemeProvider defaultTheme='light' storageKey='vite-ui-theme'>
|
|
|
+ <RouterProvider router={router} />
|
|
|
+ </ThemeProvider>
|
|
|
+ </QueryClientProvider>
|
|
|
+ </StrictMode>
|
|
|
+ )
|
|
|
+}
|