import React, { Component } from 'react'; import { BrowserRouter, Routes, Route, Link, Navigate } from 'react-router-dom'; import { AppBar, Toolbar, Typography, Button, Box, IconButton, CssBaseline } from '@mui/material'; import { ThemeProvider, createTheme } from '@mui/material/styles'; import SettingsIcon from '@mui/icons-material/Settings'; import ShowChartIcon from '@mui/icons-material/ShowChart'; import DashboardIcon from '@mui/icons-material/Dashboard'; import RuleIcon from '@mui/icons-material/Rule'; import Settings from './components/Settings'; import Chart from './components/Chart'; import Login from './components/Login'; import ViewManager from './components/ViewManager'; import ViewDisplay from './components/ViewDisplay'; import RuleEditor from './components/RuleEditor'; const darkTheme = createTheme({ palette: { mode: 'dark', primary: { main: '#fb4934' }, // Gruvbox red secondary: { main: '#83a598' }, // Gruvbox blue background: { default: '#282828', // Gruvbox dark bg paper: '#3c3836', // Gruvbox dark lighter }, text: { primary: '#ebdbb2', secondary: '#a89984' } }, }); export default class App extends Component { constructor(props) { super(props); this.state = { selectedChannels: [], user: null, // { username, role, token } loading: true }; } componentDidMount() { // Load selection from local storage const saved = localStorage.getItem('selectedChannels'); if (saved) { try { this.setState({ selectedChannels: JSON.parse(saved) }); } catch (e) { console.error("Failed to parse saved channels"); } } // Check for existing token const token = localStorage.getItem('authToken'); const username = localStorage.getItem('authUser'); const role = localStorage.getItem('authRole'); if (token && username) { this.setState({ user: { username, role, token } }); } this.setState({ loading: false }); } handleSelectionChange = (newSelection) => { this.setState({ selectedChannels: newSelection }); localStorage.setItem('selectedChannels', JSON.stringify(newSelection)); }; handleLogin = (userData) => { this.setState({ user: userData }); localStorage.setItem('authToken', userData.token); localStorage.setItem('authUser', userData.username); localStorage.setItem('authRole', userData.role); }; handleLogout = () => { this.setState({ user: null }); localStorage.removeItem('authToken'); localStorage.removeItem('authUser'); localStorage.removeItem('authRole'); }; render() { const { selectedChannels, user, loading } = this.state; // While checking auth, we could show loader, but it's sync here mostly. return ( CTRL Freak {user && ( <> )} {user && user.role === 'admin' && ( )} {user && ( )} {user ? ( ) : ( )} } /> } /> } /> } /> } /> } /> } /> ); } }