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(