2024-06-30 18:55:39 -04:00
|
|
|
import NavBar from '@/views/components/NavBar'
|
|
|
|
import { Button, Snackbar, Typography, useColorScheme } from '@mui/joy'
|
2024-08-04 22:34:49 -04:00
|
|
|
import Tracker from '@openreplay/tracker'
|
2024-06-30 18:55:39 -04:00
|
|
|
import { useEffect, useState } from 'react'
|
2024-11-23 20:23:59 -05:00
|
|
|
import { QueryClient, QueryClientProvider } from 'react-query'
|
2024-06-30 18:55:39 -04:00
|
|
|
import { Outlet } from 'react-router-dom'
|
|
|
|
import { useRegisterSW } from 'virtual:pwa-register/react'
|
2025-01-14 02:12:27 -05:00
|
|
|
import { registerCapacitorListeners } from './CapacitorListener'
|
2024-06-30 18:55:39 -04:00
|
|
|
import { UserContext } from './contexts/UserContext'
|
|
|
|
import { AuthenticationProvider } from './service/AuthenticationService'
|
|
|
|
import { GetUserProfile } from './utils/Fetcher'
|
2025-01-14 02:12:27 -05:00
|
|
|
import { apiManager, isTokenValid } from './utils/TokenManager'
|
2024-06-30 18:55:39 -04:00
|
|
|
|
|
|
|
const add = className => {
|
|
|
|
document.getElementById('root').classList.add(className)
|
|
|
|
}
|
|
|
|
|
|
|
|
const remove = className => {
|
|
|
|
document.getElementById('root').classList.remove(className)
|
|
|
|
}
|
|
|
|
// TODO: Update the interval to at 60 minutes
|
|
|
|
const intervalMS = 5 * 60 * 1000 // 5 minutes
|
|
|
|
|
|
|
|
function App() {
|
2024-12-26 02:13:47 -05:00
|
|
|
startApiManager()
|
2024-08-04 22:34:49 -04:00
|
|
|
startOpenReplay()
|
2024-12-26 02:13:47 -05:00
|
|
|
const queryClient = new QueryClient()
|
2024-06-30 18:55:39 -04:00
|
|
|
const { mode, systemMode } = useColorScheme()
|
|
|
|
const [userProfile, setUserProfile] = useState(null)
|
|
|
|
const [showUpdateSnackbar, setShowUpdateSnackbar] = useState(true)
|
|
|
|
|
|
|
|
const {
|
|
|
|
offlineReady: [offlineReady, setOfflineReady],
|
|
|
|
needRefresh: [needRefresh, setNeedRefresh],
|
|
|
|
updateServiceWorker,
|
|
|
|
} = useRegisterSW({
|
|
|
|
onRegistered(r) {
|
|
|
|
// eslint-disable-next-line prefer-template
|
|
|
|
console.log('SW Registered: ' + r)
|
|
|
|
r &&
|
|
|
|
setInterval(() => {
|
|
|
|
r.update()
|
|
|
|
}, intervalMS)
|
|
|
|
},
|
|
|
|
onRegisterError(error) {
|
|
|
|
console.log('SW registration error', error)
|
|
|
|
},
|
|
|
|
})
|
|
|
|
const close = () => {
|
|
|
|
setOfflineReady(false)
|
|
|
|
setNeedRefresh(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
// const updateServiceWorker = useRegisterSW({
|
|
|
|
// onRegistered(r) {
|
|
|
|
// r &&
|
|
|
|
// setInterval(() => {
|
|
|
|
// r.update()
|
|
|
|
// }, intervalMS)
|
|
|
|
// },
|
|
|
|
// })
|
|
|
|
const setThemeClass = () => {
|
|
|
|
const value = JSON.parse(localStorage.getItem('themeMode')) || mode
|
|
|
|
|
|
|
|
if (value === 'system') {
|
|
|
|
if (systemMode === 'dark') {
|
|
|
|
return add('dark')
|
|
|
|
}
|
|
|
|
return remove('dark')
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value === 'dark') {
|
|
|
|
return add('dark')
|
|
|
|
}
|
|
|
|
|
|
|
|
return remove('dark')
|
|
|
|
}
|
|
|
|
const getUserProfile = () => {
|
|
|
|
GetUserProfile()
|
|
|
|
.then(res => {
|
|
|
|
res.json().then(data => {
|
|
|
|
setUserProfile(data.res)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.catch(error => {})
|
|
|
|
}
|
|
|
|
useEffect(() => {
|
|
|
|
setThemeClass()
|
|
|
|
}, [mode, systemMode])
|
|
|
|
useEffect(() => {
|
2024-12-26 02:13:47 -05:00
|
|
|
registerCapacitorListeners()
|
2024-06-30 18:55:39 -04:00
|
|
|
if (isTokenValid()) {
|
|
|
|
if (!userProfile) getUserProfile()
|
|
|
|
}
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className='min-h-screen'>
|
2024-11-23 20:23:59 -05:00
|
|
|
<QueryClientProvider client={queryClient}>
|
|
|
|
<AuthenticationProvider />
|
|
|
|
<UserContext.Provider value={{ userProfile, setUserProfile }}>
|
|
|
|
<NavBar />
|
|
|
|
<Outlet />
|
|
|
|
</UserContext.Provider>
|
|
|
|
{needRefresh && (
|
|
|
|
<Snackbar open={showUpdateSnackbar}>
|
|
|
|
<Typography level='body-md'>
|
|
|
|
A new version is now available.Click on reload button to update.
|
|
|
|
</Typography>
|
|
|
|
<Button
|
|
|
|
color='secondary'
|
|
|
|
size='small'
|
|
|
|
onClick={() => {
|
|
|
|
updateServiceWorker(true)
|
|
|
|
setShowUpdateSnackbar(false)
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
Refresh
|
|
|
|
</Button>
|
|
|
|
</Snackbar>
|
|
|
|
)}
|
|
|
|
</QueryClientProvider>
|
2024-06-30 18:55:39 -04:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2024-08-04 22:34:49 -04:00
|
|
|
const startOpenReplay = () => {
|
|
|
|
if (!import.meta.env.VITE_OPENREPLAY_PROJECT_KEY) return
|
|
|
|
const tracker = new Tracker({
|
|
|
|
projectKey: import.meta.env.VITE_OPENREPLAY_PROJECT_KEY,
|
|
|
|
})
|
|
|
|
tracker.start()
|
|
|
|
}
|
2024-06-30 18:55:39 -04:00
|
|
|
export default App
|
2024-12-26 02:13:47 -05:00
|
|
|
|
|
|
|
const startApiManager = () => {
|
2025-01-14 02:12:27 -05:00
|
|
|
apiManager.init()
|
|
|
|
}
|