2021-09-21 21:28:04 +02:00
|
|
|
import {useEffect, useMemo, useState} from 'react'
|
2021-05-22 23:41:18 +02:00
|
|
|
import {useRouter} from 'next/router'
|
2020-12-04 20:16:24 +01:00
|
|
|
import PropTypes from 'prop-types'
|
2022-01-22 18:13:47 +04:00
|
|
|
import {createTheme, ThemeProvider} from '@mui/material/styles'
|
2022-01-19 07:06:26 +04:00
|
|
|
import CssBaseline from '@mui/material/CssBaseline'
|
2022-02-03 01:59:49 +04:00
|
|
|
import {SessionProvider, useSession} from 'next-auth/react'
|
2022-01-22 18:13:47 +04:00
|
|
|
import {CacheProvider} from '@emotion/react'
|
2022-10-27 06:36:19 +04:00
|
|
|
import PlausibleProvider from 'next-plausible'
|
2022-01-21 07:54:50 +04:00
|
|
|
import {grey, green, red} from '@mui/material/colors'
|
2022-01-22 21:53:27 +04:00
|
|
|
import NProgress from 'nprogress'
|
2022-01-22 18:13:47 +04:00
|
|
|
import createEmotionCache from '../lib/create-emotion-cache'
|
2022-05-22 22:19:39 +04:00
|
|
|
import {ParolesListContextProvider} from '../contexts/paroles-list'
|
2022-01-22 18:13:47 +04:00
|
|
|
|
2022-02-09 22:37:33 +04:00
|
|
|
import '@fontsource/roboto/300.css'
|
|
|
|
|
import '@fontsource/roboto/400.css'
|
|
|
|
|
import '@fontsource/roboto/500.css'
|
|
|
|
|
import '@fontsource/roboto/700.css'
|
|
|
|
|
import '../styles/nprogress.css'
|
2022-01-22 21:53:27 +04:00
|
|
|
|
2021-06-05 21:27:01 +02:00
|
|
|
import SwitchTheme from '../components/switch-theme'
|
|
|
|
|
|
2022-01-21 07:54:50 +04:00
|
|
|
const getDesignTokens = mode => ({
|
|
|
|
|
palette: {
|
|
|
|
|
mode,
|
|
|
|
|
...(mode === 'light'
|
|
|
|
|
? {
|
|
|
|
|
// Palette values for light mode
|
|
|
|
|
primary: green,
|
|
|
|
|
secondary: red,
|
|
|
|
|
divider: green[200],
|
|
|
|
|
text: {
|
|
|
|
|
primary: grey[900],
|
|
|
|
|
secondary: grey[800],
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
: {
|
|
|
|
|
// Palette values for dark mode
|
|
|
|
|
primary: green,
|
|
|
|
|
secondary: red,
|
|
|
|
|
divider: green[700],
|
|
|
|
|
background: {
|
|
|
|
|
default: '#082211',
|
|
|
|
|
paper: '#082211',
|
|
|
|
|
},
|
|
|
|
|
text: {
|
|
|
|
|
primary: '#fff',
|
|
|
|
|
secondary: grey[100],
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
2022-01-22 18:13:47 +04:00
|
|
|
const clientSideEmotionCache = createEmotionCache()
|
|
|
|
|
|
2020-12-04 20:16:24 +01:00
|
|
|
export default function MyApp(props) {
|
2022-01-22 18:13:47 +04:00
|
|
|
const {Component, emotionCache = clientSideEmotionCache, pageProps} = props
|
2022-01-21 07:54:50 +04:00
|
|
|
const [mode, setMode] = useState('light')
|
2021-06-05 21:27:01 +02:00
|
|
|
const [switchFixed, setSwitchFixed] = useState(false)
|
2022-01-21 07:54:50 +04:00
|
|
|
const theme = useMemo(() => createTheme(getDesignTokens(mode)), [mode])
|
2022-01-22 21:53:27 +04:00
|
|
|
const router = useRouter()
|
2021-06-05 21:27:01 +02:00
|
|
|
|
2021-05-22 23:41:18 +02:00
|
|
|
useEffect(() => {
|
2022-01-22 21:53:27 +04:00
|
|
|
const handleStart = () => {
|
|
|
|
|
NProgress.start()
|
2020-12-04 20:16:24 +01:00
|
|
|
}
|
2022-01-22 21:53:27 +04:00
|
|
|
|
|
|
|
|
const handleStop = () => {
|
|
|
|
|
NProgress.done()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
router.events.on('routeChangeStart', handleStart)
|
|
|
|
|
router.events.on('routeChangeComplete', handleStop)
|
|
|
|
|
router.events.on('routeChangeError', handleStop)
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
router.events.off('routeChangeStart', handleStart)
|
|
|
|
|
router.events.off('routeChangeComplete', handleStop)
|
|
|
|
|
router.events.off('routeChangeError', handleStop)
|
|
|
|
|
}
|
|
|
|
|
}, [router])
|
2020-12-04 20:16:24 +01:00
|
|
|
|
2021-06-05 21:27:01 +02:00
|
|
|
useEffect(() => {
|
2022-03-13 01:38:45 +04:00
|
|
|
if (props.router.pathname.slice(0, 8) === '/paroles') {
|
2021-06-05 21:27:01 +02:00
|
|
|
setSwitchFixed(true)
|
|
|
|
|
} else {
|
|
|
|
|
setSwitchFixed(false)
|
|
|
|
|
}
|
|
|
|
|
}, [props])
|
|
|
|
|
|
2021-06-05 23:44:39 +02:00
|
|
|
useEffect(() => {
|
2022-01-21 07:54:50 +04:00
|
|
|
const oldLocalMode = localStorage.getItem('oki-dark')
|
|
|
|
|
const localMode = localStorage.getItem('oki-theme')
|
|
|
|
|
if (localMode === 'dark' || (oldLocalMode && oldLocalMode === 'true')) {
|
|
|
|
|
setMode('dark')
|
2021-06-05 23:44:39 +02:00
|
|
|
} else {
|
2022-01-21 07:54:50 +04:00
|
|
|
setMode('light')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (localMode && oldLocalMode) {
|
|
|
|
|
localStorage.removeItem('oki-dark')
|
2021-06-05 23:44:39 +02:00
|
|
|
}
|
|
|
|
|
}, [])
|
|
|
|
|
|
2020-12-04 20:16:24 +01:00
|
|
|
return (
|
2022-10-27 06:36:19 +04:00
|
|
|
<PlausibleProvider domain='oki.re'>
|
|
|
|
|
<CacheProvider value={emotionCache}>
|
|
|
|
|
<ThemeProvider theme={theme}>
|
|
|
|
|
<CssBaseline />
|
|
|
|
|
<ParolesListContextProvider>
|
|
|
|
|
<SessionProvider session={pageProps.session} refetchInterval={5 * 60}>
|
|
|
|
|
<SwitchTheme switchFixed={switchFixed} mode={mode} setMode={setMode} />
|
|
|
|
|
{Component.auth ? (
|
|
|
|
|
<Auth><Component {...pageProps} /></Auth>
|
|
|
|
|
) : (
|
|
|
|
|
<Component {...pageProps} />
|
|
|
|
|
)}
|
|
|
|
|
</SessionProvider>
|
|
|
|
|
</ParolesListContextProvider>
|
|
|
|
|
</ThemeProvider>
|
|
|
|
|
</CacheProvider>
|
|
|
|
|
</PlausibleProvider>
|
2020-12-04 20:16:24 +01:00
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-22 23:41:18 +02:00
|
|
|
function Auth({children}) {
|
2022-02-03 01:59:49 +04:00
|
|
|
const {data: session, status} = useSession()
|
|
|
|
|
const loading = status === 'loading'
|
2021-05-22 23:41:18 +02:00
|
|
|
const isUser = Boolean(session?.user)
|
|
|
|
|
const router = useRouter()
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (loading) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isUser) {
|
2021-06-11 19:02:04 +02:00
|
|
|
router.push('/soumet')
|
2021-05-22 23:41:18 +02:00
|
|
|
}
|
|
|
|
|
}, [isUser, loading, router])
|
|
|
|
|
|
|
|
|
|
if (isUser) {
|
|
|
|
|
return children
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div>Loading...</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-04 20:16:24 +01:00
|
|
|
MyApp.propTypes = {
|
|
|
|
|
Component: PropTypes.elementType.isRequired,
|
2021-06-05 21:27:01 +02:00
|
|
|
pageProps: PropTypes.object.isRequired,
|
2022-01-22 18:13:47 +04:00
|
|
|
emotionCache: PropTypes.object,
|
2021-06-05 21:27:01 +02:00
|
|
|
router: PropTypes.object.isRequired
|
2020-12-04 20:16:24 +01:00
|
|
|
}
|
2021-05-22 23:41:18 +02:00
|
|
|
|
|
|
|
|
Auth.propTypes = {
|
|
|
|
|
children: PropTypes.node.isRequired
|
|
|
|
|
}
|