w-aura/src/components/App/index.tsx
2023-06-19 15:58:36 +03:00

79 lines
2.9 KiB
TypeScript

import { useState } from 'react'
import {
Routes, Route, Navigate, Outlet, useLocation
} from 'react-router-dom'
import { useAuth } from '../../auth'
import { useSelector } from 'react-redux'
import { selectors } from '../../store'
import routes, { hasNavigation, getRouteBy } from '../../routes'
import BirthdayPage from '../BirthdayPage'
import BirthtimePage from '../BirthtimePage'
import CreateProfilePage from '../CreateProfilePage'
import EmailEnterPage from '../EmailEnterPage'
import SubscriptionPage from '../SubscriptionPage'
import PaymentPage from '../PaymentPage'
import WallpaperPage from '../WallpaperPage'
import StaticPage from '../StaticPage'
import NotFoundPage from '../NotFoundPage'
import Header from '../Header'
import Navbar from '../Navbar'
import Footer from '../Footer'
import './styles.css'
function App(): JSX.Element {
return (
<Routes>
<Route element={<Layout />}>
<Route path={routes.client.root()} element={<MainPage />} />
<Route path={routes.client.birthday()} element={<BirthdayPage />} />
<Route path={routes.client.birthtime()} element={<BirthtimePage />} />
<Route path={routes.client.createProfile()} element={<SkipStep />} />
<Route path={routes.client.emailEnter()} element={<EmailEnterPage />} />
<Route path={routes.client.static()} element={<StaticPage />} />
<Route element={<PrivateOutlet />}>
<Route path={routes.client.subscription()} element={<SubscriptionPage />} />
<Route path={routes.client.paymentMethod()} element={<PaymentPage />} />
<Route path={routes.client.wallpaper()} element={<ProtectWallpaperPage />} />
</Route>
<Route path="*" element={<NotFoundPage />} />
</Route>
</Routes>
)
}
function Layout(): JSX.Element {
const location = useLocation()
const showNavbar = hasNavigation(location.pathname)
const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false)
return (
<div className='container'>
<Header openMenu={() => setIsMenuOpen(true)}/>
<main className='content'><Outlet /></main>
<Footer color={showNavbar ? 'black' : 'white'}/>
{ showNavbar ? <Navbar isOpen={isMenuOpen} closeMenu={() => setIsMenuOpen(false)} /> : null}
</div>
)
}
function PrivateOutlet(): JSX.Element {
const { user } = useAuth()
return user ? <Outlet /> : <Navigate to={routes.client.root()} replace={true} />
}
function SkipStep(): JSX.Element {
const { user } = useAuth()
return user ? <Navigate to={routes.client.emailEnter()} replace={true} /> : <CreateProfilePage />
}
function MainPage(): JSX.Element {
const status = useSelector(selectors.selectStatus)
return <Navigate to={getRouteBy(status)} replace={true} />
}
function ProtectWallpaperPage(): JSX.Element {
const status = useSelector(selectors.selectStatus)
return status === 'subscribed' ? <WallpaperPage /> : <Navigate to={getRouteBy(status)} replace={true} />
}
export default App