ea34058fa7
* chore(vite): use vite * fix(vite): alias lib directory * chore(vite): set type: module * chore: update vite and MUI * fix(vite): make MUI components load * fix: use node path resolution * chore(vite): add svg support * fix(vite): polyfill global * fix(vite): use import.meta * fix(vite): use correct svg module resolution * chore(vite): migrate to vitest * fix(vite): remove PUBLIC_URL * fix(tests): mock audio service * chore(deps): upgrade to react test library 14 * refactor(tests): simplify room test setup * refactor(tests): make Date.now() mockable * refactor(vite): remove bootstrap shim * chore(deps): drop react-scripts * chore(deps): remove source-map-explorer Source maps do not currently work with MUI and Vite: https://github.com/vitejs/vite/issues/15012 Because of this, source map utilities are currently removed. * refactor(vite): use TypeScript for Vite config * chore(actions): update actions config for new paths * fix(service-worker): use VITE_HOMEPAGE for service worker resolution * fix(vercel): use quotes for build command * fix(vite): use import.meta.env.MODE * fix(service-worker): use correct definition for publicUrl * feat(vite): use vite-plugin-pwa * fix(pwa): make update prompt work * fix(types): use vite/client types * docs(readme): update building instructions * refactor(vite): simplify theme loading workaround * refactor(vite): use manifest object * docs(readme): update tool references * chore(deps): run `npm audit fix` * fix(vite): make syntax highlighter work consistently See: https://github.com/react-syntax-highlighter/react-syntax-highlighter/issues/513 * fix(pwa): remove manifest.json references * refactor(deps): remove jest references * refactor(types): remove react-scripts reference * chore(deps): use TypeScript 5 * refactor(tests): improve persisted storage mocking
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
import { lazy, Suspense, useEffect, useState } from 'react'
|
|
import Box from '@mui/material/Box'
|
|
import Typography from '@mui/material/Typography'
|
|
import { v4 as uuid } from 'uuid'
|
|
|
|
import { encryption } from 'services/Encryption'
|
|
import {
|
|
EnvironmentUnsupportedDialog,
|
|
isEnvironmentSupported,
|
|
} from 'components/Shell/EnvironmentUnsupportedDialog'
|
|
import { WholePageLoading } from 'components/Loading/Loading'
|
|
import { ColorMode, UserSettings } from 'models/settings'
|
|
|
|
import type { BootstrapProps } from './Bootstrap'
|
|
|
|
const Bootstrap = lazy(() => import('./Bootstrap'))
|
|
|
|
export interface InitProps extends Omit<BootstrapProps, 'initialUserSettings'> {
|
|
getUuid?: typeof uuid
|
|
}
|
|
|
|
// NOTE: This is meant to be a thin layer around the Bootstrap component that
|
|
// only handles asynchronous creation of the public/private keys that Bootstrap
|
|
// requires.
|
|
const Init = ({ getUuid = uuid, ...props }: InitProps) => {
|
|
const [userSettings, setUserSettings] = useState<UserSettings | null>(null)
|
|
const [errorMessage, setErrorMessage] = useState<string | null>(null)
|
|
|
|
useEffect(() => {
|
|
;(async () => {
|
|
if (userSettings !== null) return
|
|
|
|
try {
|
|
const { publicKey, privateKey } = await encryption.generateKeyPair()
|
|
|
|
setUserSettings({
|
|
userId: getUuid(),
|
|
customUsername: '',
|
|
colorMode: ColorMode.DARK,
|
|
playSoundOnNewMessage: true,
|
|
showNotificationOnNewMessage: true,
|
|
showActiveTypingStatus: true,
|
|
publicKey,
|
|
privateKey,
|
|
})
|
|
} catch (e) {
|
|
console.error(e)
|
|
setErrorMessage(
|
|
'Chitchatter was unable to boot up. Please check the browser console.'
|
|
)
|
|
}
|
|
})()
|
|
}, [getUuid, userSettings])
|
|
|
|
if (!isEnvironmentSupported) {
|
|
return <EnvironmentUnsupportedDialog />
|
|
}
|
|
|
|
if (errorMessage) {
|
|
return (
|
|
<Box
|
|
sx={{
|
|
display: 'flex',
|
|
height: '100vh',
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
}}
|
|
>
|
|
<Typography>{errorMessage}</Typography>
|
|
</Box>
|
|
)
|
|
}
|
|
|
|
if (userSettings === null) {
|
|
return <WholePageLoading />
|
|
}
|
|
|
|
return (
|
|
<Suspense fallback={<WholePageLoading />}>
|
|
<Bootstrap {...props} initialUserSettings={userSettings} />
|
|
</Suspense>
|
|
)
|
|
}
|
|
|
|
export default Init
|