[FE-14] 상품 상세 “채팅하기” 진입 (goods 거래 채팅)

작업 내용 (설계 의도)

변경 사항

근거: 설계 문서 S8·PRD FR-18. 파일: app/product/[id]/index.tsx(변경, 이 티켓 단독 소유 — 다른 티켓과 충돌 없음).

기존 상품 상세에 “판매자와 채팅하기” 보조 CTA를 추가한다(주요 CTA는 장바구니 유지, accent 1곳 규칙 위해 채팅 CTA는 보조 스타일).

  • useStartGoodsChat(FE-05, POST /products/{productId}/chat) 사용.
  • 2단계: “채팅하기” 탭 → 확인 시트(“판매자와 1:1 채팅을 시작할까요?”) → 방 생성/이동(기존 방 있으면 이동) → /rooms/{roomId}.
  • 본인 상품이면 CTA 숨김(Product.ownerId == 내 userIduseMyProfile/useCurrentUserId).
  • 상태: loading(생성 중 CTA 스피너), error(“채팅을 시작하지 못했어요” 토스트), success(방 이동).
  • 진입점 노출은 chat.goods.enabled(2단계) 플래그(FE-15 와이어업).
  • 토스 패턴: 기존 화면에 보조 CTA 1개만 추가, 절제.

기존 하드코딩 색은 이 파일 범위에서 채팅 CTA 부분만 토큰 사용(전체 리팩토링은 범위 밖 — 무관 변경 금지). 새 CTA는 테마 토큰 준수.

롤백: chat.goods.enabled=false로 CTA 숨김.

의존

  • FE-04 (UI 프리미티브), FE-05 (goods-chat 훅)

다이어그램

처리 흐름

sequenceDiagram
    participant Buyer
    participant Screen as product/[id]
    participant Hook as useStartGoodsChat
    participant BE
    Buyer->>Screen: "채팅하기" 탭
    Screen->>Buyer: 확인 시트
    Buyer->>Screen: 확인
    Screen->>Hook: start(productId)
    Hook->>BE: POST /products/{id}/chat
    BE-->>Hook: RoomResponse
    Screen->>Screen: /rooms/{roomId} 이동

테스트 케이스

  • “채팅하기” 탭 → 확인 시트 → 확정 시 방으로 이동한다
  • 기존 거래 방이 있으면 같은 roomId로 이동한다(중복 생성 없음)
  • 본인 상품이면 채팅 CTA가 렌더되지 않는다
  • 방 생성 실패 시 오류 토스트가 표시되고 화면에 머문다
  • 채팅 CTA가 테마 토큰으로 라이트/다크 모두 렌더된다