fix(chat): 협상 종료 시 목록·init 쿼리 캐시 무효화

- send 응답에서 종료 전이(session_status ≠ 협상중 또는 chat_end) 감지 시 sessions·init 캐시 무효화
- 마감/종료/권한 에러로 목록 복귀할 때도 동일하게 무효화
- /list 복귀 시 staleTime(60s) 과 무관하게 항상 최신 상태 표시, 종료 세션 재진입 시 인디케이터 숨김 즉시 적용

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
민헌 2026-07-06 17:25:38 +09:00
parent 482c8ed97c
commit 1f16bec9ee

View File

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