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) } },