import { useEffect, useState } from 'react' import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' import { v4 as uuid } from 'uuid' import localforage from 'localforage' import * as serviceWorkerRegistration from 'serviceWorkerRegistration' import { SettingsContext } from 'contexts/SettingsContext' import { Home } from 'pages/Home' import { About } from 'pages/About' import { PublicRoom } from 'pages/PublicRoom' import { UserSettings } from 'models/settings' import { PersistedStorageKeys } from 'models/storage' import { Shell } from 'components/Shell' export interface BootstrapProps { persistedStorage?: typeof localforage getUuid?: typeof uuid } function Bootstrap({ persistedStorage = localforage.createInstance({ name: 'chitchatter', description: 'Persisted settings data for chitchatter', }), getUuid = uuid, }: BootstrapProps) { const [appNeedsUpdate, setAppNeedsUpdate] = useState(false) const [hasLoadedSettings, setHasLoadedSettings] = useState(false) const [userSettings, setUserSettings] = useState({ userId: getUuid(), colorMode: 'dark', }) const { userId } = userSettings const handleServiceWorkerUpdate = () => { setAppNeedsUpdate(true) } useEffect(() => { serviceWorkerRegistration.register({ onUpdate: handleServiceWorkerUpdate }) }, []) useEffect(() => { ;(async () => { if (hasLoadedSettings) return const persistedUserSettings = await persistedStorage.getItem( PersistedStorageKeys.USER_SETTINGS ) if (persistedUserSettings) { setUserSettings(persistedUserSettings) } else { await persistedStorage.setItem( PersistedStorageKeys.USER_SETTINGS, userSettings ) } setHasLoadedSettings(true) })() }, [hasLoadedSettings, persistedStorage, userSettings, userId]) const settingsContextValue = { updateUserSettings: async (changedSettings: Partial) => { const newSettings = { ...userSettings, ...changedSettings, } await persistedStorage.setItem( PersistedStorageKeys.USER_SETTINGS, newSettings ) setUserSettings(newSettings) }, getUserSettings: () => ({ ...userSettings }), } return ( {hasLoadedSettings ? ( {['/', '/index.html'].map(path => ( } /> ))} } /> } /> ) : ( <> )} ) } export default Bootstrap