- {professionals.slice(0, 2).map((item, index) => (
-
-
-

-

-
-
-
- {item.week}
-
-
- {item.company}
-
-
- {item.role}
-
-
-
- ))}
+
+
+

+
-
- {professionals.slice(2, 4).map((item, index) => (
-
-
-

-

-
-
-
- {item.week}
-
-
- {item.company}
-
-
- {item.role}
-
-
+
+
+ {item.week}
+
+
+ {item.company}
+
+
+ {item.role}
+
+
+
+ );
+};
+
+const mapLecturesToProfessionals = (
+ lectures?: ChallengeContent['lectures'],
+): Professional[] => {
+ if (!lectures || lectures.length === 0) {
+ return [];
+ }
+
+ // 강의 정보가 있는 경우, 강의 데이터를 우선 사용한다.
+ return lectures.map((lecture: Lecture) => ({
+ logo: lecture.companyLogo,
+ profile: lecture.mentorImage,
+ week: lecture.schedule,
+ // UI 구조상 회사명/역할 자리에 들어갈 텍스트가 필요하므로,
+ // 강의 주제를 회사명 자리, 멘토명을 역할 자리에 매핑한다.
+ company: lecture.topic || lecture.mentorName,
+ role: lecture.mentorName,
+ }));
+};
+
+export const ProfessionalsList = ({
+ lectures,
+}: {
+ lectures?: ChallengeContent['lectures'];
+}) => {
+ const professionals = mapLecturesToProfessionals(lectures);
+ const isThreeColumnLayout = professionals.length >= 5;
+
+ if (professionals.length === 0) {
+ return null;
+ }
+
+ if (isThreeColumnLayout) {
+ // 5개 이상
+ const rows: Professional[][] = [];
+ for (let i = 0; i < professionals.length; i += 3) {
+ rows.push(professionals.slice(i, i + 3));
+ }
+
+ return (
+
+ {rows.map((row, rowIndex) => (
+
+ {row.map((item, index) => (
+
+ ))}
))}
+ );
+ }
+
+ // 4개 이하
+ return (
+
+ {professionals.map((item, index) => (
+
+ ))}
);
};
diff --git a/src/domain/program/challenge/marketing-view/MarketingChallengeCalendar.tsx b/src/domain/program/challenge/marketing-view/MarketingChallengeCalendar.tsx
index 7d04154ca..47f3de24b 100644
--- a/src/domain/program/challenge/marketing-view/MarketingChallengeCalendar.tsx
+++ b/src/domain/program/challenge/marketing-view/MarketingChallengeCalendar.tsx
@@ -4,9 +4,16 @@ import Image from 'next/image';
interface Props {
challenge: ChallengeIdPrimitive;
curriculumImage?: string;
+ lectureCount?: number;
}
-const ChallengeScheduleSection = ({ challenge, curriculumImage }: Props) => {
+const DEFAULT_LECTURE_COUNT = 4;
+
+const ChallengeScheduleSection = ({
+ challenge,
+ curriculumImage,
+ lectureCount = DEFAULT_LECTURE_COUNT,
+}: Props) => {
return (
@@ -56,7 +63,9 @@ const ChallengeScheduleSection = ({ challenge, curriculumImage }: Props) => {
3
- 현직자 세미나 4회
+
+ 현직자 세미나 {lectureCount}회
+
현직자 마케터의 세미나를
diff --git a/src/domain/program/challenge/marketing-view/MarketingCurriculumSection.tsx b/src/domain/program/challenge/marketing-view/MarketingCurriculumSection.tsx
index aa74f73d9..93e571fb3 100644
--- a/src/domain/program/challenge/marketing-view/MarketingCurriculumSection.tsx
+++ b/src/domain/program/challenge/marketing-view/MarketingCurriculumSection.tsx
@@ -1,10 +1,21 @@
import SectionHeader from '@/common/header/SectionHeader';
import SectionSubHeader from '@/common/header/SectionSubHeader';
+import { ChallengeContent } from '@/types/interface';
import React from 'react';
import MainTitle from '../ui/MainTitle';
import Curriculums from './Curriculums';
-const MarketingCurriculumSection: React.FC = () => {
+interface MarketingCurriculumSectionProps {
+ content?: ChallengeContent | null;
+}
+
+const DEFAULT_LECTURE_COUNT = 4;
+
+const MarketingCurriculumSection: React.FC = ({
+ content,
+}) => {
+ const lectureCount = content?.lectures?.length ?? DEFAULT_LECTURE_COUNT;
+
return (
{
- 실무 역량 Class 4회
+ 현직자 세미나
- 4회와 함께
+ 실무 역량 Class 4회
+ 현직자 세미나{' '}
+ {lectureCount}회와 함께
8회의 미션으로 만드는
@@ -28,7 +39,10 @@ const MarketingCurriculumSection: React.FC = () => {
-
+
);
};
diff --git a/src/domain/program/challenge/marketing-view/MarketingDifferentiatorsSection.tsx b/src/domain/program/challenge/marketing-view/MarketingDifferentiatorsSection.tsx
index b65692a0e..0cd9acb3c 100644
--- a/src/domain/program/challenge/marketing-view/MarketingDifferentiatorsSection.tsx
+++ b/src/domain/program/challenge/marketing-view/MarketingDifferentiatorsSection.tsx
@@ -1,3 +1,4 @@
+import { ChallengeContent } from '@/types/interface';
import { ReactNode } from 'react';
import MainTitle from '../ui/MainTitle';
import {
@@ -6,45 +7,6 @@ import {
ProfessionalsList,
} from './Differentiators';
-const differentiators = [
- {
- title: '마케팅 실무 역량 Class',
- description: (
- <>
- 신입 마케터가 가장 막히는 실무 툴,
단 3회
- 수업으로 한 번에 끝냅니다.
- >
- ),
- visualExplanation:
,
- },
- {
- title: (
- <>
- 모든 마케터의 현직자 특강부터
- 실시간 피드백까지
- >
- ),
- description: (
- <>
- 현직자와 직접 만나 질문하고, 피드백받고, 성장하는 4주
- 마케터가 되기 위해 필요한 경험, 역량, 프로젝트가
-
무엇인지 현직자 시선에서 알아가세요.
- >
- ),
- visualExplanation:
,
- },
- {
- title: (
- <>
- 4주 안에 서류 완성,
단 하나의 코스로 끝
- >
- ),
- description:
- '4주 안에 경험 정리, 자소서, 포트폴리오까지\n마케팅 직무에 꼭 맞는 서류를 한 번에 완성하세요.',
- visualExplanation:
,
- },
-];
-
const Badge = ({ index }: { index: number }) => {
return (
@@ -80,7 +42,48 @@ const Differentiator = ({
);
};
-const MarketingDifferentiatorsSection: React.FC = () => {
+const MarketingDifferentiatorsSection: React.FC<{
+ lectures?: ChallengeContent['lectures'];
+}> = ({ lectures }) => {
+ const differentiators = [
+ {
+ title: '마케팅 실무 역량 Class',
+ description: (
+ <>
+ 신입 마케터가 가장 막히는 실무 툴,
단 3회
+ 수업으로 한 번에 끝냅니다.
+ >
+ ),
+ visualExplanation:
,
+ },
+ {
+ title: (
+ <>
+ 모든 마케터의 현직자 특강부터
+ 실시간 피드백까지
+ >
+ ),
+ description: (
+ <>
+ 현직자와 직접 만나 질문하고, 피드백받고, 성장하는 4주
+ 마케터가 되기 위해 필요한 경험, 역량, 프로젝트가
+
무엇인지 현직자 시선에서 알아가세요.
+ >
+ ),
+ visualExplanation:
,
+ },
+ {
+ title: (
+ <>
+ 4주 안에 서류 완성,
단 하나의 코스로 끝
+ >
+ ),
+ description:
+ '4주 안에 경험 정리, 자소서, 포트폴리오까지\n마케팅 직무에 꼭 맞는 서류를 한 번에 완성하세요.',
+ visualExplanation:
,
+ },
+ ];
+
return (
{differentiators.map((item, index) => (