diff --git a/public/onboarding/Alarm.svg b/public/onboarding/Alarm.svg new file mode 100644 index 00000000..39f0effa --- /dev/null +++ b/public/onboarding/Alarm.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/onboarding/ArrowIcon.svg b/public/onboarding/ArrowIcon.svg new file mode 100644 index 00000000..fed9c31c --- /dev/null +++ b/public/onboarding/ArrowIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/onboarding/CheckIcon.svg b/public/onboarding/CheckIcon.svg new file mode 100644 index 00000000..daf7a72b --- /dev/null +++ b/public/onboarding/CheckIcon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/onboarding/PhotoCamera.svg b/public/onboarding/PhotoCamera.svg new file mode 100644 index 00000000..e99dba25 --- /dev/null +++ b/public/onboarding/PhotoCamera.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/onboarding/UnCheckIcon.svg b/public/onboarding/UnCheckIcon.svg new file mode 100644 index 00000000..de2eef94 --- /dev/null +++ b/public/onboarding/UnCheckIcon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/app/(main)/alarm/page.tsx b/src/app/(main)/alarm/page.tsx index 70aeea8b..9904c72b 100644 --- a/src/app/(main)/alarm/page.tsx +++ b/src/app/(main)/alarm/page.tsx @@ -76,8 +76,9 @@ export default function Alarm() { return (
-
} onBack={onBack} /> -
+
} onBack={onBack} className={'pt-10'} /> +
+
{alarms ? alarms.map((alarm, index) => { @@ -97,9 +98,7 @@ export default function Alarm() { : null}
- - -
+
); } diff --git a/src/app/(main)/community/[category]/[id]/page.tsx b/src/app/(main)/community/[category]/[id]/page.tsx index a7111026..7f3bb72b 100644 --- a/src/app/(main)/community/[category]/[id]/page.tsx +++ b/src/app/(main)/community/[category]/[id]/page.tsx @@ -185,7 +185,9 @@ const CommunityDetailPage = () => { setBoardType(postData.postType); setBoardTypeInit(false); }} + className={'pt-10'} /> +
{/* 게시글 */}
) : ( - <> +
{reviewWriteAccess && reviewWriteAccess.result ? ( ) : null} @@ -182,9 +182,11 @@ export default function CommunityCategoryPage() { }} /> } + className={'pt-10'} title={selectedCertificationName} /> -
+
+
{/*boardType 변경 메뉴*/} - +
); } diff --git a/src/app/(main)/community/page.tsx b/src/app/(main)/community/page.tsx index ead28909..810665d8 100644 --- a/src/app/(main)/community/page.tsx +++ b/src/app/(main)/community/page.tsx @@ -36,7 +36,8 @@ export default function Community() { return ( <>
-
+
+
게시판
diff --git a/src/app/(main)/exam/page.tsx b/src/app/(main)/exam/page.tsx index 6639f8d5..4c1f8424 100644 --- a/src/app/(main)/exam/page.tsx +++ b/src/app/(main)/exam/page.tsx @@ -45,6 +45,7 @@ const SolveExamBox = () => { ) : null}
+
diff --git a/src/app/(main)/exam/result/page.tsx b/src/app/(main)/exam/result/page.tsx index 6a94d1c4..0ae44d72 100644 --- a/src/app/(main)/exam/result/page.tsx +++ b/src/app/(main)/exam/result/page.tsx @@ -138,8 +138,9 @@ const Result = () => { return (
-
+
+
{displayComponentBasedOnExamResults(examResults)}
diff --git a/src/app/(main)/exam/test/page.tsx b/src/app/(main)/exam/test/page.tsx index 76ea3122..2652359c 100644 --- a/src/app/(main)/exam/test/page.tsx +++ b/src/app/(main)/exam/test/page.tsx @@ -51,7 +51,7 @@ const Test = () => { setIsAutoSubmitTimeUpModalOpen={setIsAutoSubmitTimeUpModalOpen} /> - +
); diff --git a/src/app/(main)/exam/wrong/page.tsx b/src/app/(main)/exam/wrong/page.tsx index 73158669..d880a1e9 100644 --- a/src/app/(main)/exam/wrong/page.tsx +++ b/src/app/(main)/exam/wrong/page.tsx @@ -30,7 +30,8 @@ const IncorrectQuestion = () => { return ( <> -
+
+
{isLoading && } {incorrectQuestions diff --git a/src/app/(main)/home/exam-info/page.tsx b/src/app/(main)/home/exam-info/page.tsx index c24ab958..429f1d59 100644 --- a/src/app/(main)/home/exam-info/page.tsx +++ b/src/app/(main)/home/exam-info/page.tsx @@ -170,7 +170,13 @@ const ExamInfo = () => { return (
-
+
+
{Object.entries(commonTitle).map(([key, value]) => { return ; diff --git a/src/app/(main)/home/goal-setting/page.tsx b/src/app/(main)/home/goal-setting/page.tsx index fa6277b7..30e8f71e 100644 --- a/src/app/(main)/home/goal-setting/page.tsx +++ b/src/app/(main)/home/goal-setting/page.tsx @@ -185,7 +185,8 @@ const GoalSetting = () => { ) }>
-
+
+
{/*자격증 선택*/} {isResetButtonClick ? : null} {/*목표 점수 설정*/} diff --git a/src/app/(main)/home/growth-chart-view/page.tsx b/src/app/(main)/home/growth-chart-view/page.tsx index bea863e7..721f8a54 100644 --- a/src/app/(main)/home/growth-chart-view/page.tsx +++ b/src/app/(main)/home/growth-chart-view/page.tsx @@ -172,6 +172,7 @@ const GrowthChartView = () => { return (
+
{/*유저별 목표 기간 전체 필터*/}
diff --git a/src/app/(main)/home/page.tsx b/src/app/(main)/home/page.tsx index f80554f9..2fda20a4 100644 --- a/src/app/(main)/home/page.tsx +++ b/src/app/(main)/home/page.tsx @@ -262,6 +262,7 @@ function HomeComponents() {
+
{userGoals ? (
{goalAchievementData ? ( diff --git a/src/app/(main)/mypage/comment/page.tsx b/src/app/(main)/mypage/comment/page.tsx index b4b1ef2e..103bff4d 100644 --- a/src/app/(main)/mypage/comment/page.tsx +++ b/src/app/(main)/mypage/comment/page.tsx @@ -46,7 +46,8 @@ export default function MyComment() { return (
-
} /> +
} className={'pt-10'} /> +
{/*필터*/} diff --git a/src/app/(main)/mypage/etc/marketing-info/page.tsx b/src/app/(main)/mypage/etc/marketing-info/page.tsx new file mode 100644 index 00000000..a5bee535 --- /dev/null +++ b/src/app/(main)/mypage/etc/marketing-info/page.tsx @@ -0,0 +1,31 @@ +'use client'; + +import Header from '@/components/common/Header'; + +const MarketingInformationPage = () => { + return ( + <> +
+
+
+

[Cercat] 마케팅 목적 개인정보 이용 및 광고 수신 동의

+ Core 주식회사는 서비스 개선 및 유용한 정보를 제공하기 위해 +
아래와 같이 마케팅 목적의 정보 제공에 대한 동의를 받고자 합니다. +
+
+
  • 수집 및 이용 항목
  • + 이름, 이메일, 휴대전화번호 +
    +
    +
  • 이용 목적
  • + 서비스 관련 이벤트, 프로모션, 신규 기능 안내 등 마케팅 정보 제공 이메일, SMS, 앱 푸시 등을 통한 정보 전달 +
    +
    +
    + 전달 보유 및 이용 기간 동의 철회 시 또는 회원 탈퇴 시까지 동의 거부 권리 및 불이익 동의를 거부하더라도 서비스 + 이용에는 제한이 없습니다. +
    + + ); +}; +export default MarketingInformationPage; diff --git a/src/app/(main)/mypage/etc/page.tsx b/src/app/(main)/mypage/etc/page.tsx new file mode 100644 index 00000000..623b524d --- /dev/null +++ b/src/app/(main)/mypage/etc/page.tsx @@ -0,0 +1,55 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import * as React from 'react'; +import { SVGProps } from 'react'; + +import Header from '@/components/common/Header'; + +const ETCPage = () => { + const router = useRouter(); + return ( +
    +
    +
    +
    +
    +

    약관 및 개인정보 처리

    +
    + + + +
    +
    +
    +
    + ); +}; +export default ETCPage; + +const MoveIcon = (props: SVGProps) => ( + + + +); diff --git a/src/app/(main)/mypage/etc/personal-info/page.tsx b/src/app/(main)/mypage/etc/personal-info/page.tsx new file mode 100644 index 00000000..76bedba5 --- /dev/null +++ b/src/app/(main)/mypage/etc/personal-info/page.tsx @@ -0,0 +1,92 @@ +'use client'; +import Header from '@/components/common/Header'; + +const PersonalInfoPage = () => { + return ( + <> +
    +
    +
    +

    개인정보처리방침

    + +
    +

    제1조 (개인정보의 수집 항목 및 수집 방법)

    +

    회사는 다음의 개인정보를 수집합니다.

    +
      +
    • 필수 항목: 이름, 이메일 주소, 비밀번호, 닉네임
    • +
    • 선택 항목: 생년월일, 프로필 사진, 자격증 관심 분야
    • +
    • 수집 방법: 회원가입 및 서비스 이용 시, 이벤트 참여, 고객센터 문의, 쿠키 등
    • +
    +
    + +
    +

    제2조 (개인정보의 수집 및 이용 목적)

    +
      +
    • 회원가입 및 본인 확인, 이용자 식별 등 서비스 제공
    • +
    • 맞춤형 자격증 추천 및 학습 분석
    • +
    • 고객 문의 대응 및 서비스 개선
    • +
    • 이용 통계 및 분석
    • +
    • 이벤트 및 프로모션 정보 제공 (※ 별도 동의 시)
    • +
    +
    + +
    +

    제3조 (개인정보의 보유 및 이용기간)

    +

    + 개인정보는 수집·이용 목적 달성 시 지체 없이 파기합니다. 단, 관련 법령에 따라 일정 기간 보관될 수 있습니다. +

    +
      +
    • 계약/청약철회 기록: 5년
    • +
    • 소비자 불만/분쟁 기록: 3년
    • +
    • 서비스 이용기록: 3개월
    • +
    +
    + +
    +

    제4조 (개인정보 제3자 제공 및 처리 위탁)

    +

    + 회사는 원칙적으로 개인정보를 제3자에게 제공하지 않습니다. 단, 법령에 따라 예외가 적용될 수 있습니다. 또한 + 서비스 운영을 위해 외부에 일부 처리를 위탁할 수 있습니다. +

    +
    + +
    +

    제5조 (이용자의 권리 및 행사 방법)

    +
      +
    • 개인정보 열람, 정정, 삭제, 처리정지 요청
    • +
    • 마케팅 수신 동의 철회
    • +
    • 고객센터 또는 개인정보 보호책임자를 통해 요청 가능
    • +
    +
    + +
    +

    제6조 (개인정보 파기 절차 및 방법)

    +

    + 보유 기간 경과 또는 처리 목적 달성 시 즉시 파기하며, 전자파일은 복구 불가능한 방식으로, 문서는 분쇄 또는 + 소각합니다. +

    +
    + +
    +

    제7조 (쿠키 등의 사용)

    +

    맞춤형 서비스 제공을 위해 쿠키를 사용하며, 이용자는 브라우저 설정을 통해 이를 거부할 수 있습니다.

    +
    + +
    +

    제8조 (개인정보 보호책임자)

    +
      +
    • 성명: 황유림
    • +
    • 직책: 개인정보 보호책임자
    • +
    • 이메일: hske3602@naver.com
    • +
    • 연락처: 010-7557-9217
    • +
    +
    + +

    + ※ 본 방침은 법령 또는 내부 방침에 따라 변경될 수 있으며, 변경 시 사전 고지됩니다. +

    +
    + + ); +}; +export default PersonalInfoPage; diff --git a/src/app/(main)/mypage/etc/terms-agreement/page.tsx b/src/app/(main)/mypage/etc/terms-agreement/page.tsx new file mode 100644 index 00000000..10e9aad9 --- /dev/null +++ b/src/app/(main)/mypage/etc/terms-agreement/page.tsx @@ -0,0 +1,87 @@ +'use client'; +import Header from '@/components/common/Header'; + +const TermsAgreementPage = () => { + return ( + <> +
    +
    +
    +

    서비스 이용 약관

    + +
    +

    제1조 (목적)

    +

    + 이 약관은 Core 주식회사(이하 "회사")가 제공하는 자격증 취득 지원 서비스 Cercat(이하 + "서비스")의 이용조건 및 절차, 회사와 이용자 간의 권리, 의무, 책임사항 등을 규정함을 목적으로 + 합니다. 목적으로 합니다. +

    +
    + +
    +

    제2조 (용어의 정의)

    +

    이 약관에서 사용하는 용어의 정의는 다음과 같습니다.

    +
      +
    • "이용자": 본 약관에 따라 회사가 제공하는 서비스를 이용하는 자
    • +
    • "회원": 회사에 개인정보를 제공하고 회원등록을 완료한 자
    • +
    +
    + +
    +

    제3조 (약관의 효력 및 변경)

    +

    + 본 약관은 서비스 초기화면에 게시함으로써 효력을 발생하며, 관련 법령을 위반하지 않는 범위에서 변경될 수 + 있습니다. 변경 시 사전 공지합니다. +

    +
    + +
    +

    제4조 (서비스의 이용)

    +
      +
    • 회사는 이용자에게 다양한 자격증 관련 정보, 학습 자료, 자동 추천 기능 등을 제공합니다.
    • +
    • 서비스 이용은 연중무휴 1일 24시간을 원칙으로 하나, 시스템 점검 등으로 일시 중단될 수 있습니다.
    • +
    +
    + +
    +

    제5조 (이용자의 의무)

    +
      +
    • 이용자는 관계 법령, 본 약관의 규정, 이용 안내 등 회사가 공지한 사항을 준수해야 합니다.
    • +
    • 타인의 정보 도용, 서비스 방해, 회사의 지식재산권 침해 행위를 해서는 안 됩니다.
    • +
    +
    + +
    +

    제6조 (개인정보 보호)

    +

    + 회사는 개인정보보호법 등 관련 법령에 따라 이용자의 개인정보를 보호하며, 구체적인 내용은 개인정보처리방침에 + 따릅니다. +

    +
    + +
    +

    제7조 (서비스의 변경 및 종료)

    +

    + 회사는 서비스의 내용 일부 또는 전부를 사전 통지 후 변경하거나 종료할 수 있습니다. 단, 불가피한 사유가 있는 + 경우 사후 통지할 수 있습니다. +

    +
    + +
    +

    제8조 (면책 조항)

    +

    + 회사는 천재지변, 이용자의 귀책사유 등 불가항력적 사유로 인한 서비스 이용 장애에 대해 책임을 지지 않습니다. +

    +
    + +
    +

    제9조 (관할 법원)

    +

    서비스 이용과 관련하여 분쟁이 발생할 경우, 민사소송법상의 관할 법원을 관할 법원으로 합니다.

    +
    + +

    ※ 본 약관은 2025년 4월 25일부터 적용됩니다.

    +
    + + ); +}; +export default TermsAgreementPage; diff --git a/src/app/(main)/mypage/page.tsx b/src/app/(main)/mypage/page.tsx index e3ccaaf7..4ce876a2 100644 --- a/src/app/(main)/mypage/page.tsx +++ b/src/app/(main)/mypage/page.tsx @@ -8,7 +8,7 @@ import MyPageHeader from '@/components/mypage/MyPageHeader'; import MyPageItem from '@/components/mypage/MyPageItem'; import UnRegisterModal from '@/components/mypage/UnRegisterModal'; import StopWatchActiveButton from '@/components/stopwatch/StopWatchActiveButton'; -import { boardContents } from '@/utils/mypage/ItemContents'; +import { boardContents, etcContents } from '@/utils/mypage/ItemContents'; export default function MyPage() { const [isLogoutModalOpen, setIsLogoutModalOpen] = useState(false); @@ -26,12 +26,14 @@ export default function MyPage() { /> ) : null}
    +
    {/* 게시판 */} - {/* 설정 */} + {/* 기타 */} + {/**/} {/* 계정관리 */}
    @@ -60,6 +62,7 @@ export default function MyPage() {
    +
    ); diff --git a/src/app/(main)/mypage/profile/page.tsx b/src/app/(main)/mypage/profile/page.tsx index 990ea418..84998272 100644 --- a/src/app/(main)/mypage/profile/page.tsx +++ b/src/app/(main)/mypage/profile/page.tsx @@ -79,9 +79,10 @@ const ProfileSettings = () => { }, []); return ( -
    +
    } /> -
    +
    +
    {/* 프로필 사진 설정 섹션 */} diff --git a/src/app/(main)/mypage/writing/page.tsx b/src/app/(main)/mypage/writing/page.tsx index 83645c19..5f235bd1 100644 --- a/src/app/(main)/mypage/writing/page.tsx +++ b/src/app/(main)/mypage/writing/page.tsx @@ -51,13 +51,14 @@ export default function MyWriting() { /> ) : (
    -
    } /> +
    } className={'pt-10'} /> {/* 게시판 종류 선택 메뉴 */} +
    {/* 필터 */}
    diff --git a/src/app/(main)/stopwatch/page.tsx b/src/app/(main)/stopwatch/page.tsx index 8fa2a03e..7925fde7 100644 --- a/src/app/(main)/stopwatch/page.tsx +++ b/src/app/(main)/stopwatch/page.tsx @@ -34,6 +34,7 @@ export default function StopWatch() {
    +
    {/*
    */} diff --git a/src/app/globals.css b/src/app/globals.css index 623f8f4f..3840e12a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -11,37 +11,37 @@ @layer components { /* 온보딩, 게시판 선택시 사용되는 컴포넌트 스타일 */ .head1 { - @apply text-h1 font-bold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h1 font-bold leading-[24px] tracking-[-0.48px] font-pre } .title1 { - @apply text-h2 font-bold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h2 font-bold leading-[24px] tracking-[-0.32px] font-pre } .title2 { - @apply text-h3 font-bold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h3 font-bold leading-[24px] tracking-[-0.02em] font-pre } .title3 { - @apply text-h3 font-semibold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h3 font-semibold leading-[24px] tracking-[-0.02em] font-pre } .title4 { - @apply text-h4 font-bold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h4 font-bold leading-[24px] tracking-[-0.02em] font-pre } .title5 { - @apply text-h4 font-semibold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h4 font-semibold leading-[24px] tracking-[-0.32px] font-pre } .subtitle1 { - @apply text-h4 font-medium leading-[36px] tracking-[-0.02em] font-pre + @apply text-h4 font-medium leading-[24px] tracking-[-0.02em] font-pre } .subtitle2 { - @apply text-h6 font-semibold leading-[36px] tracking-[-0.02em] font-pre + @apply text-h6 font-semibold leading-[24px] tracking-[-0.02em] font-pre } .body1 { - @apply text-h4 font-normal leading-[36px] tracking-[-0.02em] font-pre + @apply text-h4 font-pre not-italic font-normal leading-[24px] tracking-[-0.32px] } .body2 { - @apply text-h6 font-normal leading-[36px] tracking-[-0.02em] font-pre + @apply text-h6 font-normal leading-[24px] tracking-[-0.28px] font-pre } .button { - @apply text-h6 font-medium leading-[36px] tracking-[-0.02em] font-pre + @apply text-h6 font-medium leading-[24px] tracking-[-0.02em] font-pre } } diff --git a/src/app/onboarding/page.tsx b/src/app/onboarding/page.tsx index dd7de1fe..8a5f1994 100644 --- a/src/app/onboarding/page.tsx +++ b/src/app/onboarding/page.tsx @@ -7,7 +7,9 @@ import { Suspense, useEffect, useState } from 'react'; import Spinner from '@/components/common/Spinner'; import CertificationPriority from '@/components/onboarding/CertificationPriority'; import ChooseCertification from '@/components/onboarding/ChooseCertification'; +import PermissionNotice from '@/components/onboarding/PermissionNotice'; import ProfileSettings from '@/components/onboarding/ProfileSettings'; +import TermsAgreement from '@/components/onboarding/TermsAgreement'; const OnBoardingComponents = () => { const searchParams = useSearchParams(); @@ -19,9 +21,9 @@ const OnBoardingComponents = () => { const [isCookieSet, setIsCookieSet] = useState(false); // ✅ 쿠키 저장 여부 - const [step, setStep] = useState<'ProfileSetting' | 'ChooseCertification' | 'CertificationPriority'>( - 'ProfileSetting', - ); + const [step, setStep] = useState< + 'TermsAgreement' | 'PermissionNotice' | 'ProfileSetting' | 'ChooseCertification' | 'CertificationPriority' + >('TermsAgreement'); const router = useRouter(); const moveUnSignUp = () => { @@ -49,8 +51,14 @@ const OnBoardingComponents = () => { return (
    + {step === 'TermsAgreement' && ( + setStep('PermissionNotice')} onBefore={moveUnSignUp} /> + )} + {step === 'PermissionNotice' && ( + setStep('ProfileSetting')} onBefore={() => setStep('TermsAgreement')} /> + )} {step === 'ProfileSetting' && ( - setStep('ChooseCertification')} onBefore={moveUnSignUp} /> + setStep('ChooseCertification')} onBefore={() => setStep('PermissionNotice')} /> )} {step === 'ChooseCertification' && ( +
    - {unreadCount !== 0 && ( + {unreadCount > 0 && (
    {unreadCount}
    @@ -92,7 +92,7 @@ export default function Header(props: Props) { return (
    {CancelIcon ? ( @@ -116,6 +116,7 @@ export default function Header(props: Props) { }} /> )} + {/* h1의 absolute 포지셔닝은 유지 */}

    {title}

    @@ -124,7 +125,7 @@ export default function Header(props: Props) { ); case 'second': return ( -
    +
    { setIsFilterOpen(!isFilterOpen); @@ -149,18 +150,22 @@ export default function Header(props: Props) { }; return ( -
    + <> + {' '} + {/* React Fragment 사용 또는 부모 div 제거 */} {renderHeader(headerType)} + {/* FilterModal의 absolute 위치 기준이 body가 될 수 있으므로 위치 조정 필요 */} {isFilterOpen ? ( ) : null} -
    + ); } diff --git a/src/components/common/NavBar.tsx b/src/components/common/NavBar.tsx index 1a2192c4..aae6eee5 100644 --- a/src/components/common/NavBar.tsx +++ b/src/components/common/NavBar.tsx @@ -8,7 +8,7 @@ export default function NavBar() { const paramsName = usePathname(); return ( -
    +
    + + + ); +}; +export default PermissionNotice; diff --git a/src/components/onboarding/ProfileSettings.tsx b/src/components/onboarding/ProfileSettings.tsx index a8e47cf3..54d29894 100644 --- a/src/components/onboarding/ProfileSettings.tsx +++ b/src/components/onboarding/ProfileSettings.tsx @@ -65,7 +65,8 @@ const ProfileSettings = (props: Props) => { return (
    -
    +
    +
    {/* 프로필 사진 설정 섹션 */}
    diff --git a/src/components/onboarding/TermsAgreement.tsx b/src/components/onboarding/TermsAgreement.tsx new file mode 100644 index 00000000..e19f6abd --- /dev/null +++ b/src/components/onboarding/TermsAgreement.tsx @@ -0,0 +1,154 @@ +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; + +import Header from '@/components/common/Header'; + +interface Props { + onNext: () => void; + onBefore: () => void; +} + +const TermsAgreement = (props: Props) => { + const { onNext, onBefore } = props; + const router = useRouter(); + const [allOptions, setAllOptions] = useState(false); + const [termsOfServiceOptions, setTermsOfServiceOptions] = useState(false); + const [personalInformation, setPersonalInformation] = useState(false); + const [marketingInformation, setMarketingInformation] = useState(false); + + const termsOfUseContents = [ + { + content: '서비스 이용약관 동의(필수)', + router: '/mypage/etc/terms-agreement', + state: termsOfServiceOptions, + setState: setTermsOfServiceOptions, + }, + { + content: '개인 정보 수집 및 이용 동의(필수)', + router: '/mypage/etc/personal-info', + state: personalInformation, + setState: setPersonalInformation, + }, + { + content: '마케팅 정보 수신 동의(선택)', + router: '/mypage/etc/marketing-info', + state: marketingInformation, + setState: setMarketingInformation, + }, + ]; + + // 개별 상태가 하나라도 false이면 allOptions를 false로 설정 + useEffect(() => { + if (termsOfServiceOptions && personalInformation && marketingInformation) { + setAllOptions(true); // 모두 true일 경우 allOptions도 true + } else { + setAllOptions(false); // 하나라도 false면 allOptions는 false + } + }, [termsOfServiceOptions, personalInformation, marketingInformation]); + + const handleAllOptionsClick = () => { + const newAllOptions = !allOptions; + setAllOptions(newAllOptions); + setTermsOfServiceOptions(newAllOptions); + setPersonalInformation(newAllOptions); + setMarketingInformation(newAllOptions); + }; + + const handleIndividualOptionClick = ( + setState: React.Dispatch>, + currentState: boolean, + ) => { + setState(!currentState); + }; + + return ( + <> +
    +
    +
    +

    약관 동의가 필요해요.

    +

    + Cercat 서비스 시작을 위해
    + 먼저 정보제공 및 필수약관에 동의 해주세요. +

    + +
    + + {termsOfUseContents.map((termsOfUseContent) => { + return ( + + ); + })} +
    +
    + + + ); +}; +export default TermsAgreement; diff --git a/src/utils/mypage/ItemContents.tsx b/src/utils/mypage/ItemContents.tsx index 7e317ebc..2c084766 100644 --- a/src/utils/mypage/ItemContents.tsx +++ b/src/utils/mypage/ItemContents.tsx @@ -7,7 +7,6 @@ export const boardContents: ItemType[] = [ export const alarmContents: ItemType[] = [{ title: '알림설정', path: '/home/goal-setting' }]; export const etcContents: ItemType[] = [ - { title: '문의하기', path: '/home/goal-setting' }, - { title: '약관 및 개인정보 처리', path: '/home/goal-setting' }, + { title: '약관 및 개인정보 처리', path: '/mypage/etc' }, { title: '앱버전', version: 0.1 }, ]; diff --git a/tailwind.config.ts b/tailwind.config.ts index 3bd71bce..402750c0 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -45,11 +45,11 @@ const config: Config = { h7: '12px', }, screens: { - sm: '375px', // sm을 500px로 변경 - md: '700px', // md를 850px로 변경 - lg: '1080px', // lg를 1080px로 변경 - xl: '1440px', // xl을 1440px로 변경 - '2xl': '1800px' // 2xl을 1800px로 변경 + sm: '375px', // sm을 500px로 변경 + md: '700px', // md를 850px로 변경 + lg: '1080px', // lg를 1080px로 변경 + xl: '1440px', // xl을 1440px로 변경 + '2xl': '1800px', // 2xl을 1800px로 변경 }, }, plugins: [],