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 { SettingsContext } from 'contexts/SettingsContext' import { Home } from 'pages/Home/' 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 [hasLoadedSettings, setHasLoadedSettings] = useState(false) const [userSettings, setUserSettings] = useState({ userId: getUuid(), colorMode: 'dark', }) const { userId } = userSettings 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