Skip to content

Conversation

@donut74
Copy link
Collaborator

@donut74 donut74 commented Dec 31, 2025

⚙️ Related ISSUE Number

#68


📄 Work Description

1. api/urls.ts

  • 역할: API 엔드포인트 상수 정의
  • 주요 내용:
    • 파티 리스트 조회 엔드포인트 추가 (GET_PARTIES: "/api/parties")

2. api/partyApi.ts

  • 역할: 파티 리스트 조회 API 함수 및 유효성 검사
  • 주요 기능:
    • getPartyList: 파티 리스트 조회 API 호출
    • isValidPartyItem: 파티 아이템 필수 필드 검증
      • 화면 표시에 필요한 필드 검증 (partyId, title, pricePerPerson, participantStatus, distance, distanceKm, timeAgo, isClosed)
      • 카테고리 유효값 검증 (ALL, DELIVERY, GROCERY, HOUSEHOLD)
    • isValidPartyListResponse: API 응답 데이터 구조 검증
      • activeParties, closedParties 배열 검증
      • 각 배열의 아이템 유효성 검증
  • 에러 처리:
    • try-catch로 네트워크 오류 처리
    • 유효하지 않은 데이터 시 빈 데이터 구조 반환
    • 앱 크래시 방지를 위한 안전한 폴백 처리

3. hooks/usePartyList.ts

  • 역할: React Query를 사용한 파티 리스트 조회 훅
  • 주요 기능:
    • useQuery로 파티 리스트 데이터 조회
    • 카테고리 필터 상태 관리 (partyType, setPartyType)
    • 쿼리 키에 카테고리, 위도, 경도 포함하여 자동 refetch
    • 위치 정보가 있을 때만 쿼리 실행 (enabled 옵션)

4. app/(tabs)/index.tsx

  • 역할: 홈 화면 메인 컴포넌트
  • 주요 기능:
    • 위치 정보 조회 (useUserCoords)
    • 파티 리스트 조회 (usePartyList)
    • 카테고리 필터 UI (MainCategory)
    • 파티 리스트 표시 (PartyList)
  • 위치 정보 처리:
    • 컴포넌트 마운트 시 위치 정보 자동 조회
    • 위도/경도를 문자열로 변환하여 API 호출

5. components/main/MainCard.tsx

  • 역할: 개별 파티 카드 컴포넌트
  • 주요 기능:
    • 파티 정보 표시 (제목, 가격, 인원수, 거리, 시간)
    • 이미지 표시 및 에러 처리
      • 이미지 로딩 실패 시 카테고리별 기본 아이콘 표시
      • imageError 상태로 이미지 로딩 실패 감지
    • 마감 파티 시각적 처리
      • 마감 시 오버레이 적용 (rgba(0, 0, 0, 0.4))
      • 이미지 블러 효과 (blurRadius: 2)
      • 뱃지 색상 변경 (회색 배경)
    • 카테고리별 아이콘 매핑
      • ALL, DELIVERY, GROCERY, HOUSEHOLD 각각의 아이콘

6. components/main/MainCategory.tsx

  • 역할: 카테고리 필터 컴포넌트
  • 주요 기능:
    • 카테고리 선택 UI (전체, 배달, 장보기, 생활용품)
    • 선택된 카테고리 하이라이트 표시
    • 카테고리 변경 시 콜백 호출 (onCategoryChange)

7. components/main/PartyList.tsx

  • 역할: 파티 리스트 표시 컴포넌트
  • 주요 기능:
    • 활성 파티와 종료된 파티를 합쳐서 표시
    • FlatList로 파티 카드 리스트 렌더링
    • 로딩 상태 처리
      • 로딩 중일 때 빈 상태 화면 숨김
      • 데이터가 없을 때만 빈 상태 메시지 표시
    • 빈 상태 UI
      • "아직 우리 동네에 파티가 없어요" 메시지
      • 첫 파티 생성 유도 문구

8. types/party.ts

  • 역할: 파티 관련 TypeScript 타입 정의
  • 주요 타입:
    • PartyCategory: 파티 카테고리 타입 (ALL, DELIVERY, GROCERY, HOUSEHOLD)
    • PartyListParams: 파티 리스트 조회 파라미터
    • PartyItem: 파티 아이템 데이터 구조
      • partyId, thumbnailImage, title, pricePerPerson
      • participantStatus, distance, distanceKm, timeAgo
      • isClosed, category, createdAt
    • PartyListResponse: API 응답 데이터 구조
      • activeParties, closedParties 배열
      • hasNext, totalCount

9. components/main/MainHeader.tsx

  • 스토어 연동:
    • useAuthStore를 사용하여 사용자 정보 가져오기
    • 닉네임 동적 표시
      • 스토어에서 닉네임 가져와서 캐러셀 인사말에 포함
      • 기본값: "한입만"
    • 위치 정보 동적 표시
      • 스토어에서 위치 정보 가져와서 헤더에 표시
      • 기본값: "위치 없음"

🔑 주요 개선 사항

  1. 데이터 유효성 검사

    • 화면 표시에 필요한 필수 필드 검증
    • 쿼리 업데이트 시마다 자동 유효성 검사 수행
    • 유효하지 않은 데이터 시 안전한 폴백 처리
  2. 에러 처리 강화

    • 네트워크 오류 시 빈 데이터 반환
    • 앱 크래시 방지
    • 사용자 친화적인 빈 상태 화면 표시
  3. 이미지 에러 처리

    • 이미지 로딩 실패 시 카테고리별 기본 아이콘 표시
    • 이미지 에러 상태 관리로 안정적인 UI 제공
  4. 로딩 상태 관리

    • 필터 변경 시 로딩 중 빈 상태 화면 숨김
    • 사용자 경험 개선
  5. 마감 파티 시각적 처리

    • 오버레이 및 블러 효과로 마감 상태 명확히 표시
    • 뱃지 색상 변경으로 상태 구분



📷 Screenshot

(백에서 ALL 카테고리로 하나를 넣어주셔서,,,
일단 공지 아이콘으로 기본이미지 넣어놓긴 했는데, 추후에 삭제해도 좋을 것 같습니다)

2025-12-31.4.36.02.mov
스크린샷 2025-12-31 오후 4 55 39 스크린샷 2025-12-31 오후 4 59 55



💬 To Reviewers

지금은 useQuery로 한번에 데이터를 불러오는데 추후에
useInfiniteQuery로 변경하는 작업이 필요할 것 같습니다!



- 화면 표시에 필요한 필수 필드 검증 로직 추가
  - participantStatus, distance, distanceKm, timeAgo 등 검증
  - category 유효값 검증 (ALL, DELIVERY, GROCERY, HOUSEHOLD)
- API 응답 데이터 유효성 검사 함수 추가
- 에러 발생 시 빈 데이터 반환으로 앱 크래시 방지
- 쿼리 업데이트 시마다 자동 유효성 검사 수행
@donut74 donut74 requested a review from DandelionQZ December 31, 2025 08:02
@donut74 donut74 self-assigned this Dec 31, 2025
@donut74 donut74 linked an issue Dec 31, 2025 that may be closed by this pull request
3 tasks
Copy link
Collaborator

@DandelionQZ DandelionQZ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

카테고리 선택과 관련된 로직을 훅으로 관리하는 방법이 인상깊었습니다! 저는 이런경우 zustand store를 생성해서 전역으로 선택된 카테고리 값과 카테고리 변경 함수를 다뤘었거든요. props로 선택된 카테고리와 카테고리 변경 함수를 props로 넘겨줘야하지만 이렇게 훅으로 작성하는 방법도 있구나하고 새롭게 알고갑니다!! 수고하셨어요 ~!

Comment on lines +7 to +11
interface PartyListProps {
data: PartyListResponse | undefined;
isLoading?: boolean;
onCardPress?: (partyId: number) => void;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

값을 props로 받지 않고 PartyList 컴포넌트 내부에서 자체적으로 호출하는 건 어떤가요? 역할이 분리되어서 부모 컴포넌트가 많은 역할을 맡게되지 않아도 될거 같아서요!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isValidPartyItem와 isValidPartyListResponse를 구현하게 된 이유가 궁금합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 메인화면 리스트 API 연결

3 participants