Skip to content

feat: 버스 정류장 맵핀에 클릭 이벤트 추가#30

Merged
KwonDeaGeun merged 5 commits intomainfrom
feat/add-click-event-on-busstop-mappin
Nov 15, 2025
Merged

feat: 버스 정류장 맵핀에 클릭 이벤트 추가#30
KwonDeaGeun merged 5 commits intomainfrom
feat/add-click-event-on-busstop-mappin

Conversation

@KwonDeaGeun
Copy link
Owner

@KwonDeaGeun KwonDeaGeun commented Nov 13, 2025

Summary by CodeRabbit

  • 새로운 기능

    • 지도에서 버스 정류소 클릭으로 선택 가능(선택된 정류소 이름 유지).
    • 정류소 아이콘에 키보드(Enter/Space) 접근성 및 상호작용 추가.
  • 버그 수정 / 개선

    • 버스 위치 조회 실패 시 파괴적 토스트로 오류 안내하고 동일 오류는 일정시간 동안 반복 표시 방지(쓰로틀링).
    • 지도 이벤트/통신 로직 간소화로 웹뷰/모바일 연동 관련 불필요한 메시징 제거 및 터치 동작 일관성 향상.
    • API 호출 재시도 정책 적용 및 지도 오버레이 정리 안정성 개선.

@KwonDeaGeun KwonDeaGeun self-assigned this Nov 13, 2025
@vercel
Copy link

vercel bot commented Nov 13, 2025

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

Project Deployment Preview Comments Updated (UTC)
what-the-bus-web Ready Ready Preview Comment Nov 15, 2025 0:54am

@coderabbitai
Copy link

coderabbitai bot commented Nov 13, 2025

Walkthrough

앱에 ToastProvider를 도입하고 useBusLocations의 에러를 30초 스로틀로 토스트로 표시하도록 연결했으며, 정류소 클릭 콜백을 App → MapContainer → useMapOverlays → createBusStopOverlays 경로로 전달해 클릭/키보드 상호작용과 오버레이 정리(cleanup)를 지원하도록 변경했습니다.

Changes

Cohort / File(s) 변경 요약
앱 레벨 토스트 및 에러 처리
src/App.tsx
ToastProvider로 앱 래핑, React Query Devtools 위치 조정, useRef 기반 30초 스로틀 에러 토스트(useToast) 구현, useBusLocations에 에러 콜백 전달, 정류소 클릭 처리용 handleStopClick 추가 및 bubbleStop 상태 갱신.
MapContainer API 확장
src/components/MapContainer.tsx
onStopClick?: (stop: { lat: number; lng: number; name: string }) => void prop 추가(및 BusStop 타입 import), useMapOverlays에 콜백 전달.
훅 시그니처 변경
src/hooks/useMapOverlays.ts
onStopClick?: (stop: BusStop) => void 파라미터 수용, createBusStopOverlays로 전달, useEffect 의존성에 포함, cleanup에서 각 overlay.cleanup?.() 호출(try/catch로 보호).
오버레이 상호작용 및 정리
src/utils/mapOverlays.ts
OverlayHandlecleanup?: () => void 추가, createBusStopOverlays(..., onStopClick?) 도입, 아이콘에 pointer/role/tabindex 부여, click/keydown(Enter/Space) 핸들러로 onStopClick 호출, 이벤트 리스너 제거용 cleanup 반환.
버스 API 에러 처리 확장
src/api/bus.ts
useBusLocations(onError?) 시그니처로 변경, API 호출에 try/catch 및 handleApiError 처리 후 onError 호출, 실패 시 빈 배열 반환, react-query에 retry: 2 설정 추가.
WebView 관련 제거 및 간소화
src/hooks/useKakaoMap.ts, src/types/kakao.d.ts, src/hooks/useMapEventHandlers.ts
WebView/React Native 연동 코드 및 전용 전역 타입 제거(__moveFromRN, __onMapReady, __pendingMove, ReactNativeWebView 등), 메시지 origin 처리 단순화 및 touchmove 인터셉트 제거.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant App
    participant MapContainer
    participant useMapOverlays
    participant createBusStopOverlays
    participant useBusLocations

    Note over App: 앱 초기화 (ToastProvider 포함)
    App->>useBusLocations: 구독(오류 콜백 전달)
    useBusLocations-->>App: 오류 발생 → onError(message)
    App->>App: 에러 토스트 표시 (30초 스로틀)

    User->>createBusStopOverlays: 정류소 클릭 / Enter/Space
    createBusStopOverlays->>useMapOverlays: onStopClick(stop)
    useMapOverlays->>MapContainer: onStopClick(stop)
    MapContainer->>App: onStopClick(stop)
    App->>App: bubbleStop 상태 업데이트
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 주의할 파일/영역:
    • src/utils/mapOverlays.ts의 이벤트 리스너 등록/제거와 cleanup 안전성
    • onStopClick/BusStop 타입 일관성(각 레이어의 구조 매칭)
    • useBusLocations의 에러 전달 및 토스트 스로틀(중복 방지) 로직

Possibly related PRs

🐰 살금살금 지도를 건너와서
정류소를 톡, 콜백이 폴짝 뛰네
토스트가 한 번만 울리고
상태가 반짝, 청명한 밤하늘 아래 ✨

Pre-merge checks and finishing touches

❌ 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%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 버스 정류장 맵핀에 클릭 이벤트 추가라는 주요 변경사항을 명확하게 설명하고 있으며, 실제 코드 변경사항과 일치합니다.
✨ 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 feat/add-click-event-on-busstop-mappin

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 89b84a0 and 1e7f525.

📒 Files selected for processing (1)
  • src/hooks/useMapEventHandlers.ts (0 hunks)
💤 Files with no reviewable changes (1)
  • src/hooks/useMapEventHandlers.ts

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.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fd80019 and 34afff2.

📒 Files selected for processing (4)
  • src/App.tsx (1 hunks)
  • src/components/MapContainer.tsx (2 hunks)
  • src/hooks/useMapOverlays.ts (2 hunks)
  • src/utils/mapOverlays.ts (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: KwonDeaGeun
Repo: KwonDeaGeun/WhatTheBus-Web PR: 21
File: src/App.tsx:16-23
Timestamp: 2025-09-22T04:45:54.455Z
Learning: KwonDeaGeun은 TypeScript에서 any 타입 사용을 피하고 더 타입 안전한 코드를 선호한다.
🧬 Code graph analysis (4)
src/utils/mapOverlays.ts (1)
src/data/busStops.ts (1)
  • BusStop (1-5)
src/hooks/useMapOverlays.ts (2)
src/data/busStops.ts (2)
  • BusStop (1-5)
  • busStops (7-12)
src/utils/mapOverlays.ts (2)
  • OverlayHandle (5-7)
  • createBusStopOverlays (130-172)
src/components/MapContainer.tsx (2)
src/data/busStops.ts (2)
  • BusStop (1-5)
  • busStops (7-12)
src/hooks/useMapOverlays.ts (1)
  • useMapOverlays (10-35)
src/App.tsx (1)
src/components/MapContainer.tsx (1)
  • MapContainer (17-35)
🔇 Additional comments (7)
src/utils/mapOverlays.ts (1)

133-134: 변경사항 승인

함수 시그니처가 적절하게 확장되었으며, 선택적 매개변수로 타입 안전성이 유지됩니다.

src/hooks/useMapOverlays.ts (3)

14-15: 변경사항 승인

시그니처 확장이 적절하며 타입 안전성이 유지됩니다.


21-21: 변경사항 승인

onStopClick 콜백이 createBusStopOverlays로 올바르게 전달됩니다.


34-34: 변경사항 승인

의존성 배열에 onStopClick을 추가한 것이 적절합니다. onStopClick이 변경되면 오버레이가 올바르게 재생성됩니다.

src/components/MapContainer.tsx (3)

3-3: 변경사항 승인

BusStop 타입 임포트가 onStopClick 콜백 시그니처에 필요하며 적절합니다.


14-14: 변경사항 승인

onStopClick prop이 MapContainerProps 인터페이스와 컴포넌트 시그니처에 올바르게 추가되었습니다. 타입 안전성이 유지됩니다.

Also applies to: 21-21


27-27: 변경사항 승인

onStopClickuseMapOverlays에 올바르게 전달되어 클릭 이벤트 처리가 가능합니다.

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.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/App.tsx (1)

122-136: 선택적 개선: setTimeout 정리 고려

에러 토스트 스로틀링 로직이 잘 구현되었습니다. 다만 컴포넌트 언마운트 시 setTimeout이 정리되지 않습니다. 현재는 ref 값만 변경하므로 큰 문제는 없지만, 더 엄격한 정리를 원한다면 useEffect에서 타이머를 정리할 수 있습니다.

선택적으로 적용 가능한 개선 방안:

 const handleBusLocationError = useCallback((message: string) => {
     // Only show toast once to avoid spamming on refetch failures
     if (!errorShownRef.current) {
         toast({
             title: "버스 위치 조회 오류",
             description: message,
             variant: "destructive",
         });
         errorShownRef.current = true;
         // Reset after 30 seconds to allow showing error again if it persists
-        setTimeout(() => {
+        const timeoutId = setTimeout(() => {
             errorShownRef.current = false;
         }, 30000);
+        return () => clearTimeout(timeoutId);
     }
 }, [toast]);

그런 다음 반환된 cleanup 함수를 저장하고 적절히 정리할 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 34afff2 and 369d8cf.

📒 Files selected for processing (4)
  • src/App.tsx (4 hunks)
  • src/api/bus.ts (1 hunks)
  • src/hooks/useMapOverlays.ts (2 hunks)
  • src/utils/mapOverlays.ts (4 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: KwonDeaGeun
Repo: KwonDeaGeun/WhatTheBus-Web PR: 21
File: src/App.tsx:16-23
Timestamp: 2025-09-22T04:45:54.455Z
Learning: KwonDeaGeun은 TypeScript에서 any 타입 사용을 피하고 더 타입 안전한 코드를 선호한다.
🧬 Code graph analysis (4)
src/App.tsx (4)
src/components/ui/use-toast.tsx (2)
  • ToastProvider (27-81)
  • useToast (83-89)
src/api/bus.ts (1)
  • useBusLocations (7-28)
src/hooks/useBusSelection.ts (1)
  • useBusSelection (5-40)
src/components/MapContainer.tsx (1)
  • MapContainer (17-35)
src/api/bus.ts (4)
src/lib/api.ts (1)
  • apiGet (14-22)
src/data/bus.ts (1)
  • Bus (1-6)
src/lib/endpoints.ts (1)
  • API_ENDPOINTS (1-6)
src/lib/error.ts (1)
  • handleApiError (9-49)
src/hooks/useMapOverlays.ts (2)
src/data/busStops.ts (2)
  • BusStop (1-5)
  • busStops (7-12)
src/utils/mapOverlays.ts (2)
  • OverlayHandle (5-8)
  • createBusStopOverlays (131-201)
src/utils/mapOverlays.ts (1)
src/data/busStops.ts (1)
  • BusStop (1-5)
🔇 Additional comments (10)
src/hooks/useMapOverlays.ts (2)

14-15: LGTM! 타입 안전한 콜백 파라미터 추가

onStopClick 파라미터가 올바른 타입과 함께 선택적 파라미터로 추가되었습니다.


32-36: LGTM! 안전한 클린업 로직 구현

이벤트 리스너 정리를 위한 cleanup 메서드 호출이 try/catch로 보호되어 있어, 클린업 과정에서 발생할 수 있는 오류를 안전하게 처리합니다.

src/api/bus.ts (2)

7-22: LGTM! 견고한 에러 처리 구현

try/catch로 API 호출을 감싸고, 에러 발생 시 빈 배열을 반환하여 안전한 폴백을 제공합니다. onError 콜백을 통한 선택적 에러 전파도 적절합니다.


26-26: LGTM! 적절한 재시도 정책

일시적인 네트워크 오류 처리를 위한 재시도 횟수가 적절하게 설정되었습니다.

src/App.tsx (2)

74-88: LGTM! ToastProvider 올바르게 통합됨

ToastProvider로 앱 콘텐츠를 감싸서 하위 컴포넌트에서 useToast 훅을 사용할 수 있도록 구성되었습니다.


140-144: LGTM! 콜백 메모이제이션으로 성능 최적화

useCallback을 사용하여 handleStopClick 콜백을 메모이제이션함으로써, 매 렌더링마다 새로운 함수 참조가 생성되는 것을 방지하고 useMapOverlays의 불필요한 재실행을 막습니다.

src/utils/mapOverlays.ts (4)

7-7: LGTM! 인터페이스에 클린업 메서드 추가

OverlayHandle 인터페이스에 선택적 cleanup 메서드가 추가되어 이벤트 리스너 정리를 지원합니다.


148-151: LGTM! 훌륭한 접근성 구현

커서, role, aria-label, tabindex를 통해 키보드 접근성과 스크린 리더 지원이 완벽하게 구현되었습니다. 웹 접근성 표준을 잘 준수하고 있습니다.


156-174: LGTM! 이벤트 핸들러 완벽하게 구현됨

명명된 핸들러 함수들이 올바르게 구현되었습니다:

  • stopPropagation()으로 지도 클릭 이벤트와의 간섭 방지
  • preventDefault()로 기본 동작 방지
  • Enter와 Space 키 지원으로 완전한 키보드 접근성 제공
  • 명명된 함수로 적절한 클린업 지원

과거 리뷰에서 제기된 이벤트 전파 및 키보드 접근성 우려사항이 모두 해결되었습니다.


195-198: LGTM! 적절한 이벤트 리스너 정리

cleanup 메서드가 명명된 함수 참조를 사용하여 모든 이벤트 리스너를 올바르게 제거합니다. 메모리 누수를 방지하는 필수적인 구현입니다.

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.

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
src/hooks/useMapEventHandlers.ts (1)

5-12: 메시지 핸들러 제거 시 allowedOrigins도 함께 제거하세요.

만약 messageHandler를 제거하기로 결정한다면, allowedOrigins 설정 코드도 더 이상 사용되지 않으므로 함께 제거해야 합니다.

메시지 핸들러 제거 시 다음 diff를 적용하세요:

     useEffect(() => {
-        const selfOrigin = location.protocol.startsWith("http")
-            ? location.origin
-            : undefined;
-        const allowedOrigins = new Set([
-            ...(selfOrigin ? [selfOrigin] : []),
-            "http://localhost:3000",
-            "http://localhost:5173",
-        ]);
-
         const containerEl = document.getElementById(mapId);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 369d8cf and 89b84a0.

📒 Files selected for processing (3)
  • src/hooks/useKakaoMap.ts (0 hunks)
  • src/hooks/useMapEventHandlers.ts (1 hunks)
  • src/types/kakao.d.ts (0 hunks)
💤 Files with no reviewable changes (2)
  • src/types/kakao.d.ts
  • src/hooks/useKakaoMap.ts
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: KwonDeaGeun
Repo: KwonDeaGeun/WhatTheBus-Web PR: 21
File: src/App.tsx:16-23
Timestamp: 2025-09-22T04:45:54.455Z
Learning: KwonDeaGeun은 TypeScript에서 any 타입 사용을 피하고 더 타입 안전한 코드를 선호한다.

@KwonDeaGeun KwonDeaGeun merged commit 4295213 into main Nov 15, 2025
4 checks passed
@KwonDeaGeun KwonDeaGeun deleted the feat/add-click-event-on-busstop-mappin branch November 15, 2025 00:57
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.

1 participant