[FE-08] 앱 lib/useRecruitment.ts 모집 query 훅

작업 내용 (설계 의도)

변경 사항

모집 화면들이 소비할 TanStack Query 훅을 신규 파일 mobile/lib/useRecruitment.ts에 정의한다. 서버 상태는 Query 캐시가 SSOT — 스토어 복사 금지.

  • useRecruitments(communityId?), useRecruitment(id), useApplications(recruitmentId), useMyApplications()(§Open Questions 계약 확정 전 임시 경로).
  • mutation: useCreateRecruitment()(성공→목록 무효화), useApplyRecruitment(id)(신청→ApplyResult 반환, 낙관 미적용), useCancelApplication()(성공→내 신청·상세 무효화), useCancelRecruitment(id)(성공→목록·상세 무효화).
  • 취소 수수료 미리보기: useCancellationPreview(applicationId) — BE 프리뷰 엔드포인트 확정 시 서버값, 미제공 시 마감시각·참가비로 클라 계산(단계율 7일↑0/3~7일 5/3일↓10).

근거: 20260707-...-design-fe-app.md API 연동 표(모집), 상태관리 설계.

의존

  • FE-02 (recruitment api·타입)

다이어그램

클래스 의존

flowchart LR
    Hook["lib/useRecruitment.ts"] --> Api["api/recruitment.ts"]
    List["recruitments/index (FE-11)"] --> Hook
    Detail["recruitments/[id] (FE-13)"] --> Hook
    Me["recruitments/me (FE-15)"] --> Hook

테스트 케이스

  • useRecruitments()가 목록을, useRecruitments(3)이 모임 필터 목록을 반환한다
  • useApplyRecruitment가 성공 시 ApplyResult(checkoutUrl/applicationId)를 반환한다
  • useCancelApplication 성공 시 내 신청 목록 queryKey를 무효화한다
  • useCancellationPreview가 마감 5일 전 5% 환불액(참가비*0.95)을 계산한다
  • useCancelRecruitment 성공 시 상세·목록을 무효화한다
  • 409(정원초과) 응답이 mutation error로 노출된다