communitas 0.2.6

A diagnostic chat application for the P2P Foundation network
Documentation
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