fix: address code review findings for AI chat builder

- C1: Fix race condition in handleReset — await abandonSession before
  starting new session to prevent store state corruption
- I1: Extract error messages from Axios response.data.detail instead of
  generic error.message — users now see helpful backend messages (quota
  limits, message caps, etc.)
- I2: Add isGenerating guard in generateTree store action to prevent
  concurrent generation requests on double-click
- I3: Add isResponding guard in sendMessage to prevent concurrent sends
- M5: Remove redundant type casts on flowType
- M6: Add rate limiter to DELETE /sessions/{id} for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-02-27 08:53:54 -05:00
parent 596153085a
commit e79ffff1dc
3 changed files with 24 additions and 16 deletions

View File

@@ -40,7 +40,7 @@ export function AIChatBuilderPage() {
if (resumeId && !sessionId) {
resumeSession(resumeId)
} else if (!sessionId && status === 'idle') {
startSession(flowType as 'troubleshooting' | 'procedural')
startSession(flowType)
}
}, []) // eslint-disable-line react-hooks/exhaustive-deps
@@ -81,15 +81,15 @@ export function AIChatBuilderPage() {
}
}, [importToEditor, treeMetadata, flowType, navigate])
const handleReset = useCallback(() => {
abandonSession()
const handleReset = useCallback(async () => {
await abandonSession()
// Clear session from URL
setSearchParams((prev) => {
const next = new URLSearchParams(prev)
next.delete('session')
return next
}, { replace: true })
startSession(flowType as 'troubleshooting' | 'procedural')
startSession(flowType)
}, [abandonSession, startSession, flowType, setSearchParams])
// Show error toast