File size: 2,728 Bytes
808332c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { useState, useEffect } from 'react';
import Topbar       from './components/Topbar';
import TokenBar     from './components/TokenBar';
import Scenario1Tab from './tabs/Scenario1Tab';
import Scenario2Tab from './tabs/Scenario2Tab';
import ApiTab       from './tabs/ApiTab';
import AdminTab     from './tabs/AdminTab';
import IntelTab     from './tabs/IntelTab';
import { getToken, clearToken } from './api';

const TABS = [
  { id: 'scenario1', label: '🔬 Scenario 1: Behavior' },
  { id: 'scenario2', label: '🚨 Scenario 2: Attacks'  },
  { id: 'api',       label: '🔧 API Testing'           },
  { id: 'admin',     label: '🛡️ Admin Dashboard'       },
  { id: 'intel',     label: '🧠 Intelligence'          },
];

export default function App() {
  const [activeTab,     setActiveTab]     = useState('scenario1');
  const [token,         setToken]         = useState(getToken);
  const [serverStatus,  setServerStatus]  = useState('checking');

  const refreshToken = () => setToken(getToken());
  const handleClear  = () => { clearToken(); setToken(''); };

  const ping = async () => {
    setServerStatus('checking');
    try {
      const r = await fetch('/health');
      setServerStatus(r.ok ? 'online' : 'error');
    } catch {
      setServerStatus('offline');
    }
  };

  useEffect(() => { ping(); }, []);

  return (
    <div className="app">
      <Topbar serverStatus={serverStatus} onRefresh={ping} />

      <div className="container">
        <div className="hero">
          <h1>Adaptive Authentication <span>Framework</span></h1>
          <p>
            Production-ready risk-based auth &mdash; JWT &bull; 2FA &bull;
            Behavioral Analysis &bull; Anomaly Detection
          </p>
        </div>

        <TokenBar token={token} onRefresh={refreshToken} onClear={handleClear} />

        <nav className="main-tabs" role="tablist">
          {TABS.map(t => (
            <button
              key={t.id}
              role="tab"
              aria-selected={activeTab === t.id}
              className={activeTab === t.id ? 'active' : ''}
              onClick={() => setActiveTab(t.id)}
            >
              {t.label}
            </button>
          ))}
        </nav>

        <div role="tabpanel">
          {activeTab === 'scenario1' && <Scenario1Tab onTokenSave={refreshToken} />}
          {activeTab === 'scenario2' && <Scenario2Tab onTokenSave={refreshToken} />}
          {activeTab === 'api'       && <ApiTab       onTokenSave={refreshToken} />}
          {activeTab === 'admin'     && <AdminTab     onTokenSave={refreshToken} />}
          {activeTab === 'intel'     && <IntelTab     onTokenSave={refreshToken} />}
        </div>
      </div>
    </div>
  );
}