/* eslint-disable @typescript-eslint/no-unsafe-return */
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { useContext, createContext } from 'react'
import { BrowserRouter as Router, useLocation } from 'react-router-dom'
import { ToastContainer } from 'react-toastify'
import { QuestsProvider } from '#components/Gaming/hooks/useQuests'
import { ClusterRefProvider } from '#components/Map/hooks/useClusterRef'
import { FilterProvider } from '#components/Map/hooks/useFilter'
import { ItemsProvider } from '#components/Map/hooks/useItems'
import { LayersProvider } from '#components/Map/hooks/useLayers'
import { LeafletRefsProvider } from '#components/Map/hooks/useLeafletRefs'
import { PermissionsProvider } from '#components/Map/hooks/usePermissions'
import { SelectPositionProvider } from '#components/Map/hooks/useSelectPosition'
import { TagsProvider } from '#components/Map/hooks/useTags'
import { AppStateProvider } from './hooks/useAppState'
// Helper context to determine if the ContextWrapper is already present.
const ContextCheckContext = createContext(false)
// eslint-disable-next-line react/prop-types
export const ContextWrapper = ({ children }) => {
const isWrapped = useContext(ContextCheckContext)
// Check if we are already inside a Router
let location
try {
// eslint-disable-next-line react-hooks/rules-of-hooks
location = useLocation()
// eslint-disable-next-line no-catch-all/no-catch-all
} catch (e) {
location = null
}
// Case 1: Only the Router is missing, but ContextWrapper is already provided
if (!location && isWrapped) {
return {children}
}
// Case 2: Neither Router nor ContextWrapper is present
if (!location && !isWrapped) {
return (
{children}
)
}
// Case 3: Only ContextWrapper is missing
if (location && !isWrapped) {
return (
{children}
)
}
// Case 4: Both Router and ContextWrapper are already present
return children
}
// eslint-disable-next-line react/prop-types
export const Wrappers = ({ children }) => {
const queryClient = new QueryClient()
return (
{children}
)
}