Catalyst / admin/Synapse-Cortex 14.8 GB / 57.8 GB 40.0 GB free
Help Sign in

admin / Synapse-Cortex

public

Self Hosted ITSM Tool with RBAC/Tenanting and MFA

Code Issues Pull requests Pipelines Packages Security Insights Wiki Settings
Synapse-Cortex / Synapse-Cortexv2 / frontend / src / layout / AppShell.tsx 1572 B · main
 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
import { Outlet, useNavigate } from 'react-router-dom'
import { useAuth } from '../auth/AuthContext'
import { Sidebar } from './Sidebar'
import { PageHeaderProvider, useHeaderValue } from './PageHeaderContext'

function AppShellInner() {
  const { user, logout } = useAuth()
  const navigate = useNavigate()
  const header = useHeaderValue()

  const handleLogout = async () => {
    await logout()
    navigate('/login')
  }

  return (
    <div className="flex h-screen bg-cortex-bg text-chrome font-body">
      <Sidebar />
      <div className="flex-1 flex flex-col min-w-0">
        <header className="h-14 border-b border-cortex-border bg-cortex-panel flex items-center justify-between px-6 shrink-0">
          <div className="text-xs text-cortex-muted uppercase tracking-wider">{header}</div>
          <div className="flex items-center gap-3">
            <span className="text-sm text-chrome">{user?.full_name}</span>
            <span className="text-[10px] px-2 py-0.5 rounded bg-cortex-panel2 border border-cortex-border text-accent-blue uppercase">
              {user?.role.replace('_', ' ')}
            </span>
            <button onClick={handleLogout} className="text-xs text-cortex-muted hover:text-accent-red transition">
              LOGOUT
            </button>
          </div>
        </header>
        <main className="flex-1 p-6 scan-line overflow-auto">
          <Outlet />
        </main>
      </div>
    </div>
  )
}

export function AppShell() {
  return (
    <PageHeaderProvider>
      <AppShellInner />
    </PageHeaderProvider>
  )
}