feat: 코스 polyline 색 전환 빈도 감소#125
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request introduces a 'mergeShortSegments' utility function to merge short path segments, reducing the frequency of color transitions on the map overlay. It also cleans up unused imports, constants, and formats several code blocks. The review feedback suggests making 'mergeShortSegments' more robust by handling null or undefined inputs, using optional chaining when accessing 'courseDetail.segments', and memoizing the merged segments with 'useMemo' to prevent redundant calculations during frequent component re-renders.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| function mergeShortSegments( | ||
| segments: { startIdx: number; endIdx: number; grade: string }[], | ||
| ): { startIdx: number; endIdx: number; grade: string }[] { | ||
| return segments.reduce<{ startIdx: number; endIdx: number; grade: string }[]>( | ||
| (acc, seg) => { | ||
| const len = seg.endIdx - seg.startIdx + 1; | ||
| const last = acc[acc.length - 1]; | ||
| if (last && len < MIN_SEGMENT_COORDS) { | ||
| last.endIdx = seg.endIdx; | ||
| } else { | ||
| acc.push({ ...seg }); | ||
| } | ||
| return acc; | ||
| }, | ||
| [], | ||
| ); | ||
| } |
There was a problem hiding this comment.
mergeShortSegments 함수가 segments 인자로 null 또는 undefined를 받을 수 있도록 안전하게 처리하는 것이 좋습니다. courseDetail이 API로부터 로드되기 전에는 segments가 없을 수 있으므로, 방어적 프로그래밍 관점에서 예외 처리를 추가하면 런타임 에러를 방지할 수 있습니다.
| function mergeShortSegments( | |
| segments: { startIdx: number; endIdx: number; grade: string }[], | |
| ): { startIdx: number; endIdx: number; grade: string }[] { | |
| return segments.reduce<{ startIdx: number; endIdx: number; grade: string }[]>( | |
| (acc, seg) => { | |
| const len = seg.endIdx - seg.startIdx + 1; | |
| const last = acc[acc.length - 1]; | |
| if (last && len < MIN_SEGMENT_COORDS) { | |
| last.endIdx = seg.endIdx; | |
| } else { | |
| acc.push({ ...seg }); | |
| } | |
| return acc; | |
| }, | |
| [], | |
| ); | |
| } | |
| function mergeShortSegments( | |
| segments?: { startIdx: number; endIdx: number; grade: string }[] | null, | |
| ): { startIdx: number; endIdx: number; grade: string }[] { | |
| if (!segments) return []; | |
| return segments.reduce<{ startIdx: number; endIdx: number; grade: string }[]>( | |
| (acc, seg) => { | |
| const len = seg.endIdx - seg.startIdx + 1; | |
| const last = acc[acc.length - 1]; | |
| if (last && len < MIN_SEGMENT_COORDS) { | |
| last.endIdx = seg.endIdx; | |
| } else { | |
| acc.push({ ...seg }); | |
| } | |
| return acc; | |
| }, | |
| [], | |
| ); | |
| } |
| {mergeShortSegments(courseDetail.segments).map((seg, i) => { | ||
| const coords = courseCoords.slice( | ||
| seg.startIdx, | ||
| seg.endIdx + 1, | ||
| ); | ||
| if (coords.length < 2) return null; | ||
| const { color } = SEGMENT_COLORS[seg.grade] ?? SEGMENT_COLORS.FLAT; | ||
| const { color } = | ||
| SEGMENT_COLORS[seg.grade] ?? SEGMENT_COLORS.FLAT; |
There was a problem hiding this comment.
courseDetail이 로딩 중이거나 없을 때 런타임 에러가 발생하지 않도록 courseDetail?.segments와 같이 옵셔널 체이닝을 사용하는 것이 안전합니다.
또한, TrackingScreen 컴포넌트는 타이머(elapsedSeconds)로 인해 매초 리렌더링이 발생합니다. staticMapOverlays가 recordedCoords 등에 의존하여 자주 재평가되므로, mergeShortSegments 연산이 불필요하게 반복 실행될 수 있습니다. 성능 최적화를 위해 컴포넌트 상단에서 useMemo를 사용하여 병합된 세그먼트를 메모이제이션하는 것을 권장합니다.
const mergedSegments = useMemo(() => {
return mergeShortSegments(courseDetail?.segments);
}, [courseDetail?.segments]);| {mergeShortSegments(courseDetail.segments).map((seg, i) => { | |
| const coords = courseCoords.slice( | |
| seg.startIdx, | |
| seg.endIdx + 1, | |
| ); | |
| if (coords.length < 2) return null; | |
| const { color } = SEGMENT_COLORS[seg.grade] ?? SEGMENT_COLORS.FLAT; | |
| const { color } = | |
| SEGMENT_COLORS[seg.grade] ?? SEGMENT_COLORS.FLAT; | |
| {mergeShortSegments(courseDetail?.segments).map((seg, i) => { | |
| const coords = courseCoords.slice( | |
| seg.startIdx, | |
| seg.endIdx + 1, | |
| ); | |
| if (coords.length < 2) return null; | |
| const { color } = | |
| SEGMENT_COLORS[seg.grade] ?? SEGMENT_COLORS.FLAT; |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary
MIN_SEGMENT_COORDS(8)미만인 짧은 세그먼트를 앞 세그먼트에 흡수하는mergeShortSegments함수 추가courseDetail.segments렌더 시 병합된 세그먼트 사용Test plan
🤖 Generated with Claude Code