Skip to content

Comments

feat: 비로그인 모임 현황 조회 API 연동#40

Merged
kangdy25 merged 2 commits intomainfrom
feature/guest-status
Feb 17, 2026
Merged

feat: 비로그인 모임 현황 조회 API 연동#40
kangdy25 merged 2 commits intomainfrom
feature/guest-status

Conversation

@kangdy25
Copy link
Collaborator

@kangdy25 kangdy25 commented Feb 16, 2026

🚀 feat: 비로그인 모임 현황 조회 API 연동

📝 변경사항

  • 비로그인 모임 현황 조회 API 연동
  • 랜덤 컬러 로직 고도화 및 페이지에 적용

✅ 체크리스트

  • 코드 리뷰를 받았습니다
  • 테스트를 완료했습니다
  • 린터 에러가 없습니다
  • 타입 에러가 없습니다
  • 브라우저에서 테스트를 완료했습니다
  • 모바일에서 테스트를 완료했습니다 (해당되는 경우)

📸 스크린샷

UI 변경 사항이 있다면 이미지를 드래그해서 넣어주세요!

💬 리뷰어 전달사항

  • 랜덤 컬러 로직을 수정하고 필요한 페이지에 적용했습니다. 카카오맵 컴포넌트와 모임 현황 페이지(/meeting), 중간지점 결과 페이지(/result)에 적용이 되어서 작업 및 브랜치 머지 시 충돌에 유의해주세요

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 참여 폼에서 실시간 참가자 목록 및 현재 참여 상태를 표시합니다.
    • 회의 정보 및 참가자 데이터를 동적으로 로드하여 표시합니다.
  • 개선 사항

    • 참가자 목록의 UI 간격을 개선했습니다.
    • 경로 및 지도 표시의 색상 처리 로직을 최적화했습니다.
    • 사용자 인터페이스 스타일링을 간소화했습니다.

- 비로그인 현황 조회 API 연동 및 UI 작업
- 랜덤 컬러 배정 시스템 개선
@kangdy25 kangdy25 requested a review from kim3360 February 16, 2026 12:35
@vercel
Copy link

vercel bot commented Feb 16, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mingling-frontend Ready Ready Preview, Comment Feb 16, 2026 0:35am

@coderabbitai
Copy link

coderabbitai bot commented Feb 16, 2026

Walkthrough

참가자 색상 처리를 통합하고, 게스트 미팅 상태 조회 기능을 추가하며, 색상 생성 로직을 결정론적 팔레트 기반으로 변경하고, 참가자 데이터 병합 로직을 재구성했습니다.

Changes

Cohort / File(s) Summary
미팅 페이지 참가자 처리
app/meeting/[id]/page.tsx
사용자별 메모이제이션을 통합된 participantsWithColor 배열로 교체하고, myParticipant 및 others 추출 로직을 재구성했으며, 의존성 배열을 meetingData, selectedStation, myName, id로 변경했습니다. 모바일 뷰의 하단 패딩(md: pb-38)과 제어 컨테이너 클래스를 조정했습니다.
결과 페이지 라우트 색상 처리
app/result/[id]/page.tsx
각 사용자 라우트에 라우트 닉네임과 페이지 id로부터 파생된 hexColor를 추가하고, useEffect 의존성에 id를 포함했으며, 기본 라인 색상을 bg-gray-4에서 bg-gray-400으로 변경했습니다.
참여 초대 폼 동적 콘텐츠
components/join/joinForm.tsx
useGuestMeetingStatus 훅을 통해 게스트 미팅 상태를 동적으로 조회하고, meetingInfo 기반 헤더/서브타이틀과 실시간 참가자 섹션을 추가하며, localStorage 기반 상태 초기화를 제거했습니다.
지도 라우트 색상 처리
components/map/kakaoMapLine.tsx
UserRoute 인터페이스에 선택적 hexColor 속성을 추가하고, 동적 색상 선택을 userRoute.hexColor
게스트 미팅 상태 조회 훅
hooks/api/query/useGuestMeetingStatus.ts
Tanstack React Query를 활용하여 GET /api/meeting/${meetingId}/guestStatus 요청을 수행하는 새로운 훅을 추가하고, 60초 간격 재조회와 재시도 비활성화를 설정했습니다.
색상 생성 로직 표준화
lib/color.ts
HSV 기반 색상 변환을 20개 요소의 고정 PALETTE 배열 기반 결정론적 선택으로 교체하고, getRandomHexColor 서명을 (name: string, meetingId: string) 형태로 변경했습니다.
API 타입 확장
types/api.ts, app/recommend/page.tsx
GuestStatusData 및 GuestStatusResponse 타입을 추가하여 게스트 상태 API 응답을 정의하고, recommend 페이지에서 주석 정제를 수행했습니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • kim3360
🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항을 정확하게 반영하고 있으며, 비로그인 모임 현황 조회 API 연동이 핵심 기능임을 명확하게 나타냅니다.
Description check ✅ Passed PR 설명이 저장소의 템플릿 구조를 따르고 있으며, 변경사항, 체크리스트, 리뷰어 전달사항이 모두 포함되어 있습니다.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/guest-status

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/result/[id]/page.tsx (1)

136-137: ⚠️ Potential issue | 🔴 Critical

bg-gray-4로 되돌려야 합니다.

getLineColor 함수의 기본 반환값이 bg-gray-400으로 설정되어 있으나, 프로젝트 전반에서 일관되게 사용되는 커스텀 그레이 색상은 bg-gray-4입니다. 다른 컴포넌트들(app/meeting/[id]/page.tsx, app/create/page.tsx, components/join/joinForm.tsx, components/modal/feedbackModal.tsx)에서 bg-gray-4를 기본 비활성화 상태 색상으로 사용하고 있으므로, 이 부분도 동일하게 bg-gray-4로 변경되어야 하는 일관성 문제입니다.

🧹 Nitpick comments (6)
app/recommend/page.tsx (1)

32-83: useMemo 내부에서 localStorage.setItem 호출은 기존 코드이지만, 부수효과(side effect) 주의가 필요합니다.

meetingTypedefaultCategory useMemo 블록 내부에서 localStorage.setItem을 호출하고 있습니다. useMemo는 순수 계산용이므로 부수효과는 useEffect에서 처리하는 것이 React 권장 패턴입니다. 이번 PR의 변경 범위는 아니지만, 향후 리팩토링 시 개선을 고려해 주세요.

lib/color.ts (2)

28-37: Math.abs(hash)가 정수 오버플로 시 정확하지 않을 수 있습니다.

DJB2 해시 루프에서 (hash << 5)는 32비트 정수로 자르지만, 이후 + hash에서 hash는 이전 반복의 전체 값(32비트 이상 가능)을 사용합니다. 반복이 누적되면 hashNumber.MAX_SAFE_INTEGER를 초과하여 정밀도 손실이 발생할 수 있습니다. 일반적인 이름+모임ID 길이에서는 문제 없지만, 안전을 위해 매 반복마다 비트 마스킹을 적용하는 것을 권장합니다.

🔧 비트 마스킹을 통한 오버플로 방지
  let hash = 5381;
  for (let i = 0; i < key.length; i++) {
-   hash = (hash << 5) + hash + key.charCodeAt(i);
+   hash = ((hash << 5) + hash + key.charCodeAt(i)) | 0;
  }

| 0 연산은 매 반복마다 결과를 32비트 정수로 잘라 오버플로를 방지하고, 표준 DJB2 구현과 동일한 동작을 보장합니다.


1-22: 팔레트 크기 20은 참여자 수가 많을 경우 색상 충돌 가능성이 있습니다.

20개 팔레트에서 해시 기반으로 선택하므로, 참여자 수가 5명만 되어도 약 50% 확률로 2명 이상이 같은 색상을 받게 됩니다 (Birthday Problem). 현재 모임 규모에서 허용 가능한 수준인지 확인이 필요합니다. 만약 시각적 구분이 중요하다면, 충돌 회피 로직(이미 할당된 색상을 건너뛰는 방식)을 고려할 수 있습니다.

components/join/joinForm.tsx (2)

138-159: 참여자 목록에서 getRandomHexColor가 참여자당 2번 호출됩니다.

각 참여자에 대해 getRandomHexColor(p.userName, meetingId)가 배경색(Line 145)과 아바타(Line 149)에서 각각 호출됩니다. 함수 자체는 가볍지만, 결과를 변수에 저장하면 가독성과 일관성이 개선됩니다.

♻️ 색상 결과를 변수로 추출
  meetingInfo.participants.map((p, index) => {
+   const color = getRandomHexColor(p.userName, meetingId);
    return (
      <div
        key={index}
        className="flex items-center gap-2 rounded-full py-1 pr-3 pl-1"
-       style={{ backgroundColor: `${getRandomHexColor(p.userName, meetingId)}33` }}
+       style={{ backgroundColor: `${color}33` }}
      >
        <div
          className="flex h-6 w-6 items-center justify-center rounded-full text-[10px] font-medium text-white"
-         style={{ backgroundColor: getRandomHexColor(p.userName, meetingId) }}
+         style={{ backgroundColor: color }}
        >

85-89: 에러 핸들링에서 error: any 타입 사용.

catch (error: any) 대신 더 안전한 타입 처리를 권장합니다. 현재는 error.dataerror.response?.data에 접근하고 있는데, error의 실제 타입에 따라 런타임 에러가 발생할 수 있습니다. 이 부분은 기존 코드일 수 있으나, 에러 메시지 추출 로직 변경과 함께 개선할 수 있는 부분입니다.

app/meeting/[id]/page.tsx (1)

158-186: useMemo 내부에서 객체 직접 변이(mutation)는 코드 스멜입니다.

Line 179-183에서 myParticipant의 속성을 직접 변경하고 있습니다. .map()이 새 객체를 생성하므로 현재는 동작하지만, useMemo 내에서의 직접 변이는 React의 불변성 원칙과 어긋나며 향후 리팩토링 시 버그의 원인이 될 수 있습니다.

♻️ 스프레드 연산자로 불변성 유지
  const myParticipant = participantsWithColor.find((p) => p.name === myName);
  const others = participantsWithColor.filter((p) => p.name !== myName);

- if (myParticipant && selectedStation) {
-   const info = STATION_DATA.find((s) => s.name === selectedStation);
-   if (info) {
-     myParticipant.station = info.name;
-     myParticipant.line = info.line;
-     myParticipant.latitude = info.latitude;
-     myParticipant.longitude = info.longitude;
-   }
- }
-
- return myParticipant ? [myParticipant, ...others] : others;
+ if (myParticipant && selectedStation) {
+   const info = STATION_DATA.find((s) => s.name === selectedStation);
+   if (info) {
+     const updatedMe = {
+       ...myParticipant,
+       station: info.name,
+       line: info.line,
+       latitude: info.latitude,
+       longitude: info.longitude,
+     };
+     return [updatedMe, ...others];
+   }
+ }
+
+ return myParticipant ? [myParticipant, ...others] : others;

@kangdy25 kangdy25 merged commit 6bc4a4e into main Feb 17, 2026
5 checks passed
@kangdy25 kangdy25 deleted the feature/guest-status branch February 17, 2026 04:56
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.

2 participants