Skip to content

Comments

feat : 결과보기 & 환승 경로 UI 수정#41

Merged
kangdy25 merged 2 commits intomainfrom
feature/QA-midpoint-ui
Feb 18, 2026
Merged

feat : 결과보기 & 환승 경로 UI 수정#41
kangdy25 merged 2 commits intomainfrom
feature/QA-midpoint-ui

Conversation

@kim3360
Copy link
Member

@kim3360 kim3360 commented Feb 18, 2026

🚀 결과보기 & 환승 경로 UI 수정

📝 변경사항

1. 결과 페이지 레이아웃 개선

  • 헤더 영역

    • 왼쪽에 뒤로가기 버튼 추가
    • 제목을 "최종 위치 결과 Top3"로 변경
  • 결과 카드 레이아웃 변경

    • 상단: 파란색 별 아이콘 + 카테고리 텍스트
    • 하단: 두 개의 버튼
      • "주변 장소 추천"
      • "환승 경로 보기"

2. 환승 경로 모달 UI 개선

  • 환승 경로를 세로 배치로 변경
  • 호선 뱃지와 역 이름을 나란히 표시
  • 오른쪽에 세로 막대 추가

✅ 체크리스트

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

📸 스크린샷

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

💬 리뷰어 전달사항

  • 리뷰어가 특별히 확인해야 할 사항이 있다면 적어주세요.

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 최종 위치 결과 카드에 카테고리 라벨, 최종 역, 평균 이동 시간 표시 추가
    • 결과별 "주변 장소 추천" 및 "환승 경로 보기" 액션 버튼 추가
    • 뒤로 가기 네비게이션 버튼 추가
  • 스타일

    • 환승 경로 모달의 시각화를 수직 레이아웃으로 개선
    • 결과 표시 레이아웃 업그레이드로 정보 가독성 향상

@vercel
Copy link

vercel bot commented Feb 18, 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 18, 2026 9:38am

@coderabbitai
Copy link

coderabbitai bot commented Feb 18, 2026

Walkthrough

최종 위치 결과 페이지가 개선되어 평균 이동 시간 계산, 카테고리 라벨, 상세 결과 카드 UI를 추가했습니다. 주변 장소 추천 네비게이션 로직이 구현되었고, 맵 컴포넌트의 버튼이 제거되었으며, 환승 모달의 경로 표시가 수직 레이아웃으로 리팩토링되었습니다.

Changes

응집도 / 파일 요약
결과 페이지 개선
app/result/[id]/page.tsx
totalTravelTime, averageTravelTime 계산 추가. 결과 카드 UI 개선으로 카테고리 라벨, 종점역, 평균 이동 시간 표시. handleRecommendClick으로 /recommend 네비게이션 로직 구현. "주변 장소 추천"과 "환승 경로 보기" 액션 버튼 추가.
맵 컴포넌트 정리
components/map/kakaoMapLine.tsx
handleRecommendClick를 트리거하는 절대 위치 지정 버튼과 종점역 이름 레이블 제거. ZoomControl만 유지.
환승 모달 리팩토링
components/modal/transferModal.tsx
extractTransferLines를 extractRouteSteps로 교체. route.stations을 순회하여 연속된 역을 linenumber로 그룹화. UI를 2단 레이아웃에서 수직 스택 레이아웃으로 변경. 수평 전환 배지 섹션을 수직 경로 시각화로 개선.

Sequence Diagram

sequenceDiagram
    participant User
    participant ResultPage as Result Page
    participant Modal as Transfer Modal
    participant Navigation as Navigation
    
    User->>ResultPage: 결과 항목 보기
    ResultPage->>ResultPage: 평균 이동 시간 계산
    ResultPage->>User: 카테고리 라벨, 평균 시간 표시
    
    User->>ResultPage: "주변 장소 추천" 클릭
    ResultPage->>ResultPage: handleRecommendClick 실행<br/>(meetingId, midPlace, lat, lng 수집)
    ResultPage->>Navigation: /recommend로 이동
    
    User->>ResultPage: "환승 경로 보기" 클릭
    ResultPage->>Modal: 모달 열기
    Modal->>Modal: extractRouteSteps로<br/>경로 단계 추출
    Modal->>Modal: 수직 레이아웃으로<br/>경로 시각화
    Modal->>User: 환승 경로 표시<br/>(라인 배지, 역, 화살표)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25분

Possibly related PRs

Suggested reviewers

  • kangdy25
🚥 Pre-merge checks | ✅ 2 | ❌ 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 (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 변경사항의 핵심을 정확하게 반영하고 있습니다. '결과보기 & 환승 경로 UI 수정'은 결과 페이지와 환승 경로 모달의 UI 개선이라는 주요 변화를 명확하게 요약합니다.
Description check ✅ Passed PR 설명이 템플릿의 대부분 섹션을 포함하고 있으며, 변경사항을 상세히 기술하고 체크리스트를 완성했습니다. 다만 스크린샷과 리뷰어 전달사항 섹션이 비어있습니다.

✏️ 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/QA-midpoint-ui

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.

Actionable comments posted: 3

🧹 Nitpick comments (6)
app/result/[id]/page.tsx (3)

198-204: 뒤로가기 버튼에 접근성 레이블이 누락되어 있습니다.

alt 속성은 Image에만 적용되며, 버튼 자체에는 스크린리더가 인식할 수 있는 텍스트가 없습니다. aria-label을 추가해 주세요.

♻️ 접근성 개선
  <button
    onClick={() => router.back()}
    className="flex items-center justify-center"
    type="button"
+   aria-label="뒤로가기"
  >
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/result/`[id]/page.tsx around lines 198 - 204, The back button lacks an
accessible label for screen readers; update the button that calls router.back()
(the <button> wrapping the Image) to include an aria-label such as
aria-label="뒤로가기" or add hidden accessible text inside the button so screen
readers can announce it; ensure the Image alt remains for the image and the
button element itself has the aria-label (or visually-hidden text) to provide
proper accessibility.

254-284: handleRecommendClick.map() 콜백 내부에 정의되어 매 렌더마다 결과 수만큼 새 함수가 생성됩니다.

결과가 3개 정도이므로 실질적 성능 문제는 아니지만, 함수를 컴포넌트 레벨로 올리고 result를 인자로 받도록 리팩토링하면 가독성과 일관성이 향상됩니다. 또한 kakaoMapLine.tsx에 남아 있는 동일 로직과의 중복도 정리할 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/result/`[id]/page.tsx around lines 254 - 284, handleRecommendClick is
created inside the .map() callback causing repeated function creation and
duplicated logic with kakaoMapLine.tsx; move handleRecommendClick to component
scope and make it accept a result (and id) parameter, read localStorage and
fallback to meetingData there, build URLSearchParams (including meetingType and
category) and call router.push; then update the .map() to pass the current
result into the lifted handleRecommendClick to remove per-item function
allocation and share logic with kakaoMapLine.tsx.

250-253: categorycategoryText.map() 루프 내부에서 반복 계산됩니다.

meetingData는 모든 결과에 대해 동일하므로, categorycategoryText를 루프 바깥으로 이동하면 불필요한 반복 연산을 제거할 수 있습니다.

♻️ 루프 밖으로 이동

locationResults.map(...) 호출 전에 한 번만 계산:

+                    {(() => {
+                      const category = meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1];
+                      const categoryText = getCategoryText(category);
+                      return locationResults.map((result) => {
-                      locationResults.map((result) => {
-                        const category = meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1];
-                        const categoryText = getCategoryText(category);
                        // ... rest of map body
+                      });
+                    })()}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/result/`[id]/page.tsx around lines 250 - 253, The variables category and
categoryText are being recomputed for every item inside the locationResults.map
loop; compute them once before calling locationResults.map by extracting the
last purpose from meetingData (e.g., const category =
meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1]) and then
call getCategoryText(category) once to produce categoryText, then use those
precomputed values inside the map callback so locationResults.map only processes
per-item logic.
components/modal/transferModal.tsx (2)

208-242: 좌측 호선 뱃지 열과 우측 역 이름 열의 수직 정렬이 맞지 않을 수 있습니다.

좌측 열은 각 스텝마다 뱃지(~24px) + 화살표(12px) + gap을 포함하므로 스텝당 높이가 우측 열의 텍스트(~18px) + gap과 다릅니다. 경로 스텝이 늘어날수록 양쪽 열 사이의 위치 불일치가 커집니다.

각 스텝을 하나의 행(flex-row)으로 묶어 뱃지와 역 이름을 같은 줄에 배치하면 정렬 문제를 근본적으로 해결할 수 있습니다.

♻️ 행 기반 레이아웃 제안
-                  <div className="relative flex gap-4 p-5">
-                    <div className="flex flex-col gap-[10px] items-center">
-                      {routeSteps.map((step, idx) => (
-                        <div key={idx} className="flex flex-col items-center gap-[10px]">
-                          <div
-                            className={`flex min-w-[60px] items-center justify-center gap-1 rounded-[5px] px-[7px] py-[2px] text-[13px] font-normal leading-[1.385] tracking-[0.252px] text-white ${getLineBadgeStyle(
-                              step.linenumber
-                            )}`}
-                          >
-                           <Image src='/icon/train.svg' alt='train' width={12} height={12} />    
-                            <span>{step.linenumber}</span>
-                          </div>
-                        
-                          <div className="flex items-center justify-center">
-                            <Image src='/icon/down.svg' alt='arrow-down' width={12} height={12} />
-                          </div>
-                        </div>
-                      ))}
-                      
-                      <div className="bg-gray-8 flex min-w-[60px] items-center justify-center rounded-[5px] px-[7px] py-[2px] text-[13px] font-normal leading-[1.385] tracking-[0.252px] text-white">
-                        하차
-                      </div>
-                    </div>
-
-                    
-                    <div className="flex flex-col gap-[30px] text-gray-8 text-[13px] font-normal leading-[1.385] tracking-[0.252px]">
-                      {routeSteps.map((step, idx) => (
-                        <span key={idx}>{step.station}역</span>
-                      ))}
-                     
-                      <span>{endStation || routeSteps[routeSteps.length - 1]?.station}역</span>
-                    </div>
-                  </div>
+                  <div className="flex flex-col gap-[10px] p-5">
+                    {routeSteps.map((step, idx) => (
+                      <div key={idx} className="flex flex-col gap-[10px]">
+                        <div className="flex items-center gap-3">
+                          <div
+                            className={`flex min-w-[60px] items-center justify-center gap-1 rounded-[5px] px-[7px] py-[2px] text-[13px] font-normal leading-[1.385] tracking-[0.252px] text-white ${getLineBadgeStyle(step.linenumber)}`}
+                          >
+                            <Image src='/icon/train.svg' alt='train' width={12} height={12} />
+                            <span>{step.linenumber}</span>
+                          </div>
+                          <span className="text-gray-8 text-[13px]">{step.station}역</span>
+                        </div>
+                        <div className="flex justify-center w-[60px]">
+                          <Image src='/icon/down.svg' alt='arrow-down' width={12} height={12} />
+                        </div>
+                      </div>
+                    ))}
+                    <div className="flex items-center gap-3">
+                      <div className="bg-gray-8 flex min-w-[60px] items-center justify-center rounded-[5px] px-[7px] py-[2px] text-[13px] font-normal leading-[1.385] tracking-[0.252px] text-white">
+                        하차
+                      </div>
+                      <span className="text-gray-8 text-[13px]">{endStation || routeSteps[routeSteps.length - 1]?.station}역</span>
+                    </div>
+                  </div>

46-117: getLineBadgeStylelib/color.ts의 공유 유틸리티로 추출하세요.

getLineBadgeStyle 함수가 app/result/[id]/page.tsxgetLineColor 함수와 완전히 동일합니다. 호선별 색상 매핑 로직이 두 파일에 중복되어 있어 변경 시 양쪽을 모두 수정해야 하는 유지보수 부담이 발생합니다. lib/color.ts에 이 로직을 추출하여 한 곳에서만 관리하도록 개선하는 것을 권장합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/modal/transferModal.tsx` around lines 46 - 117, The two identical
color-mapping functions (getLineBadgeStyle in components/modal/transferModal.tsx
and getLineColor in app/result/[id]/page.tsx) should be consolidated into a
single shared utility: create a new exported function (e.g., getLineColor or
getLineBadgeStyle) in lib/color.ts that contains the full mapping logic, then
replace the local implementations by importing and calling that shared function
from transferModal.tsx and app/result/[id]/page.tsx; ensure you export the
function from lib/color.ts and update all references/imports to remove the
duplicated code.
components/map/kakaoMapLine.tsx (1)

53-53: handleRecommendClick, router, meetingId, purposes는 더 이상 사용되지 않는 코드입니다.

handleRecommendClick 함수가 컴포넌트의 JSX 어디서도 호출되지 않으므로 사용 불가능한 코드입니다. 이와 관련된 useRouter 호출(Line 53), meetingId/purposes props도 이 함수 내부에서만 사용되므로 함수 제거 시 불필요해집니다. 부모 컴포넌트에서 여전히 이 props를 전달하고 있으므로, 인터페이스와 함수 매개변수에서 제거하는 것이 좋습니다.

♻️ 미사용 코드 제거 제안
-import { useRouter } from 'next/navigation';
 import ZoomControl from './zoomControl';
 interface KakaoMapLineProps {
   className?: string;
   endStation?: EndStation;
   userRoutes?: UserRoute[];
-  meetingId?: string;
-  purposes?: string[];
 }
 export default function KakaoMapLine({
   className,
   endStation,
   userRoutes = [],
-  meetingId,
-  purposes = [],
 }: KakaoMapLineProps) {
-  const router = useRouter();
   const [map, setMap] = useState<kakao.maps.Map | null>(null);

Lines 78-110 (handleRecommendClick 함수 전체)도 삭제 가능합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/map/kakaoMapLine.tsx` at line 53, Remove the unused recommendation
click handler and its related props and imports: delete the entire
handleRecommendClick function (lines ~78-110), remove the useRouter() call and
the router identifier, and drop meetingId and purposes from the component
props/interface and any parent-prop references; ensure any TypeScript types or
prop destructuring in the kakaoMapLine component are updated accordingly so
there are no leftover references to handleRecommendClick, router, meetingId, or
purposes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/result/`[id]/page.tsx:
- Around line 111-115: getCategoryText currently always appends "이" and ignores
Korean particle rules; update getCategoryText to detect whether the last hangul
syllable of category has a jongseong (final consonant) and choose "이" when there
is a jongseong or "가" when there is none, then return `${category}${particle} 많은
장소`; preserve the undefined case returning '밍글링 추천 1위' and implement the
detection using Unicode Hangul syllable arithmetic ((char.codePointAt - 0xAC00)
% 28) on the final character in the string.
- Line 308: The span rendering text uses a nonstandard Tailwind class
"font-regular" which has no effect; update the className on the span (the JSX
element containing className="text-gray-6 text-[13px] font-regular") to use the
standard Tailwind weight class "font-normal" (or add a project-specific custom
utility if you deliberately want a different weight) so the font-weight:400 is
applied correctly.

In `@components/modal/transferModal.tsx`:
- Around line 119-157: getLineBadgeStyle in components/modal/transferModal.tsx
and getLineColor in app/result/[id]/page.tsx duplicate the same line-to-color
mapping; extract that mapping into a single exported utility (e.g., export
function getLineColor(line: string): string) placed under utils/ or constants/,
implement the 1–9 mapping there, export it, then replace both local functions by
importing this shared getLineColor and remove the duplicated implementations;
ensure you update imports in transferModal.tsx and app/result/[id]/page.tsx and
adjust any name differences (e.g., if UI expects getLineBadgeStyle, either
re-export getLineBadgeStyle from the new util or call getLineColor where used).

---

Nitpick comments:
In `@app/result/`[id]/page.tsx:
- Around line 198-204: The back button lacks an accessible label for screen
readers; update the button that calls router.back() (the <button> wrapping the
Image) to include an aria-label such as aria-label="뒤로가기" or add hidden
accessible text inside the button so screen readers can announce it; ensure the
Image alt remains for the image and the button element itself has the aria-label
(or visually-hidden text) to provide proper accessibility.
- Around line 254-284: handleRecommendClick is created inside the .map()
callback causing repeated function creation and duplicated logic with
kakaoMapLine.tsx; move handleRecommendClick to component scope and make it
accept a result (and id) parameter, read localStorage and fallback to
meetingData there, build URLSearchParams (including meetingType and category)
and call router.push; then update the .map() to pass the current result into the
lifted handleRecommendClick to remove per-item function allocation and share
logic with kakaoMapLine.tsx.
- Around line 250-253: The variables category and categoryText are being
recomputed for every item inside the locationResults.map loop; compute them once
before calling locationResults.map by extracting the last purpose from
meetingData (e.g., const category =
meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1]) and then
call getCategoryText(category) once to produce categoryText, then use those
precomputed values inside the map callback so locationResults.map only processes
per-item logic.

In `@components/map/kakaoMapLine.tsx`:
- Line 53: Remove the unused recommendation click handler and its related props
and imports: delete the entire handleRecommendClick function (lines ~78-110),
remove the useRouter() call and the router identifier, and drop meetingId and
purposes from the component props/interface and any parent-prop references;
ensure any TypeScript types or prop destructuring in the kakaoMapLine component
are updated accordingly so there are no leftover references to
handleRecommendClick, router, meetingId, or purposes.

In `@components/modal/transferModal.tsx`:
- Around line 46-117: The two identical color-mapping functions
(getLineBadgeStyle in components/modal/transferModal.tsx and getLineColor in
app/result/[id]/page.tsx) should be consolidated into a single shared utility:
create a new exported function (e.g., getLineColor or getLineBadgeStyle) in
lib/color.ts that contains the full mapping logic, then replace the local
implementations by importing and calling that shared function from
transferModal.tsx and app/result/[id]/page.tsx; ensure you export the function
from lib/color.ts and update all references/imports to remove the duplicated
code.

Comment on lines +111 to +115
// 카테고리 텍스트 생성 함수
const getCategoryText = (category: string | undefined): string => {
if (!category) return '밍글링 추천 1위';
return `${category}이 많은 장소`;
};
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

getCategoryText에서 한국어 조사 처리가 누락되었습니다.

"${category}이 많은 장소"는 카테고리가 받침으로 끝나는 경우(예: "식당이")에는 맞지만, 받침이 없는 경우(예: "카페")에는 "카페 많은 장소"가 자연스럽습니다. 조사 "이/가"를 받침 유무에 따라 분기해야 합니다.

♻️ 조사 처리 제안
  const getCategoryText = (category: string | undefined): string => {
    if (!category) return '밍글링 추천 1위';
-   return `${category}이 많은 장소`;
+   const lastChar = category.charCodeAt(category.length - 1);
+   const hasJongseong = (lastChar - 0xAC00) % 28 !== 0;
+   return `${category}${hasJongseong ? '이' : '가'} 많은 장소`;
  };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 카테고리 텍스트 생성 함수
const getCategoryText = (category: string | undefined): string => {
if (!category) return '밍글링 추천 1위';
return `${category}이 많은 장소`;
};
// 카테고리 텍스트 생성 함수
const getCategoryText = (category: string | undefined): string => {
if (!category) return '밍글링 추천 1위';
const lastChar = category.charCodeAt(category.length - 1);
const hasJongseong = (lastChar - 0xAC00) % 28 !== 0;
return `${category}${hasJongseong ? '이' : '가'} 많은 장소`;
};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/result/`[id]/page.tsx around lines 111 - 115, getCategoryText currently
always appends "이" and ignores Korean particle rules; update getCategoryText to
detect whether the last hangul syllable of category has a jongseong (final
consonant) and choose "이" when there is a jongseong or "가" when there is none,
then return `${category}${particle} 많은 장소`; preserve the undefined case
returning '밍글링 추천 1위' and implement the detection using Unicode Hangul syllable
arithmetic ((char.codePointAt - 0xAC00) % 28) on the final character in the
string.

>
{line.display}
<div className="flex flex-col items-end ">
<span className="text-gray-6 text-[13px] font-regular">
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for font-regular in the codebase
echo "=== Searching for font-regular definitions ==="
rg "font-regular" -n

echo -e "\n=== Looking for Tailwind config files ==="
fd "tailwind" -type f | head -20

echo -e "\n=== Checking if font-regular is used elsewhere ==="
rg "font-regular" --type jsx --type tsx -c

Repository: SWYP-mingling/Frontend

Length of output: 540


🏁 Script executed:

#!/bin/bash
# Find and examine tailwind config file
config_file=$(fd "tailwind.config" | head -1)
if [ -n "$config_file" ]; then
  echo "=== Tailwind Config Content ==="
  cat -n "$config_file"
fi

Repository: SWYP-mingling/Frontend

Length of output: 48


🏁 Script executed:

#!/bin/bash
# Check the specific file and surrounding context
if [ -f "app/result/\[id\]/page.tsx" ]; then
  echo "=== Checking app/result/[id]/page.tsx around line 308 ==="
  sed -n '300,320p' "app/result/\[id\]/page.tsx" | cat -n
fi

Repository: SWYP-mingling/Frontend

Length of output: 48


🏁 Script executed:

#!/bin/bash
# Read the actual page.tsx file with proper path
cat -n "app/result/[id]/page.tsx" | sed -n '300,320p'

echo -e "\n=== Look for tailwind config in common locations ==="
ls -la | grep -i tailwind
ls -la | grep -i config

Repository: SWYP-mingling/Frontend

Length of output: 1580


🏁 Script executed:

#!/bin/bash
# Check package.json for tailwind config
cat package.json | grep -A 20 -B 5 tailwind

echo -e "\n=== Check for global CSS or styles ==="
fd "\\.css" -type f | head -20

Repository: SWYP-mingling/Frontend

Length of output: 1122


🏁 Script executed:

#!/bin/bash
# Search for any font-weight or font customization
rg "font-weight|'font'|\"font\"" --type=json | head -30

Repository: SWYP-mingling/Frontend

Length of output: 48


🏁 Script executed:

#!/bin/bash
# Check postcss and next config
echo "=== postcss.config.mjs ==="
cat postcss.config.mjs

echo -e "\n=== next.config.ts ==="
cat next.config.ts

echo -e "\n=== Search for CSS files ==="
find . -name "*.css" -type f | grep -v node_modules | head -20

Repository: SWYP-mingling/Frontend

Length of output: 992


🏁 Script executed:

#!/bin/bash
# Check for globals.css and any custom font definitions
find . -name "globals.css" -o -name "global.css" -o -name "app.css" | grep -v node_modules | while read file; do
  echo "=== Found: $file ==="
  cat -n "$file"
done

Repository: SWYP-mingling/Frontend

Length of output: 2849


🏁 Script executed:

#!/bin/bash
# Search for any font customization in CSS or config files
rg "font-regular|font-normal|font-weight" --glob="*.css" --glob="*.ts" --glob="*.js" | grep -v node_modules | head -30

Repository: SWYP-mingling/Frontend

Length of output: 48


font-regular는 Tailwind CSS의 기본 유틸리티 클래스가 아닙니다.

표준 Tailwind CSS v4에서 font-weight: 400에 해당하는 클래스는 font-normal입니다. 프로젝트에는 font-regular를 커스텀 정의한 곳이 없으므로, 현재 코드에서 이 클래스가 적용되지 않습니다.

🐛 수정 제안
-  <span className="text-gray-6 text-[13px] font-regular">
+  <span className="text-gray-6 text-[13px] font-normal">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<span className="text-gray-6 text-[13px] font-regular">
<span className="text-gray-6 text-[13px] font-normal">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/result/`[id]/page.tsx at line 308, The span rendering text uses a
nonstandard Tailwind class "font-regular" which has no effect; update the
className on the span (the JSX element containing className="text-gray-6
text-[13px] font-regular") to use the standard Tailwind weight class
"font-normal" (or add a project-specific custom utility if you deliberately want
a different weight) so the font-weight:400 is applied correctly.

Comment on lines +119 to 157
// stations 배열에서 호선별 경로 추출 함수
const extractRouteSteps = (route: UserRoute) => {
const steps: Array<{ linenumber: string; station: string; isLast: boolean }> = [];

if (!route.stations || route.stations.length === 0) {
return steps;
}


let currentLine = route.stations[0]?.linenumber || '';

route.stations.forEach((station, index) => {

if (station.linenumber !== currentLine || index === route.stations.length - 1) {
if (currentLine) {
steps.push({
linenumber: currentLine,
station: station.station,
isLast: index === route.stations.length - 1,
});
}
});
currentLine = station.linenumber;
}
});


if (route.stations.length > 0) {
const lastStation = route.stations[route.stations.length - 1];
if (steps.length === 0 || steps[steps.length - 1].station !== lastStation.station) {
steps.push({
linenumber: lastStation.linenumber,
station: lastStation.station,
isLast: true,
});
}
}

return lines;
return steps;
};
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Search for UserRoute type definition
rg -n "type UserRoute|interface UserRoute" --type=ts --type=tsx

Repository: SWYP-mingling/Frontend

Length of output: 93


🏁 Script executed:

# Search for stations type/interface definitions
rg -n "stations.*:.*\[|interface.*Station|type.*Station" --type=ts --type=tsx -A 2

Repository: SWYP-mingling/Frontend

Length of output: 93


🏁 Script executed:

# Look for API endpoint or fetch calls related to transfer/stations
rg -n "transferPath|getTransfer|transfer.*route" --type=ts --type=tsx -B 2 -A 2

Repository: SWYP-mingling/Frontend

Length of output: 93


🏁 Script executed:

# Check for mock data or test files showing data structure
fd -e "test\.(ts|tsx)" -o -e "mock\.(ts|tsx)" -o -e "__mocks__" | head -20

Repository: SWYP-mingling/Frontend

Length of output: 182


🏁 Script executed:

# Look for any backend API integration or types
rg -n "api.*transfer|fetch.*transfer|axios.*transfer" --type=ts --type=tsx -B 1 -A 3

Repository: SWYP-mingling/Frontend

Length of output: 93


🏁 Script executed:

# Search for UserRoute type definition - using standard approach
rg "type UserRoute|interface UserRoute" -g "*.ts" -g "*.tsx" -A 5

Repository: SWYP-mingling/Frontend

Length of output: 740


🏁 Script executed:

# Search for stations property type definitions
rg "stations\s*:\s*" -g "*.ts" -g "*.tsx" -B 2 -A 3

Repository: SWYP-mingling/Frontend

Length of output: 1594


🏁 Script executed:

# Look for API calls and data structures in transferModal.tsx
rg "stations|transferPath|route\." components/modal/transferModal.tsx -B 2 -A 2

Repository: SWYP-mingling/Frontend

Length of output: 1792


🏁 Script executed:

# Find type definition files or models directory
fd -type f \( -name "*.ts" -o -name "*.tsx" \) | grep -E "(type|model|interface|api|schema)" | head -20

Repository: SWYP-mingling/Frontend

Length of output: 236


🏁 Script executed:

# Check the transferModal.tsx file directly for imports and data sources
head -50 components/modal/transferModal.tsx

Repository: SWYP-mingling/Frontend

Length of output: 1047


🏁 Script executed:

# Check types/api.ts for complete station type definition and API response structure
cat -n types/api.ts

Repository: SWYP-mingling/Frontend

Length of output: 4018


🏁 Script executed:

# Look for API endpoint definitions or service calls that fetch routes
rg "transferPath|getRoute|fetchRoute|stations" -g "*.ts" -g "*.tsx" -B 3 -A 3 | head -100

Repository: SWYP-mingling/Frontend

Length of output: 5274


🏁 Script executed:

# Check if there's backend API documentation or constants
fd -type f -name "*.ts" -o -name "*.tsx" | xargs grep -l "http\|api\|fetch\|axios" | grep -i "api\|constant\|config" | head -10

Repository: SWYP-mingling/Frontend

Length of output: 236


🏁 Script executed:

# Look for how the stations data is actually populated/used
rg "\.stations\s*=" -g "*.ts" -g "*.tsx" -B 2 -A 2

Repository: SWYP-mingling/Frontend

Length of output: 48


🏁 Script executed:

# Look for any comments or documentation about the backend API structure
rg "extractRouteSteps|transferPath|stations" -g "*.ts" -g "*.tsx" -B 5 -A 5 | grep -E "(comment|/\*|TODO|FIXME|NOTE|backend|api)" -i

Repository: SWYP-mingling/Frontend

Length of output: 958


🏁 Script executed:

# Check if there are any test files or examples showing the stations data structure
find . -name "*.test.*" -o -name "*.spec.*" -o -name "__mocks__" | xargs ls -la 2>/dev/null | head -20

Repository: SWYP-mingling/Frontend

Length of output: 3669


🏁 Script executed:

# Look for any API documentation or README files
find . -name "README*" -o -name "API*" -o -name "*.md" | head -10

Repository: SWYP-mingling/Frontend

Length of output: 650


🏁 Script executed:

# Check the result/[id]/page.tsx file mentioned in the original review for duplicated logic
rg "getLineBadgeStyle|getLineColor" -g "*.ts" -g "*.tsx" -B 2 -A 8

Repository: SWYP-mingling/Frontend

Length of output: 2477


🏁 Script executed:

# Get the complete getLineBadgeStyle function
rg "const getLineBadgeStyle" -A 30 components/modal/transferModal.tsx

Repository: SWYP-mingling/Frontend

Length of output: 927


🏁 Script executed:

# Get the complete getLineColor function
rg "const getLineColor" -A 30 app/result/[id]/page.tsx

Repository: SWYP-mingling/Frontend

Length of output: 883


🏁 Script executed:

# Check if there's a shared utility file for common functions
find . -path ./node_modules -prune -o -type f \( -name "*.ts" -o -name "*.tsx" \) -print | xargs grep -l "lineColor\|lineBadge\|호선" | grep -E "(util|helper|constant)" | head -10

Repository: SWYP-mingling/Frontend

Length of output: 48


getLineBadgeStylegetLineColor 함수 중복 제거 필요 — 유사 구조의 두 함수를 공유 유틸리티로 통합하세요.

components/modal/transferModal.tsxgetLineBadgeStyleapp/result/[id]/page.tsxgetLineColor가 동일한 로직(1~9 호선 색상 매핑)을 중복 구현하고 있습니다. 향후 색상 또는 호선 규칙이 변경될 경우 두 위치를 모두 수정해야 합니다. 호선별 색상을 반환하는 함수를 utils/ 또는 constants/ 디렉토리에 추출하여 재사용하도록 리팩토링하세요.

관련해서 extractRouteSteps 로직은 환승역이 양쪽 호선 배열에 모두 나타나는 데이터 구조(예: [{2호선, 신도림}, {1호선, 신도림}])를 전제로 작동하며, 이는 한국 지하철 데이터의 일반적인 형태와 일치합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/modal/transferModal.tsx` around lines 119 - 157, getLineBadgeStyle
in components/modal/transferModal.tsx and getLineColor in
app/result/[id]/page.tsx duplicate the same line-to-color mapping; extract that
mapping into a single exported utility (e.g., export function getLineColor(line:
string): string) placed under utils/ or constants/, implement the 1–9 mapping
there, export it, then replace both local functions by importing this shared
getLineColor and remove the duplicated implementations; ensure you update
imports in transferModal.tsx and app/result/[id]/page.tsx and adjust any name
differences (e.g., if UI expects getLineBadgeStyle, either re-export
getLineBadgeStyle from the new util or call getLineColor where used).

@kangdy25 kangdy25 merged commit 06f5e41 into main Feb 18, 2026
5 checks passed
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