From 1f16bec9ee062b73534821ffcf8752266f4e801c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=ED=97=8C?= Date: Mon, 6 Jul 2026 17:25:38 +0900 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=ED=98=91=EC=83=81=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EC=8B=9C=20=EB=AA=A9=EB=A1=9D=C2=B7init=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=BA=90=EC=8B=9C=20=EB=AC=B4=ED=9A=A8?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - send 응답에서 종료 전이(session_status ≠ 협상중 또는 chat_end) 감지 시 sessions·init 캐시 무효화 - 마감/종료/권한 에러로 목록 복귀할 때도 동일하게 무효화 - /list 복귀 시 staleTime(60s) 과 무관하게 항상 최신 상태 표시, 종료 세션 재진입 시 인디케이터 숨김 즉시 적용 Co-Authored-By: Claude Fable 5 --- frontend/src/features/chat/hooks/useChatController.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/src/features/chat/hooks/useChatController.ts b/frontend/src/features/chat/hooks/useChatController.ts index 64c4ba8..c2816b4 100644 --- a/frontend/src/features/chat/hooks/useChatController.ts +++ b/frontend/src/features/chat/hooks/useChatController.ts @@ -9,6 +9,7 @@ import { chatKeys, } from '@/apis/chat' import { ErrorCode, getApiErrorMessage, isApiError } from '@/apis/types' +import { negotiationKeys, SessionStatus } from '@/apis' import { toast } from '@/lib' import { useChatStore } from '@/features/chat/stores/useChatStore' import { useChatInitStore } from '@/features/chat/stores/useChatInitStore' @@ -109,6 +110,12 @@ export function useChatController(sessionId: string) { const s = useChatStore.getState() if (data.message) s.appendMessage(mapMessage(data.message)) s.setIsLoading(false) + // 협상 종료 전이(완료/거부 등): 목록·init 캐시를 무효화해 + // /list 복귀 시 최신 상태를, 재진입 시 최신 session_status 를 보장한다. + if (data.session_status !== SessionStatus.IN_PROGRESS || data.message?.chat_end) { + queryClient.invalidateQueries({ queryKey: negotiationKeys.sessions() }) + queryClient.invalidateQueries({ queryKey: chatKeys.init(sessionId) }) + } }, onError: (error) => { const s = useChatStore.getState() @@ -134,6 +141,9 @@ export function useChatController(sessionId: string) { // 마감/종료/권한 등 더 진행 불가한 상태면 잠시 후 목록으로 복귀 if (TERMINAL_CODES.has(code)) { s.bindSend(null) // 입력 잠금(추가 전송 차단) + // 서버 기준 세션 상태가 이미 바뀐 것 — 복귀할 목록과 init 캐시를 무효화한다. + queryClient.invalidateQueries({ queryKey: negotiationKeys.sessions() }) + queryClient.invalidateQueries({ queryKey: chatKeys.init(sessionId) }) setTimeout(() => navigate('/list'), 1500) } },