Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 2 additions & 99 deletions packages/web/src/app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,104 +1,7 @@
// @refresh reset
import { Suspense, lazy } from 'react'

import { route } from '@audius/common/utils'
import { CoinflowPurchaseProtection } from '@coinflowlabs/react'
import { Navigate, Route, Routes } from 'react-router'

import { AppModal } from 'pages/modals/AppModal'
import { SomethingWrong } from 'pages/something-wrong/SomethingWrong'
import { env } from 'services/env'

import { AppErrorBoundary } from './AppErrorBoundary'
// App component - routing is now handled by data router in AppProviders
import { AppProviders } from './AppProviders'
import WebPlayer from './web-player/WebPlayer'

const {
PRIVATE_KEY_EXPORTER_SETTINGS_PAGE,
SIGN_IN_PAGE,
SIGN_ON_ALIASES,
SIGN_UP_PAGE
} = route

const SignOnPage = lazy(() => import('pages/sign-on-page'))
const OAuthLoginPage = lazy(() => import('pages/oauth-login-page'))
const OAuthPayPage = lazy(() => import('pages/oauth-pay-page'))
const PrivateKeyExporterPage = lazy(
() => import('pages/private-key-exporter-page/PrivateKeyExporterPage')
)
const PrivateKeyExporterModal = lazy(
() => import('pages/private-key-exporter-page/PrivateKeyExporterModal')
)

const MERCHANT_ID = env.COINFLOW_MERCHANT_ID
const IS_PRODUCTION = env.ENVIRONMENT === 'production'

export const App = () => {
return (
<AppProviders>
<SomethingWrong />
<Suspense fallback={null}>
<CoinflowPurchaseProtection
merchantId={MERCHANT_ID || ''}
coinflowEnv={IS_PRODUCTION ? 'prod' : 'sandbox'}
/>
<Routes>
{SIGN_ON_ALIASES.map((a) => (
<Route
key={a}
path={a}
element={<Navigate to={SIGN_IN_PAGE} replace />}
/>
))}
<Route path={SIGN_IN_PAGE}>
<Route index element={<SignOnPage />} />
<Route path='*' element={<SignOnPage />} />
</Route>
<Route path={SIGN_UP_PAGE}>
<Route index element={<SignOnPage />} />
<Route path='*' element={<SignOnPage />} />
</Route>
<Route path='/oauth/auth/pay' element={<OAuthPayPage />} />
<Route path='/oauth/pay' element={<OAuthPayPage />} />
<Route path='/oauth/auth' element={<OAuthLoginPage />} />
<Route path={PRIVATE_KEY_EXPORTER_SETTINGS_PAGE}>
<Route
index
element={
<>
<PrivateKeyExporterPage />
<AppModal
key='PrivateKeyExporter'
name='PrivateKeyExporter'
modal={PrivateKeyExporterModal}
/>
</>
}
/>
<Route
path='*'
element={
<>
<PrivateKeyExporterPage />
<AppModal
key='PrivateKeyExporter'
name='PrivateKeyExporter'
modal={PrivateKeyExporterModal}
/>
</>
}
/>
</Route>
<Route
path='/*'
element={
<AppErrorBoundary>
<WebPlayer />
</AppErrorBoundary>
}
/>
</Routes>
</Suspense>
</AppProviders>
)
return <AppProviders />
}
82 changes: 19 additions & 63 deletions packages/web/src/app/AppProviders.tsx
Original file line number Diff line number Diff line change
@@ -1,35 +1,28 @@
import { ReactNode, useState, useEffect } from 'react'
import { ReactNode, useState, useMemo } from 'react'

import { SyncLocalStorageUserProvider } from '@audius/common/api'
import { MediaProvider } from '@audius/harmony/src/contexts'
import { QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { Provider as ReduxProvider } from 'react-redux'
import { BrowserRouter, HashRouter, useNavigate } from 'react-router'
import {
createBrowserRouter,
createHashRouter,
RouterProvider
} from 'react-router'
import { PersistGate } from 'redux-persist/integration/react'
import { WagmiProvider } from 'wagmi'

import { RouterContextProvider } from 'components/animated-switch/RouterContextProvider'
import { HeaderContextProvider } from 'components/header/mobile/HeaderContextProvider'
import { NavProvider } from 'components/nav/mobile/NavContext'
import { ScrollProvider } from 'components/scroll-provider/ScrollProvider'
import { ToastContextProvider } from 'components/toast/ToastContext'
import { useIsMobile } from 'hooks/useIsMobile'
import { MainContentContextProvider } from 'pages/MainContentContext'
import { env } from 'services/env'
import { localStorage } from 'services/local-storage'
import { queryClient } from 'services/query-client'
import { configureStore } from 'store/configureStore'
import { setNavigateRef } from 'store/navigationMiddleware'
import { getSystemAppearance, getTheme } from 'utils/theme/theme'

import { AppContextProvider } from './AppContextProvider'
import { AudiusQueryProvider } from './AudiusQueryProvider'
import { wagmiAdapter } from './ReownAppKitModal'
import { ThemeProvider } from './ThemeProvider'
import { createRoutes } from './routes'

type AppProvidersProps = {
children: ReactNode
children?: ReactNode
}

export const AppProviders = ({ children }: AppProvidersProps) => {
Expand All @@ -53,64 +46,27 @@ export const AppProviders = ({ children }: AppProvidersProps) => {
return { store, persistor }
})

// Use HashRouter or BrowserRouter based on environment
const RouterComponent = env.USE_HASH_ROUTING ? HashRouter : BrowserRouter
const basename = env.BASENAME || undefined

// Component to set up navigation ref for middleware
const NavigationSetup = ({ children }: { children: ReactNode }) => {
const navigate = useNavigate()
// Create router with data router API for code-splitting and performance
const router = useMemo(() => {
const routes = createRoutes()
const createRouter = env.USE_HASH_ROUTING
? createHashRouter
: createBrowserRouter

useEffect(() => {
setNavigateRef(navigate)
return () => {
setNavigateRef(null as any)
}
}, [navigate])

return <>{children}</>
}

// In React Router v7, future flags are enabled by default for declarative routers
// The future prop is only available for data routers (createBrowserRouter)
// For BrowserRouter/HashRouter, the v7 behavior is the default
const routerProps = {
basename
}
return createRouter(routes, {
basename
})
}, [basename])

return (
<WagmiProvider config={wagmiAdapter.wagmiConfig}>
<QueryClientProvider client={queryClient}>
<MediaProvider>
<ReduxProvider store={store}>
<PersistGate loading={null} persistor={persistor}>
<RouterComponent {...routerProps}>
<NavigationSetup>
<RouterContextProvider>
<HeaderContextProvider>
<NavProvider>
<ScrollProvider>
<ThemeProvider>
<ToastContextProvider>
<AppContextProvider>
<AudiusQueryProvider>
<MainContentContextProvider>
<SyncLocalStorageUserProvider
localStorage={localStorage}
>
{children}
</SyncLocalStorageUserProvider>
</MainContentContextProvider>
</AudiusQueryProvider>
</AppContextProvider>
</ToastContextProvider>
</ThemeProvider>
</ScrollProvider>
</NavProvider>
</HeaderContextProvider>
</RouterContextProvider>
</NavigationSetup>
</RouterComponent>
<RouterProvider router={router} />
</PersistGate>
</ReduxProvider>
</MediaProvider>
Expand Down
Loading