diff --git a/ui/src/App.jsx b/ui/src/App.jsx index 5103693..3c6a75d 100644 --- a/ui/src/App.jsx +++ b/ui/src/App.jsx @@ -1,18 +1,106 @@ -import React from 'react'; -import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import React, { useState } from 'react'; +import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; import ConsolidatedHome from './components/ConsolidatedHome'; import ChangeoverDetail from './components/ChangeoverDetail'; import EventTimeline from './components/EventTimeline'; import './index.css'; +const STATIC_PASSWORD = "SOP-Monitor-99"; + +function ProtectedRoute({ children, isAuthenticated }) { + if (!isAuthenticated) { + return ; + } + return children; +} + +function Login({ onLogin }) { + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + const handleSubmit = (e) => { + e.preventDefault(); + if (password === STATIC_PASSWORD) { + onLogin(); + } else { + setError('Incorrect password'); + } + }; + + return ( +
+
+

AI SOP Monitoring

+
+ setPassword(e.target.value)} + style={{ + padding: '0.75rem 1rem', + borderRadius: '8px', + border: '1px solid var(--panel-border)', + background: 'rgba(255,255,255,0.05)', + color: 'var(--text)', + fontSize: '1rem', + outline: 'none', + boxShadow: 'inset 0 2px 4px rgba(0,0,0,0.2)' + }} + /> + {error &&

{error}

} + +
+
+
+ ); +} + function App() { + const [isAuthenticated, setIsAuthenticated] = useState(() => { + return localStorage.getItem('sop_auth') === 'true'; + }); + + const handleLogin = () => { + setIsAuthenticated(true); + localStorage.setItem('sop_auth', 'true'); + }; + return (
- } /> - } /> - } /> + } /> + + + + } /> + + + + } /> + + + + } />