fix(web): conversation DELETE — resolve Failed to fetch TypeError
Root cause: @fastify/cors default allowed methods are only GET, HEAD, POST (CORS-safelisted methods). DELETE requires a CORS preflight OPTIONS request, and without DELETE in Access-Control-Allow-Methods the browser rejects it with TypeError: Failed to fetch before the request reaches the server. Fix: explicitly set methods in enableCors() to include DELETE and all other HTTP verbs used by the API. Also add try/catch to handleDelete in ChatPage so errors surface in the console rather than becoming unhandled promise rejections. Fixes #195. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -40,6 +40,7 @@ async function bootstrap(): Promise<void> {
|
||||
app.enableCors({
|
||||
origin: process.env['GATEWAY_CORS_ORIGIN'] ?? 'http://localhost:3000',
|
||||
credentials: true,
|
||||
methods: ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
|
||||
});
|
||||
|
||||
await app.register(helmet as never, { contentSecurityPolicy: false });
|
||||
|
||||
@@ -151,11 +151,15 @@ export default function ChatPage(): React.ReactElement {
|
||||
|
||||
const handleDelete = useCallback(
|
||||
async (id: string) => {
|
||||
await api<void>(`/api/conversations/${id}`, { method: 'DELETE' });
|
||||
setConversations((prev) => prev.filter((c) => c.id !== id));
|
||||
if (activeId === id) {
|
||||
setActiveId(null);
|
||||
setMessages([]);
|
||||
try {
|
||||
await api<void>(`/api/conversations/${id}`, { method: 'DELETE' });
|
||||
setConversations((prev) => prev.filter((c) => c.id !== id));
|
||||
if (activeId === id) {
|
||||
setActiveId(null);
|
||||
setMessages([]);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[ChatPage] Failed to delete conversation:', err);
|
||||
}
|
||||
},
|
||||
[activeId],
|
||||
|
||||
Reference in New Issue
Block a user