Echte Seite WorkersPage im Prüfstand (Austausch-Module für Anmeldung, Mitarbeiterliste und Sitzungs-JWT), Skript-API mit Pult, Aktionen und Interessent samt Schaltern für 409, 400, Ausfall und Leerzustand, vier neue Szenarien (Freigabe, Interessent, Anhalten, Handy), jedes Szenario läuft für sich, und der Szenario Desktop bestätigt jetzt die Rückfrage vor dem Anhalten. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
67 lines
3.3 KiB
React
67 lines
3.3 KiB
React
// Einstiegspunkt des Prüfstands: das Hochhaus-Board der Hustler-Seite mit der Skript-API, ohne Anmeldung und ohne Appwrite.
|
|
// Drumherum steht dieselbe Hülle wie in der App (Menüleiste links, Seitenrand), damit die Bühne genauso breit wird wie im echten Betrieb.
|
|
// ?halted=1 startet mit gesetzter Bounce-Notbremse (H4). window.__wk gibt es nur hier: die Bühne und die Skript-API für shot.cjs.
|
|
// ?fault=none|down|session|hang schaltet zwischen Board und Skript-API den echten API-Client (createWorkersApi) mit einer Fetch-Weiche
|
|
// (scripted-fetch.js): window.__wk.control.fault lässt sich zur Laufzeit auf null | 'down' | 'session' | 'hang' setzen (Ausfall-Szenario).
|
|
// Ohne den Parameter bekommt das Board die Skript-API direkt (Szenarien A bis E).
|
|
// ?page=1 zeigt statt des Boards die echte Seite WorkersPage (Reiter Hochhaus und Freigabe, PultList, ProspectPanel); AuthContext,
|
|
// useEmployees und workersClient sind dort durch stub-*.js ersetzt (build.mjs). ?tab=freigabe öffnet den Reiter gleich (Deep-Link).
|
|
// Mit ?page=1&fault=none läuft die Seite über den echten API-Client und die Fetch-Weiche (Pult, Aktionen, Interessent).
|
|
import { StrictMode, createRef } from 'react'
|
|
import { createRoot } from 'react-dom/client'
|
|
import { MemoryRouter } from 'react-router-dom'
|
|
import '../../src/styles/global.css'
|
|
import '../../src/styles/workers.css'
|
|
import PageHeader from '../../src/components/ui/PageHeader'
|
|
import WorkersBoard from '../../src/components/workers/WorkersBoard'
|
|
import WorkersPage from '../../src/pages/WorkersPage'
|
|
import { createWorkersApi } from '../../src/lib/workersApi.js'
|
|
import { createScriptedApi } from './scripted-api.js'
|
|
import { createScriptedFetch } from './scripted-fetch.js'
|
|
import { holder } from './harness-bridge.js'
|
|
|
|
const params = new URLSearchParams(window.location.search)
|
|
const scripted = createScriptedApi({ now: () => performance.now(), base: Date.now(), halted: params.get('halted') === '1' })
|
|
const stage = createRef()
|
|
const fault = params.get('fault')
|
|
const control = { fault: fault && fault !== 'none' ? fault : null, calls: [], jwts: [] }
|
|
// Zeitgrenze im Prüfstand kurz (1,5 s statt 20 s), damit der Ausfall „Antwort kommt nie“ in Sekunden sichtbar wird
|
|
const api = fault === null
|
|
? scripted
|
|
: createWorkersApi({
|
|
getJwt: async (options) => {
|
|
control.jwts.push(Boolean(options && options.fresh))
|
|
return 'harness-jwt'
|
|
},
|
|
fetchImpl: createScriptedFetch(scripted, control),
|
|
timeoutMs: 1500,
|
|
})
|
|
window.__wk = { stage, api: scripted, control }
|
|
holder.api = api
|
|
|
|
const pageMode = params.get('page') === '1'
|
|
const tab = params.get('tab')
|
|
const entries = [pageMode && tab ? `/hustler?tab=${encodeURIComponent(tab)}` : '/hustler']
|
|
|
|
createRoot(document.getElementById('root')).render(
|
|
<StrictMode>
|
|
<MemoryRouter initialEntries={entries}>
|
|
<div className="shell">
|
|
<div className="sidebar" aria-hidden="true" />
|
|
<div className="main">
|
|
<main id="inhalt">
|
|
{pageMode ? (
|
|
<WorkersPage />
|
|
) : (
|
|
<div className="page wk-page">
|
|
<PageHeader title="Hustler" subtitle="Die Nachtschicht deiner Claude-Armee" />
|
|
<WorkersBoard api={api} isAdmin stageRef={stage} />
|
|
</div>
|
|
)}
|
|
</main>
|
|
</div>
|
|
</div>
|
|
</MemoryRouter>
|
|
</StrictMode>,
|
|
)
|