2022-08-31 19:40:40 -05:00
|
|
|
import {
|
|
|
|
PropsWithChildren,
|
2022-09-05 17:35:40 -05:00
|
|
|
SyntheticEvent,
|
2022-08-31 19:40:40 -05:00
|
|
|
useCallback,
|
2022-09-05 17:35:40 -05:00
|
|
|
useContext,
|
2022-08-31 19:40:40 -05:00
|
|
|
useEffect,
|
|
|
|
useMemo,
|
|
|
|
useState,
|
|
|
|
} from 'react'
|
2022-08-31 21:44:00 -05:00
|
|
|
import CssBaseline from '@mui/material/CssBaseline'
|
2022-09-17 11:29:57 -05:00
|
|
|
import { ThemeProvider, createTheme } from '@mui/material/styles'
|
2022-08-31 19:40:40 -05:00
|
|
|
import Box from '@mui/material/Box'
|
2022-09-17 11:08:05 -05:00
|
|
|
import { AlertColor } from '@mui/material/Alert'
|
2022-08-31 19:40:40 -05:00
|
|
|
|
2022-09-05 12:17:10 -05:00
|
|
|
import { ShellContext } from 'contexts/ShellContext'
|
2022-09-05 17:35:40 -05:00
|
|
|
import { SettingsContext } from 'contexts/SettingsContext'
|
2022-08-31 19:40:40 -05:00
|
|
|
import { AlertOptions } from 'models/shell'
|
|
|
|
|
2022-09-17 11:29:57 -05:00
|
|
|
import { Drawer } from './Drawer'
|
2022-09-16 09:36:24 -05:00
|
|
|
import { UpgradeDialog } from './UpgradeDialog'
|
2022-09-16 09:46:11 -05:00
|
|
|
import { ShellAppBar } from './ShellAppBar'
|
2022-09-17 11:08:05 -05:00
|
|
|
import { NotificationArea } from './NotificationArea'
|
2022-09-17 11:29:57 -05:00
|
|
|
import { RouteContent } from './RouteContent'
|
2022-08-31 21:44:00 -05:00
|
|
|
|
2022-09-11 13:44:23 -05:00
|
|
|
export interface ShellProps extends PropsWithChildren {
|
|
|
|
userPeerId: string
|
|
|
|
appNeedsUpdate: boolean
|
|
|
|
}
|
|
|
|
|
|
|
|
export const Shell = ({ appNeedsUpdate, children, userPeerId }: ShellProps) => {
|
2022-09-05 17:35:40 -05:00
|
|
|
const settingsContext = useContext(SettingsContext)
|
2022-08-31 19:40:40 -05:00
|
|
|
const [isAlertShowing, setIsAlertShowing] = useState(false)
|
2022-08-31 21:44:00 -05:00
|
|
|
const [isDrawerOpen, setIsDrawerOpen] = useState(false)
|
2022-09-01 21:28:45 -05:00
|
|
|
const [doShowPeers, setDoShowPeers] = useState(false)
|
2022-08-31 19:40:40 -05:00
|
|
|
const [alertSeverity, setAlertSeverity] = useState<AlertColor>('info')
|
|
|
|
const [title, setTitle] = useState('')
|
|
|
|
const [alertText, setAlertText] = useState('')
|
|
|
|
const [numberOfPeers, setNumberOfPeers] = useState(1)
|
|
|
|
|
|
|
|
const showAlert = useCallback<
|
|
|
|
(message: string, options?: AlertOptions) => void
|
|
|
|
>((message, options) => {
|
|
|
|
setAlertText(message)
|
|
|
|
setAlertSeverity(options?.severity ?? 'info')
|
|
|
|
setIsAlertShowing(true)
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
const shellContextValue = useMemo(
|
2022-09-01 21:28:45 -05:00
|
|
|
() => ({
|
|
|
|
numberOfPeers,
|
|
|
|
setDoShowPeers,
|
|
|
|
setNumberOfPeers,
|
|
|
|
setTitle,
|
|
|
|
showAlert,
|
|
|
|
}),
|
|
|
|
[numberOfPeers, setDoShowPeers, setNumberOfPeers, setTitle, showAlert]
|
2022-08-31 19:40:40 -05:00
|
|
|
)
|
|
|
|
|
2022-09-05 17:35:40 -05:00
|
|
|
const colorMode = settingsContext.getUserSettings().colorMode
|
2022-09-02 09:49:00 -05:00
|
|
|
|
|
|
|
const theme = useMemo(
|
|
|
|
() =>
|
|
|
|
createTheme({
|
|
|
|
palette: {
|
2022-09-05 17:35:40 -05:00
|
|
|
mode: colorMode,
|
2022-09-02 09:49:00 -05:00
|
|
|
},
|
|
|
|
}),
|
2022-09-05 17:35:40 -05:00
|
|
|
[colorMode]
|
2022-09-02 09:49:00 -05:00
|
|
|
)
|
|
|
|
|
2022-08-31 19:40:40 -05:00
|
|
|
const handleAlertClose = (
|
|
|
|
_event?: SyntheticEvent | Event,
|
|
|
|
reason?: string
|
|
|
|
) => {
|
|
|
|
if (reason === 'clickaway') {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
setIsAlertShowing(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
document.title = title
|
|
|
|
}, [title])
|
|
|
|
|
2022-08-31 21:44:00 -05:00
|
|
|
const handleDrawerOpen = () => {
|
|
|
|
setIsDrawerOpen(true)
|
|
|
|
}
|
|
|
|
|
2022-09-05 17:52:18 -05:00
|
|
|
const handleLinkButtonClick = async () => {
|
|
|
|
await navigator.clipboard.writeText(window.location.href)
|
|
|
|
|
|
|
|
shellContextValue.showAlert('Current URL copied to clipboard', {
|
|
|
|
severity: 'success',
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-09-15 21:16:41 -05:00
|
|
|
const handleDrawerClose = () => {
|
|
|
|
setIsDrawerOpen(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleHomeLinkClick = () => {
|
|
|
|
setIsDrawerOpen(false)
|
|
|
|
}
|
|
|
|
|
2022-09-17 12:39:16 -05:00
|
|
|
const handleAboutLinkClick = () => {
|
|
|
|
setIsDrawerOpen(false)
|
|
|
|
}
|
|
|
|
|
2022-08-31 19:40:40 -05:00
|
|
|
return (
|
|
|
|
<ShellContext.Provider value={shellContextValue}>
|
2022-09-02 09:49:00 -05:00
|
|
|
<ThemeProvider theme={theme}>
|
2022-08-31 22:05:24 -05:00
|
|
|
<CssBaseline />
|
2022-09-16 09:36:24 -05:00
|
|
|
<UpgradeDialog appNeedsUpdate={appNeedsUpdate} />
|
2022-08-31 22:05:24 -05:00
|
|
|
<Box
|
|
|
|
className="Chitchatter"
|
2022-09-04 12:09:30 -05:00
|
|
|
sx={{
|
2022-08-31 22:05:24 -05:00
|
|
|
height: '100vh',
|
|
|
|
display: 'flex',
|
2022-09-04 12:09:30 -05:00
|
|
|
}}
|
2022-08-31 19:40:40 -05:00
|
|
|
>
|
2022-09-17 11:08:05 -05:00
|
|
|
<NotificationArea
|
|
|
|
alertSeverity={alertSeverity}
|
|
|
|
alertText={alertText}
|
|
|
|
isAlertShowing={isAlertShowing}
|
|
|
|
onAlertClose={handleAlertClose}
|
|
|
|
/>
|
2022-09-16 09:46:11 -05:00
|
|
|
<ShellAppBar
|
|
|
|
doShowPeers={doShowPeers}
|
|
|
|
handleDrawerOpen={handleDrawerOpen}
|
|
|
|
handleLinkButtonClick={handleLinkButtonClick}
|
|
|
|
isDrawerOpen={isDrawerOpen}
|
|
|
|
numberOfPeers={numberOfPeers}
|
|
|
|
title={title}
|
|
|
|
/>
|
2022-08-31 22:05:24 -05:00
|
|
|
<Drawer
|
2022-09-15 21:16:41 -05:00
|
|
|
isDrawerOpen={isDrawerOpen}
|
|
|
|
onDrawerClose={handleDrawerClose}
|
|
|
|
onHomeLinkClick={handleHomeLinkClick}
|
2022-09-17 12:39:16 -05:00
|
|
|
onAboutLinkClick={handleAboutLinkClick}
|
2022-09-15 21:16:41 -05:00
|
|
|
theme={theme}
|
|
|
|
userPeerId={userPeerId}
|
|
|
|
/>
|
2022-09-17 11:29:57 -05:00
|
|
|
<RouteContent isDrawerOpen={isDrawerOpen}>{children}</RouteContent>
|
2022-08-31 22:05:24 -05:00
|
|
|
</Box>
|
|
|
|
</ThemeProvider>
|
2022-08-31 19:40:40 -05:00
|
|
|
</ShellContext.Provider>
|
|
|
|
)
|
|
|
|
}
|