상태: ✅ 구현 완료 작성일: 2026-01-27 기술 스택: Supabase, React Query, Expo Router
- 사용자가 다른 사용자를 차단하는 기능
- 차단 시 blocks 테이블에 기록, matches 상태를 unmatched로 변경
- 채팅 목록에서 차단된 유저의 대화 제거
- 채팅 화면에서 차단 상태 배너 표시 및 메시지 전송 차단
- 추천 대상에서 제외 (기존 구현)
api/blocks.ts- Block API 함수 (blockUser, unblockUser, checkIsBlocked)hooks/queries/use-blocks.ts- React Query 훅 (useBlockUser, useUnblockUser, useIsBlocked)
lib/query-keys.ts- isBlocked 쿼리 키 추가api/chat.ts- getConversations에서 차단 유저 대화 필터링app/chat/[id].tsx- 차단 상태 배너 + 메시지 전송 차단 + 입력 비활성화app/user/[id].tsx- 히어로 이미지 More(⋯) 드롭다운 메뉴에서 차단하기 접근 (매칭 상태일 때만 노출)
[차단하기 버튼] → blockUser()
├→ blocks INSERT
├→ matches UPDATE (status → "unmatched")
└→ invalidate: conversations, recommendations, isBlocked, matchStatus
[채팅 목록] → getConversations()
└→ blocks 조회 → 차단 유저 대화 필터링
[채팅 상세] → useIsBlocked()
├→ 차단 시: 배너 표시 + 입력 비활성화
└→ 전송 시도: Alert 표시 + 전송 차단
blockUser(blockerId, blockedId, reason?)- blocks INSERT + matches UPDATEunblockUser(blockerId, blockedId)- blocks DELETEcheckIsBlocked(userId, targetUserId)- 양방향 차단 확인 → { isBlocked, blockedByMe, blockedByThem }
useBlockUser(userId)- useMutation, 성공 시 conversations/recommendations/isBlocked/matchStatus invalidateuseUnblockUser(userId)- useMutationuseIsBlocked(userId, targetId)- useQuery
- 기존 패키지만 사용 (추가 설치 없음)
- @tanstack/react-query
- @supabase/supabase-js
id(uuid, PK)blocker_id(uuid, FK → profiles.id)blocked_id(uuid, FK → profiles.id)reason(text, nullable)created_at(timestamptz)- UNIQUE(blocker_id, blocked_id)
- 차단 목록 관리 화면 (설정에서 차단 해제)
- 유저 프로필에서 차단 → blocks 레코드 생성 확인
- 채팅 목록에서 차단된 유저 대화 사라짐 확인
- 채팅 상세 진입 시 차단 배너 표시 확인
- 메시지 전송 시도 시 Alert 표시 확인
- 추천에서 차단 유저 미노출 확인 (기존 로직)
api/blocks.tshooks/queries/use-blocks.tslib/query-keys.tsapi/chat.tsapp/chat/[id].tsxapp/user/[id].tsxapi/recommendations.ts(기존 차단 필터링)