diff --git a/src/app/(landing)/class/[slug]/page.tsx b/src/app/(landing)/class/[slug]/page.tsx index 6da5ad808..ab40ef256 100644 --- a/src/app/(landing)/class/[slug]/page.tsx +++ b/src/app/(landing)/class/[slug]/page.tsx @@ -69,11 +69,11 @@ export default function ClassDetailPage({ const viewerStatusLabel = getCourseViewerStatusLabel(courseDetail); const ctaLabel = (() => { if (createCourseFreeEnrollment.isPending) return '등록 중...'; + if (canFreeEnrollFromDetail) return '무료 코스 시작하기'; if (isCoursePaidEnrolled(courseDetail)) return '학습하러 가기'; if (isCourseFreeEnrolled(courseDetail)) return '학습 계속하기'; - if (canFreeEnrollFromDetail) return '무료 코스 시작하기'; if (hasFullAccessFromDetail) return '관리자 권한으로 보기'; - return '무료 코스 시작하기'; + return undefined; })(); const { data: myGiftEmail } = useGetMyGiftEmail({ enabled: isAuthenticated && !!courseDetail?.isPaidEnrolled, @@ -144,8 +144,8 @@ export default function ClassDetailPage({ showToast('무료 코스 등록이 완료되었어요.'); } catch { showToast('무료 코스 등록 중 오류가 발생했어요.', 'error'); - return; } + return; } router.push(learningHomeHref); } diff --git a/src/components/pages/class/class-detail-sidebar.tsx b/src/components/pages/class/class-detail-sidebar.tsx index a0fb9aa3f..72ff60abf 100644 --- a/src/components/pages/class/class-detail-sidebar.tsx +++ b/src/components/pages/class/class-detail-sidebar.tsx @@ -14,7 +14,7 @@ const LoginModal = dynamic( interface ClassDetailSidebarProps { courseDetail: CourseDetailResponse | undefined; isAuthenticated: boolean; - ctaLabel: string; + ctaLabel: string | undefined; viewerStatusLabel: string | undefined; isEnrolling: boolean; onShare: () => void; @@ -135,27 +135,29 @@ export function ClassDetailSidebar({ > 공유하기 - {isAuthenticated ? ( - - ) : ( - - 무료 코스 시작하기 + {ctaLabel} - } - /> - )} + ) + : courseDetail?.canFreeEnroll === true && ( + + 무료 코스 시작하기 + + } + /> + )} {isAuthenticated && courseDetail?.isPaidEnrolled && ( diff --git a/src/components/pages/class/course-viewer-status.test.ts b/src/components/pages/class/course-viewer-status.test.ts index f69413753..cfe94f545 100644 --- a/src/components/pages/class/course-viewer-status.test.ts +++ b/src/components/pages/class/course-viewer-status.test.ts @@ -48,6 +48,18 @@ describe('course viewer status helpers', () => { ); }); + it('shows free enrollment CTA solely from canFreeEnroll', () => { + const course = { + ...baseCourse, + viewerStatus: 'ADMIN', + hasFullAccess: true, + canFreeEnroll: true, + isFreeEnrolled: true, + } satisfies CourseDetailResponse; + + expect(canShowCourseFreeEnrollCta(course)).toBe(true); + }); + it('ADMIN free enrollment keeps ADMIN status and becomes a real free learner', () => { const course = { ...baseCourse, @@ -58,7 +70,6 @@ describe('course viewer status helpers', () => { } satisfies CourseDetailResponse; expect(isCourseFreeEnrolled(course)).toBe(true); - expect(canShowCourseFreeEnrollCta(course)).toBe(false); expect(getCourseViewerStatusLabel(course)).toBe('무료수강중'); }); diff --git a/src/components/pages/class/course-viewer-status.ts b/src/components/pages/class/course-viewer-status.ts index 60f32fd6e..bbe74b08d 100644 --- a/src/components/pages/class/course-viewer-status.ts +++ b/src/components/pages/class/course-viewer-status.ts @@ -5,33 +5,21 @@ export function isAdminViewer(course?: CourseDetailResponse): boolean { } export function isCourseFreeEnrolled(course?: CourseDetailResponse): boolean { - return ( - course?.isFreeEnrolled === true || course?.viewerStatus === 'FREE_ENROLLED' - ); + return course?.isFreeEnrolled === true; } export function isCoursePaidEnrolled(course?: CourseDetailResponse): boolean { - return course?.isPaidEnrolled === true || course?.viewerStatus === 'PAID'; + return course?.isPaidEnrolled === true; } export function hasCourseFullAccess(course?: CourseDetailResponse): boolean { - return ( - course?.hasFullAccess === true || - isAdminViewer(course) || - isCoursePaidEnrolled(course) - ); + return course?.hasFullAccess === true; } export function canShowCourseFreeEnrollCta( course?: CourseDetailResponse, ): boolean { - if (course?.canFreeEnroll !== true) return false; - if (isCourseFreeEnrolled(course) || isCoursePaidEnrolled(course)) { - return false; - } - return ( - course.viewerStatus === 'LOGIN_ONLY' || course.viewerStatus === 'ADMIN' - ); + return course?.canFreeEnroll === true; } export function getCourseViewerStatusLabel(