Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 45 additions & 31 deletions src/pages/map/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,45 @@ import Image from 'next/image';
import { cn } from '@/shared/lib';
import { ControlBar } from '@/shared/components';
import { BottomNav } from '@/shared/components/tab/BottomNav';
import {
purposes,
stays,
moves,
} from '@/shared/constants/course/courseOptions';
import { useCourseSelection } from '@/shared/hooks/useCourseSelection';
import CourseSelectSection from '@/pages/map/components/CourseSelectSection';
import CourseInputSection from '@/pages/map/components/CourseInputSection';
import CourseSelectGroup from '@/shared/components/map/components/CourseSelectGroup';
import CourseInputSection from '@/shared/components/map/components/CourseInputSection';
import { useRouter } from 'next/router';
import { useRecommendCourse } from '@/shared/api/course/queries/useRecommendCourse';
import { useState } from 'react';

export default function CourseSettingPage() {
const router = useRouter();
const { purpose, setPurpose, stay, setStay, move, setMove } =
useCourseSelection();
const { mutate, isPending } = useRecommendCourse();

const { purpose, setPurpose, stay, setStay, move, setMove } = useCourseSelection();
const [mustVisitPlace, setMustVisitPlace] = useState('');

const canProceed = Boolean(purpose && stay && move);

const handleNext = () => {
if (canProceed) router.push('/map/result');
if (!canProceed) return;

mutate(
{
travelPurpose: purpose!,
stayDuration: stay!,
transportation: move!,
userLatitude: 37.4985,
userLongitude: 126.7822,
Comment on lines +29 to +30
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

하드코딩된 좌표 사용

사용자 위치 대신 고정된 좌표 (37.4985, 126.7822)를 전송하고 있어, 모든 사용자에게 동일한 기준점에서 코스가 추천됩니다. 이는 사용자의 실제 위치 기반 추천이라는 기능 의도와 맞지 않습니다.

다음 중 하나를 선택하세요:

방안 1 (권장): Geolocation API로 실제 사용자 위치 사용

const [userLocation, setUserLocation] = useState<{lat: number; lng: number} | null>(null);

useEffect(() => {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        setUserLocation({
          lat: position.coords.latitude,
          lng: position.coords.longitude,
        });
      },
      (error) => {
        console.error('위치 정보 조회 실패:', error);
        // 폴백 또는 에러 처리
      }
    );
  }
}, []);

// mutate 호출 시
userLatitude: userLocation?.lat ?? 37.4985,
userLongitude: userLocation?.lng ?? 126.7822,

방안 2: 하드코딩된 값이 의도된 것이라면 상수로 분리하고 주석 추가

// 임시: 개발/테스트용 기본 위치 (서울 인근)
const DEFAULT_LAT = 37.4985;
const DEFAULT_LNG = 126.7822;
🤖 Prompt for AI Agents
In src/pages/map/index.tsx around lines 29-30 the userLatitude/userLongitude are
hardcoded to 37.4985/126.7822; replace this by obtaining the real user position
via the Geolocation API (add a state for userLocation, call
navigator.geolocation.getCurrentPosition in a useEffect, set the state, and pass
userLocation?.lat / userLocation?.lng with a fallback to defaults when calling
mutate), and if you instead intend to keep hardcoded values for testing, extract
them to named constants (e.g., DEFAULT_LAT/DEFAULT_LNG) with a comment stating
they are temporary dev/test defaults and ensure permission/fallback errors are
handled.

mustVisitPlace: mustVisitPlace || "",
},
{
onSuccess: (res) => {
if (res.isSuccess) {
router.push(`/map/result?sessionId=${res.result.sessionId}`);
}
},
onError: (err) => {
console.error('AI 코스 추천 실패:', err);
},
},
Comment on lines +34 to +42
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

에러 및 실패 응답 처리 부족

현재 에러 처리에 두 가지 문제가 있습니다:

  1. 네트워크 에러 시 사용자 피드백 없음: onError에서 console.error만 하고 사용자에게는 아무 알림이 없어 버튼이 동작하지 않는 것처럼 보입니다.
  2. res.isSuccess === false 케이스 미처리: 서버가 200 응답을 주지만 isSuccess: false인 경우 아무 동작도 하지 않아 사용자가 무한 대기하게 됩니다.

다음과 같이 수정하세요:

  onSuccess: (res) => {
    if (res.isSuccess) {
      router.push(`/map/result?sessionId=${res.result.sessionId}`);
+   } else {
+     alert('코스 추천에 실패했습니다. 다시 시도해 주세요.');
    }
  },
  onError: (err) => {
    console.error('AI 코스 추천 실패:', err);
+   alert('네트워크 오류가 발생했습니다. 다시 시도해 주세요.');
  },

더 나은 UX를 위해 toast 라이브러리나 모달을 사용하는 것을 권장합니다.

📝 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
onSuccess: (res) => {
if (res.isSuccess) {
router.push(`/map/result?sessionId=${res.result.sessionId}`);
}
},
onError: (err) => {
console.error('AI 코스 추천 실패:', err);
},
},
onSuccess: (res) => {
if (res.isSuccess) {
router.push(`/map/result?sessionId=${res.result.sessionId}`);
} else {
alert('코스 추천에 실패했습니다. 다시 시도해 주세요.');
}
},
onError: (err) => {
console.error('AI 코스 추천 실패:', err);
alert('네트워크 오류가 발생했습니다. 다시 시도해 주세요.');
},
},
🤖 Prompt for AI Agents
In src/pages/map/index.tsx around lines 34 to 42, the response/error handling is
incomplete: add user-facing feedback and state cleanup for both network errors
and successful HTTP responses where res.isSuccess === false. Update onError to
stop any loading state, log the error, and show a toast/modal with a friendly
message and optional retry; update onSuccess to handle the false case by
clearing loading, logging the server error details, and showing a toast/modal
(and only navigate when res.isSuccess is true). Ensure any disabled buttons are
re-enabled and include enough context in logs for debugging.

);
};

return (
Expand Down Expand Up @@ -55,27 +75,21 @@ export default function CourseSettingPage() {
</p>
</section>

<div className='flex flex-col gap-[1.9rem] mb-[8rem]'>
<CourseSelectSection
title='여행 목적을 선택해 주세요'
options={purposes}
selected={purpose}
onSelect={setPurpose}
/>
<CourseSelectSection
title='체류 시간을 선택해 주세요'
options={stays}
selected={stay}
onSelect={setStay}
/>
<CourseSelectSection
title='이동 방식을 선택해 주세요'
options={moves}
selected={move}
onSelect={setMove}
/>
<CourseInputSection onNext={handleNext} />
</div>
<CourseSelectGroup
purpose={purpose}
stay={stay}
move={move}
setPurpose={setPurpose}
setStay={setStay}
setMove={setMove}
/>

<CourseInputSection
value={mustVisitPlace}
onChange={setMustVisitPlace}
onNext={handleNext}
isLoading={isPending}
/>
</main>

<BottomNav />
Expand Down
15 changes: 13 additions & 2 deletions src/pages/map/result/Map.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { Header } from '@/shared/components';
import { useRouter } from 'next/router';
import FullMap from '@/pages/map/result/components/FullMap';
import FullMap from '@/shared/components/map/result/components/FullMap';

const MapPage = () => {
const router = useRouter();

const sessionId = Array.isArray(router.query.sessionId)
? router.query.sessionId[0]
: router.query.sessionId;

return (
<main
className="w-full h-[100vh] bg-mint-300 overflow-hidden"
Expand All @@ -15,7 +19,14 @@ const MapPage = () => {
title="코스 추천"
onClick={() => router.push('/map/result?from=map')}
/>
<FullMap />

{sessionId ? (
<FullMap sessionId={sessionId} />
) : (
<div className="flex h-full items-center justify-center text-gray-600 text-title-sm bg-gray-200">
코스 정보가 없습니다
</div>
)}
</main>
);
};
Expand Down
19 changes: 0 additions & 19 deletions src/pages/map/result/components/FullMap.tsx

This file was deleted.

31 changes: 0 additions & 31 deletions src/pages/map/result/components/ResultList.tsx

This file was deleted.

32 changes: 0 additions & 32 deletions src/pages/map/result/components/ResultMap.tsx

This file was deleted.

31 changes: 21 additions & 10 deletions src/pages/map/result/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,20 @@ import { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
import Image from 'next/image';
import { cn } from '@/shared/lib';
import { ControlBar } from '@/shared/components';
import { BottomNav } from '@/shared/components';
import { PopupSet } from '@/shared/components';
import TagGroup from '@/pages/map/result/components/TagGroup';
import ResultList from '@/pages/map/result/components/ResultList';
import ResultMap from '@/pages/map/result/components/ResultMap';
import { ControlBar, BottomNav, PopupSet } from '@/shared/components';
import TagGroup from '@/shared/components/map/result/components/TagGroup';
import ResultList from '@/shared/components/map/result/components/ResultList';
import ResultMap from '@/shared/components/map/result/components/ResultMap';
import { useCourseSession } from '@/shared/api/course/queries/useCourseSession';

export default function CourseResultPage() {
const router = useRouter();
const [showPopup, setShowPopup] = useState(false);
const [viewMode, setViewMode] = useState<'list' | 'map'>('list');

const sessionId = router.query.sessionId as string | undefined;
const { data } = useCourseSession(sessionId ?? '');

useEffect(() => {
if (typeof window === 'undefined') return;

Expand All @@ -25,13 +27,17 @@ export default function CourseResultPage() {
}, []);

useEffect(() => {
if (router.query.from === 'map') {
setViewMode('map');
}
if (router.query.from === 'map') setViewMode('map');
}, [router.query.from]);

const handlePopupClose = () => setShowPopup(false);

const tags = [
data?.travelPurpose || null,
data?.stayDuration || null,
data?.transportation || null,
].filter(Boolean) as string[];

return (
<div className='relative bg-white flex flex-col min-h-screen pb-[12rem] no-scrollbar'>
<ControlBar className='fixed top-[1rem] left-0 right-0 z-50 px-[2rem]' />
Expand All @@ -50,6 +56,7 @@ export default function CourseResultPage() {

<TagGroup
viewMode={viewMode}
tags={tags}
onToggleView={() =>
setViewMode((prev) => (prev === 'list' ? 'map' : 'list'))
}
Expand All @@ -63,7 +70,11 @@ export default function CourseResultPage() {
: 'h-[43.6rem] overflow-hidden',
)}
>
{viewMode === 'list' ? <ResultList /> : <ResultMap />}
{viewMode === 'list' ? (
<ResultList places={data?.places ?? []} />
) : (
<ResultMap sessionId={sessionId ?? ''} places={data?.places ?? []} />
)}
</section>
</div>
</main>
Expand Down
14 changes: 14 additions & 0 deletions src/shared/api/course/api/getCourseSession.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { apiAuth } from "@/shared/api/instance";
import type { CourseSessionResponse } from "@/shared/api/course/types/courseSession";

export const getCourseSession = async (sessionId: string) => {
const { data } = await apiAuth.get<CourseSessionResponse>(
`/api/courses/session/${sessionId}`,
);

if (!data.isSuccess) {
throw new Error(data.message || 'Failed to fetch course session');
}

return data.result;
};
Comment on lines +1 to +14
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

파일명 오타를 수정하세요.

파일명이 getCourseSettion.ts로 되어 있는데 "Session"이 올바른 철자입니다. 타입 파일(courseSettion.ts)도 동일한 오타가 있다면 함께 수정이 필요합니다.

파일명 변경:

  • getCourseSettion.tsgetCourseSession.ts
  • courseSettion.tscourseSession.ts (타입 파일도 확인 필요)

모든 import 경로도 업데이트해야 합니다.

🤖 Prompt for AI Agents
In src/shared/api/course/api/getCourseSettion.ts lines 1-9: the filename and
referenced type file contain a spelling error ("Settion" → "Session"); rename
the file to getCourseSession.ts and rename the type file courseSettion.ts to
courseSession.ts (if present), then update all import paths and any references
throughout the repo to use the corrected filenames and exported type names
(ensure the import path "@/shared/api/course/types/courseSession" and any named
exports are adjusted accordingly).

Comment on lines +4 to +14
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

이전 리뷰 피드백이 잘 반영되었습니다!

API 응답 검증 로직(data.success 체크 및 에러 throw)이 올바르게 추가되었습니다. 다만 추가로 고려할 수 있는 개선 사항이 있습니다.

Minor: data.data null 체크 추가 고려

data.successtrue이더라도 data.data가 예상치 못하게 null 또는 undefined일 수 있는 엣지 케이스에 대한 방어 코드가 없습니다. 백엔드 계약상 이런 상황은 발생하지 않아야 하지만, 방어적 프로그래밍 관점에서 체크를 추가할 수 있습니다.

  if (!data.success) {
    throw new Error(data.message || "Failed to fetch course session");
  }
+
+  if (!data.data) {
+    throw new Error("Course session data is missing");
+  }

  return data.data;

Optional: 타입 안전성 개선

현재 CourseSessionResponse 타입은 success 값과 관계없이 data 필드가 항상 존재한다고 정의되어 있습니다. Discriminated union을 사용하면 타입 수준에서 더 안전하게 표현할 수 있습니다.

src/shared/api/course/types/courseSession.ts에서 타입을 다음과 같이 개선할 수 있습니다:

type CourseSessionResponseSuccess = {
  success: true;
  code: string;
  message: string;
  data: {
    memberId: number;
    places: CoursePlace[];
    createdAt: string;
    travelPurpose: string;
    stayDuration: string;
    transportation: string;
    mustVisitPlace?: string;
  };
  timestamp: string;
};

type CourseSessionResponseFailure = {
  success: false;
  code: string;
  message: string;
  data?: never;
  timestamp: string;
};

export type CourseSessionResponse = 
  | CourseSessionResponseSuccess 
  | CourseSessionResponseFailure;

이렇게 하면 TypeScript가 data.success === true 체크 후 data.data의 존재를 보장합니다.

🤖 Prompt for AI Agents
In src/shared/api/course/api/getCourseSession.ts around lines 4 to 14, add a
defensive null/undefined check for data.data after the existing data.success
check and throw a clear error if data.success is true but data.data is missing
so callers never receive undefined; additionally, update
src/shared/api/course/types/courseSession.ts to use a discriminated union
(success: true/false) so TypeScript can guarantee data exists when success is
true, and adjust the function signature/types accordingly to satisfy the
compiler.

13 changes: 13 additions & 0 deletions src/shared/api/course/api/postRecommendCourse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { apiWithToken } from '@/shared/api/instance';
import type {
RecommendCourseRequest,
RecommendCourseResponse,
} from '@/shared/api/course/types/recommendTypes';

export const postRecommendCourse = async (body: RecommendCourseRequest) => {
const { data } = await apiWithToken.post<RecommendCourseResponse>(
'/api/courses/recommend',
body,
);
return data;
};
15 changes: 15 additions & 0 deletions src/shared/api/course/queries/useCourseSession.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { useQuery } from '@tanstack/react-query';
import { getCourseSession } from '@/shared/api/course/api/getCourseSession';
import type { CourseSessionResponse } from '@/shared/api/course/types/courseSession';

export const useCourseSession = (sessionId: string) => {
return useQuery<CourseSessionResponse['result']>({
queryKey: ['courseSession', sessionId],
queryFn: () => getCourseSession(sessionId),
enabled: Boolean(sessionId && sessionId.trim()),
staleTime: 1000 * 60 * 5,
refetchOnWindowFocus: true,
refetchOnReconnect: true,
refetchInterval: false,
});
};
14 changes: 14 additions & 0 deletions src/shared/api/course/queries/useRecommendCourse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { useMutation } from '@tanstack/react-query';
import {
postRecommendCourse,
} from '@/shared/api/course/api/postRecommendCourse';
import type {
RecommendCourseRequest,
RecommendCourseResponse,
} from '@/shared/api/course/types/recommendTypes';

export const useRecommendCourse = () => {
return useMutation<RecommendCourseResponse, Error, RecommendCourseRequest>({
mutationFn: (body) => postRecommendCourse(body),
});
};
24 changes: 24 additions & 0 deletions src/shared/api/course/types/courseSession.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
export interface CoursePlace {
placeId: number;
name: string;
address: string;
latitude: number;
longitude: number;
description: string;
placeImg: string;
}
Comment on lines +1 to +9
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

CoursePlace 인터페이스 중복 및 타입 불일치를 해결하세요.

CoursePlace 인터페이스가 src/shared/api/course/types/recommendTypes.ts에도 정의되어 있지만, nullability가 다릅니다:

  • 현재 파일: placeId: number, placeImg: string
  • recommendTypes.ts: placeId: number | null, placeImg: string | null

서버가 null을 반환할 경우 런타임 에러가 발생할 수 있습니다. 두 인터페이스를 하나로 통합하고 올바른 nullability를 적용하세요.

다음 스크립트로 실제 API 응답을 확인하여 null 가능 여부를 검증하세요:


🏁 Script executed:

#!/bin/bash
# Description: Check API response structure in related files

# Find API call implementations
rg -n -A 10 "getCourseSettion|getCourseSession" --type=ts --type=tsx

# Check for null handling in related hooks
rg -n "CoursePlace\[" --type=ts --type=tsx

Length of output: 55


🏁 Script executed:

#!/bin/bash
# Search for CoursePlace interface definitions across codebase
rg -n "interface CoursePlace" --type=ts

# Search for CoursePlace type definitions
rg -n "type CoursePlace" --type=ts

# Check recommendTypes.ts for CoursePlace definition
rg -n -A 10 "CoursePlace" src/shared/api/course/types/recommendTypes.ts

# Find files that import CoursePlace
rg -n "import.*CoursePlace" --type=ts

# Check the actual file mentioned in review
cat src/shared/api/course/types/courseSettion.ts

Length of output: 1394


CoursePlace 인터페이스의 중복 정의 및 타입 불일치 해결 필요

CoursePlace 인터페이스가 두 개 파일에 서로 다른 정의로 존재합니다:

  • src/shared/api/course/types/courseSettion.ts (현재 파일): placeId: number, placeImg: string
  • src/shared/api/course/types/recommendTypes.ts: placeId: number | null, placeImg: string | null

현재 courseSettion.ts의 비-nullable 버전을 세 파일(useKakaoCourseMap.ts, ResultList.tsx, ResultMap.tsx)이 import하고 있으며, recommendTypes.ts의 nullable 버전은 API 응답 타입에서 사용 중입니다.

API가 null 값을 반환할 경우 타입 계약 위반으로 인한 런타임 에러가 발생할 수 있습니다. 올바른 nullability를 결정한 후 단일 정의로 통합하고, 모든 import를 해당 파일로 통일하세요.

🤖 Prompt for AI Agents
In src/shared/api/course/types/courseSettion.ts lines 1-9: the CoursePlace
interface conflicts with the nullable version in
src/shared/api/course/types/recommendTypes.ts and can cause runtime errors when
API returns nulls; choose the API-backed nullable shape (placeId: number | null,
placeImg: string | null), consolidate the single CoursePlace definition into one
canonical file (prefer recommendTypes.ts), remove the duplicate file, and update
all imports in useKakaoCourseMap.ts, ResultList.tsx, and ResultMap.tsx to import
CoursePlace from the unified file so all code uses the same nullable types.


export interface CourseSessionResponse {
code: string;
message: string;
isSuccess: boolean;
result: {
memberId: number;
createdAt: string;
travelPurpose: string;
stayDuration: string;
transportation: string;
mustVisitPlace?: string;
places: CoursePlace[];
};
}
Comment on lines +1 to +25
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

파일명 오타를 수정하세요.

파일명이 courseSettion.ts로 되어 있는데, 올바른 철자는 courseSession.ts입니다. 이 오타는 모든 import 문에 영향을 미칩니다.

다음 스크립트를 실행하여 이 파일을 import하는 모든 위치를 확인하세요:


🏁 Script executed:

#!/bin/bash
# Description: Find all imports of the misspelled filename

# Search for imports of courseSettion
rg -n "courseSettion" --type=ts --type=tsx

Length of output: 27


🏁 Script executed:

#!/bin/bash
# Description: Search for misspelled filename and verify file existence

echo "=== Searching for all references to 'courseSettion' ==="
rg -n "courseSettion"

echo ""
echo "=== Searching for references to 'courseSession' ==="
rg -n "courseSession"

echo ""
echo "=== Finding TypeScript files with 'course' in the name ==="
fd -e ts -e tsx "course" --type f

Length of output: 1463


🏁 Script executed:

#!/bin/bash
# Description: Check the actual file at the mentioned path

echo "=== Checking if file exists at src/shared/api/course/types/courseSettion.ts ==="
if [ -f "src/shared/api/course/types/courseSettion.ts" ]; then
    echo "File EXISTS at: src/shared/api/course/types/courseSettion.ts"
    echo "=== First 10 lines of the file ==="
    head -10 "src/shared/api/course/types/courseSettion.ts"
else
    echo "File NOT FOUND at: src/shared/api/course/types/courseSettion.ts"
fi

echo ""
echo "=== Checking corrected filename ==="
if [ -f "src/shared/api/course/types/courseSession.ts" ]; then
    echo "File EXISTS at: src/shared/api/course/types/courseSession.ts"
else
    echo "File NOT FOUND at: src/shared/api/course/types/courseSession.ts"
fi

echo ""
echo "=== Listing all files in course/types directory ==="
ls -la "src/shared/api/course/types/" 2>/dev/null || echo "Directory not found"

Length of output: 741


파일명 오타를 수정하세요: courseSettion.tscourseSession.ts

현재 파일명이 courseSettion.ts로 되어 있는데, 올바른 철자는 courseSession.ts입니다. 이 오타로 인해 5개 파일의 import 문과 관련 API 함수명도 함께 수정해야 합니다.

수정이 필요한 파일들:

  • src/shared/api/course/types/courseSettion.tscourseSession.ts로 파일명 변경
  • src/shared/api/course/api/getCourseSettion.tsgetCourseSession.ts로 함수명 변경
  • src/shared/hooks/course/useCourseSession.ts:3 - import 경로 수정
  • src/shared/hooks/kakaoMap/useKakaoCourseMap.ts:5 - import 경로 수정
  • src/shared/components/map/result/components/ResultMap.tsx:4 - import 경로 수정
  • src/shared/components/map/result/components/ResultList.tsx:4 - import 경로 수정
🤖 Prompt for AI Agents
In src/shared/api/course/types/courseSettion.ts lines 1-24: the file name is
misspelled as courseSettion.ts; rename the file to courseSession.ts, update the
exported type import paths and any references; also rename the related API file
src/shared/api/course/api/getCourseSettion.ts to getCourseSession.ts and update
its exported function name accordingly; then update imports in
src/shared/hooks/course/useCourseSession.ts (line 3),
src/shared/hooks/kakaoMap/useKakaoCourseMap.ts (line 5),
src/shared/components/map/result/components/ResultMap.tsx (line 4), and
src/shared/components/map/result/components/ResultList.tsx (line 4) to point to
the new courseSession.ts path and new getCourseSession export; ensure TypeScript
references/paths and any barrel/index exports are updated and run type-check to
fix any broken imports.

Loading
Loading