File size: 1,829 Bytes
db75f77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { useLocation } from 'react-router-dom'
import { Activity } from 'lucide-react'
import { useState, useEffect } from 'react'

const ROUTE_TITLES = {
  '/': 'Dashboard',
  '/arena': 'Episode Arena',
  '/tasks': 'Task Bank',
  '/forge': 'Forge Queue',
  '/oversight': 'Oversight Stats',
  '/difficulty': 'Difficulty Curve',
  '/grader': 'Standalone Grader',
}

export default function Header() {
  const { pathname } = useLocation()
  const title = ROUTE_TITLES[pathname] || 'Forge Arena'
  const [serverOk, setServerOk] = useState(null)
  const [time, setTime] = useState(new Date())

  useEffect(() => {
    const check = async () => {
      try {
        const r = await fetch('/api/forge/queue')
        setServerOk(r.ok)
      } catch {
        setServerOk(false)
      }
    }
    check()
    const t = setInterval(check, 10000)
    return () => clearInterval(t)
  }, [])

  useEffect(() => {
    const t = setInterval(() => setTime(new Date()), 1000)
    return () => clearInterval(t)
  }, [])

  return (
    <header className="h-14 border-b border-border bg-panel flex items-center px-6 sticky top-0 z-20">
      <div className="flex-1">
        <h1 className="text-base font-semibold text-primary">{title}</h1>
      </div>
      <div className="flex items-center gap-5">
        <span className="text-xs font-mono text-muted">{time.toLocaleTimeString()}</span>
        <div className="flex items-center gap-1.5 text-xs font-mono">
          <Activity size={12} className={serverOk === null ? 'text-muted' : serverOk ? 'text-green-neon' : 'text-red-neon'} />
          <span className={serverOk === null ? 'text-muted' : serverOk ? 'text-green-neon' : 'text-red-neon'}>
            {serverOk === null ? 'checking' : serverOk ? 'online' : 'offline'}
          </span>
        </div>
      </div>
    </header>
  )
}