VibecoderMcSwaggins's picture
feat(frontend): React + Vite + NiiVue frontend (replaces Gradio) (#32)
fbf73ff
raw
history blame
1.57 kB
import { http, HttpResponse, delay } from 'msw'
const API_BASE = import.meta.env.VITE_API_URL || 'http://localhost:7860'
export const handlers = [
http.get(`${API_BASE}/api/cases`, async () => {
await delay(100)
return HttpResponse.json({
cases: ['sub-stroke0001', 'sub-stroke0002', 'sub-stroke0003'],
})
}),
http.post(`${API_BASE}/api/segment`, async ({ request }) => {
const body = (await request.json()) as { case_id: string; fast_mode?: boolean }
await delay(200)
return HttpResponse.json({
caseId: body.case_id,
diceScore: 0.847,
volumeMl: 15.32,
// Reflect fast_mode in response - slower when fast_mode=false
elapsedSeconds: body.fast_mode === false ? 45.0 : 12.5,
dwiUrl: `${API_BASE}/files/dwi.nii.gz`,
predictionUrl: `${API_BASE}/files/prediction.nii.gz`,
})
}),
]
// Error handlers for testing error states
export const errorHandlers = {
casesServerError: http.get(`${API_BASE}/api/cases`, () => {
return HttpResponse.json(
{ detail: 'Internal server error' },
{ status: 500 }
)
}),
casesNetworkError: http.get(`${API_BASE}/api/cases`, () => {
return HttpResponse.error()
}),
segmentServerError: http.post(`${API_BASE}/api/segment`, () => {
return HttpResponse.json(
{ detail: 'Segmentation failed: out of memory' },
{ status: 500 }
)
}),
segmentTimeout: http.post(`${API_BASE}/api/segment`, async () => {
await delay(30000)
return HttpResponse.json({ detail: 'Timeout' }, { status: 504 })
}),
}