import React, { useState, useEffect } from 'react'
import {
ThemeProvider,
createTheme,
CssBaseline,
AppBar,
Toolbar,
Typography,
Tabs,
Tab,
Box,
Paper,
Switch,
FormControlLabel,
} from '@mui/material'
import { NetworkHealth } from './types'
// Tab panels
import OverviewTab from './components/tabs/OverviewTab'
import MessagesTab from './components/tabs/MessagesTab'
import FilesTab from './components/tabs/FilesTab'
import NetworkTab from './components/tabs/NetworkTab'
import StorageTab from './components/tabs/StorageTab'
import DiagnosticsTab from './components/tabs/DiagnosticsTab'
import IdentityTab from './components/tabs/IdentityTab'
import CallingInterface from './components/calling/CallingInterface'
import WebsiteBuilder from './components/website/WebsiteBuilder'
interface TabPanelProps {
children?: React.ReactNode
index: number
value: number
}
function TabPanel(props: TabPanelProps) {
const { children, value, index, ...other } = props
return (
<div
role="tabpanel"
hidden={value !== index}
{...other}
>
{value === index && (
<Box sx={{ p: 3, height: 'calc(100vh - 120px)', overflow: 'auto' }}>
{children}
</Box>
)}
</div>
)
}
function App() {
const [darkMode, setDarkMode] = useState(false)
const [currentTab, setCurrentTab] = useState(0)
const [networkHealth, setNetworkHealth] = useState<NetworkHealth>({
status: 'Disconnected',
peer_count: 0,
nat_type: 'Unknown',
bandwidth_kbps: 0,
avg_latency_ms: 0,
})
const theme = createTheme({
palette: {
mode: darkMode ? 'dark' : 'light',
},
})
useEffect(() => {
const mockHealth: NetworkHealth = {
status: 'Connected',
peer_count: 5,
nat_type: 'Full Cone',
bandwidth_kbps: 1500,
avg_latency_ms: 45,
}
setNetworkHealth(mockHealth)
}, [])
const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {
setCurrentTab(newValue)
}
const tabs = [
'Overview',
'Messages',
'Files',
'Network',
'Storage',
'Diagnostics',
'Calls',
'Website',
'Identity'
]
return (
<ThemeProvider theme={theme}>
<CssBaseline />
<Box sx={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
<AppBar position="static">
<Toolbar>
<Typography variant="h6" component="div" sx={{ flexGrow: 1 }}>
Communitas - P2P Collaboration Platform
</Typography>
<FormControlLabel
control={
<Switch
checked={darkMode}
onChange={(e) => setDarkMode(e.target.checked)}
/>
}
label="Dark Mode"
/>
</Toolbar>
</AppBar>
<Paper square sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs
value={currentTab}
onChange={handleTabChange}
variant="scrollable"
scrollButtons="auto"
>
{tabs.map((tab, index) => (
<Tab key={index} label={tab} />
))}
</Tabs>
</Paper>
<Box sx={{ flexGrow: 1, overflow: 'hidden' }}>
<TabPanel value={currentTab} index={0}>
<OverviewTab networkHealth={networkHealth} />
</TabPanel>
<TabPanel value={currentTab} index={1}>
<MessagesTab />
</TabPanel>
<TabPanel value={currentTab} index={2}>
<FilesTab />
</TabPanel>
<TabPanel value={currentTab} index={3}>
<NetworkTab />
</TabPanel>
<TabPanel value={currentTab} index={4}>
<StorageTab />
</TabPanel>
<TabPanel value={currentTab} index={5}>
<DiagnosticsTab />
</TabPanel>
<TabPanel value={currentTab} index={8}>
<IdentityTab />
</TabPanel>
<TabPanel value={currentTab} index={6}>
<CallingInterface />
</TabPanel>
<TabPanel value={currentTab} index={7}>
<WebsiteBuilder />
</TabPanel>
</Box>
</Box>
</ThemeProvider>
)
}
export default App