/** @format */ import React from 'react' import { createBrowserRouter, Outlet, useRouteError } from 'react-router-dom' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { PlausibleSite, useSiteContext } from './site-context' import { GoBackToDashboard, SomethingWentWrongMessage } from './error/something-went-wrong' import Dashboard from './index' import SourcesModal from './stats/modals/sources' import ReferrersDrilldownModal from './stats/modals/referrer-drilldown' import GoogleKeywordsModal from './stats/modals/google-keywords' import PagesModal from './stats/modals/pages' import EntryPagesModal from './stats/modals/entry-pages' import ExitPagesModal from './stats/modals/exit-pages' import LocationsModal from './stats/modals/locations-modal' import BrowsersModal from './stats/modals/devices/browsers-modal' import BrowserVersionsModal from './stats/modals/devices/browser-versions-modal' import OperatingSystemsModal from './stats/modals/devices/operating-systems-modal' import OperatingSystemVersionsModal from './stats/modals/devices/operating-system-versions-modal' import ScreenSizesModal from './stats/modals/devices/screen-sizes' import PropsModal from './stats/modals/props' import ConversionsModal from './stats/modals/conversions' import FilterModal from './stats/modals/filter-modal' import QueryContextProvider from './query-context' const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false } } }) function DashboardElement() { return ( {/** render any children of the root route below */} ) } export const rootRoute = { path: '/', element: } export const sourcesRoute = { path: 'sources', element: } export const utmMediumsRoute = { path: 'utm_mediums', element: } export const utmSourcesRoute = { path: 'utm_sources', element: } export const utmCampaignsRoute = { path: 'utm_campaigns', element: } export const utmContentsRoute = { path: 'utm_contents', element: } export const utmTermsRoute = { path: 'utm_terms', element: } export const referrersGoogleRoute = { path: 'referrers/Google', element: } export const topPagesRoute = { path: 'pages', element: } export const entryPagesRoute = { path: 'entry-pages', element: } export const exitPagesRoute = { path: 'exit-pages', element: } export const countriesRoute = { path: 'countries', element: } export const regionsRoute = { path: 'regions', element: } export const citiesRoute = { path: 'cities', element: } export const browsersRoute = { path: 'browsers', element: } export const browserVersionsRoute = { path: 'browser-versions', element: } export const operatingSystemsRoute = { path: 'operating-systems', element: } export const operatingSystemVersionsRoute = { path: 'operating-system-versions', element: } export const screenSizesRoute = { path: 'screen-sizes', element: } export const conversionsRoute = { path: 'conversions', element: } export const referrersDrilldownRoute = { path: 'referrers/:referrer', element: } export const customPropsRoute = { path: 'custom-prop-values/:propKey', element: } export const filterRoute = { path: 'filter/:field', element: } export function getRouterBasepath( site: Pick ): string { const basepath = site.shared ? `/share/${encodeURIComponent(site.domain)}` : `/${encodeURIComponent(site.domain)}` return basepath } function RouteErrorElement() { const site = useSiteContext() const error = useRouteError() return ( } /> ) } export function createAppRouter(site: PlausibleSite) { const basepath = getRouterBasepath(site) const router = createBrowserRouter( [ { ...rootRoute, errorElement: , children: [ sourcesRoute, utmMediumsRoute, utmSourcesRoute, utmCampaignsRoute, utmContentsRoute, utmTermsRoute, referrersGoogleRoute, referrersDrilldownRoute, topPagesRoute, entryPagesRoute, exitPagesRoute, countriesRoute, regionsRoute, citiesRoute, browsersRoute, browserVersionsRoute, operatingSystemsRoute, operatingSystemVersionsRoute, screenSizesRoute, conversionsRoute, customPropsRoute, filterRoute, { path: '*', element: null } ] } ], { basename: basepath, future: { // @ts-expect-error valid according to docs (https://reactrouter.com/en/main/routers/create-browser-router#optsfuture) v7_prependBasename: true } } ) return router }