[FE-13] 게스트 초대 발송·수신함 화면

작업 내용 (설계 의도)

변경 사항

근거: 설계 문서 S6·S7. 파일: app/invite/[roomId].tsx·app/invitations/index.tsx(신규, 이 티켓 단독 소유). expo-router 라우트 충돌 회피 위해 rooms/[id].tsx(FE-10)와 별도 경로 사용.

  • S6 초대 발송(invite/[roomId]): useInviteGuest(FE-08). 대상 userId 입력 + 발화권한(SegmentedControl canSpeak) + 참여기간(expiresInDays) + 단일 CTA. 방장만 진입(FR-11). 멱등 응답(“이미 대기 중인 초대”) 인라인 처리. 성공 → 방 복귀.
  • S7 수신함(invitations/index): useMyInvitations(FE-08 역제안 GET). 받은 초대 카드 리스트(커뮤니티/방·발화권한·만료 D-day·초대자) + 카드별 수락/거절 2선택. 수락 → 방목록·방 캐시 무효화 후 방 이동, 거절 → 카드 제거. 4상태(loading/empty “받은 초대가 없어요”/error/success).
  • 토스 패턴: 단일 과업 폼+하단 CTA(S6), 리스트 아이템당 명확한 2선택(S7).

색 하드코딩 금지, 라이트/다크. 진입점 노출은 chat.community.enabled 플래그(FE-15 와이어업).

롤백: 플래그 OFF로 초대 화면 진입점 숨김.

의존

  • FE-04 (UI 프리미티브), FE-08 (초대 훅)

다이어그램

처리 흐름

sequenceDiagram
    participant Host
    participant Invite as invite/[roomId]
    participant Guest
    participant Inbox as invitations/index
    Host->>Invite: 대상·권한·기간 입력, 발송
    Invite->>Guest: (BE) 초대 생성
    Guest->>Inbox: 수신함 열람
    Inbox->>Inbox: 수락 → 방 이동 / 거절 → 제거

테스트 케이스

  • 초대 발송 폼이 발화권한·참여기간을 계약대로 전송한다
  • 이미 대기 중 초대가 있으면 멱등 안내가 인라인으로 표시된다
  • 수신함이 비면 빈 상태 문구가 렌더된다
  • 초대 수락 시 방목록 캐시가 무효화되고 방으로 이동한다
  • 초대 거절 시 해당 카드가 목록에서 제거된다
  • 이미 만료된 초대 수락 시 서버 거부 안내가 표시된다(상태 보호)