~bigbes/lethe

ref: 34d3e982765568f6d25f0e486603d3c2d73f8321 lethe/web/src/shell/TopBar.tsx -rw-r--r-- 1.6 KiB
34d3e982 — Eugene Blikh docs(lethe-web-ui-login): plan + execute hands-off decisions a month ago
                                                                                
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
import React from 'react'
import { useRouterState, useNavigate } from '@tanstack/react-router'

interface TopBarProps {
  onPaletteOpen: () => void
}

const tabs = [
  { id: 'home',     label: 'Recent',   path: '/',          match: ['/', '/search'] },
  { id: 'projects', label: 'Projects', path: '/projects',  match: ['/projects'] },
  { id: 'stats',    label: 'Stats',    path: '/stats',     match: ['/stats'] },
  { id: 'health',   label: 'Health',   path: '/health',    match: ['/health'] },
  { id: 'settings', label: 'Settings', path: '/settings',  match: ['/settings'] },
]

export function TopBar({ onPaletteOpen }: TopBarProps): React.JSX.Element {
  const pathname = useRouterState({ select: s => s.location.pathname })
  const navigate = useNavigate()

  function isActive(tab: typeof tabs[number]): boolean {
    return tab.match.includes(pathname)
  }

  return (
    <div className="topbar">
      <span className="brand" onClick={() => void navigate({ to: '/' })}>
        assistant-log
      </span>
      <span className="brand-sep">/</span>
      <span className="brand-host">lethe</span>

      <div className="search" onClick={onPaletteOpen} role="button" aria-label="Open command palette">
        <span className="ghost">search turns, sessions, paths</span>
        <span className="kbd">K</span>
      </div>

      <nav>
        {tabs.map(tab => (
          <span
            key={tab.id}
            className={'tab' + (isActive(tab) ? ' active' : '')}
            onClick={() => void navigate({ to: tab.path })}
          >
            {tab.label}
          </span>
        ))}
      </nav>
    </div>
  )
}