Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Binary file modified public/images/landing/landing_expert1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/landing/landing_expert2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/landing/landing_expert3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 28 additions & 3 deletions src/app/_components/landing/Landing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,21 @@ import Image from 'next/image';
import useStickyCta from '@/hooks/useStickyCta';
import StickyBar from './StickyBar';
import { useRouter } from 'next/navigation';
import { useState } from 'react';
import { useState, useEffect } from 'react';
import UploadReportModal from '../common/UploadReportModal';
import LoginModal from '../common/LoginModal';
import { useAuthStore } from '@/store/auth.store';

const Landing = () => {
const { ctaRef, showSticky } = useStickyCta();
const router = useRouter();
const [isModalOpen, setIsModalOpen] = useState(false);
const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);
const { isAuthenticated, checkAuth } = useAuthStore();

useEffect(() => {
checkAuth();
}, [checkAuth]);

return (
<>
Expand All @@ -23,13 +31,25 @@ const Landing = () => {
<div ref={ctaRef} className="mt-8 flex gap-3">
<button
className="bg-primary-500 ds-text hover:bg-primary-600 active:bg-primary-700 h-[50px] w-[220px] cursor-pointer rounded-full px-8 font-medium text-white"
onClick={() => router.push('/business')}
onClick={() => {
if (isAuthenticated) {
router.push('/business');
} else {
setIsLoginModalOpen(true);
}
}}
>
사업계획서 작성하기
</button>
<button
className="ds-text h-[50px] cursor-pointer rounded-full bg-white px-8 font-semibold text-gray-900 hover:bg-gray-100 active:bg-gray-200"
onClick={() => setIsModalOpen(true)}
onClick={() => {
if (isAuthenticated) {
setIsModalOpen(true);
} else {
setIsLoginModalOpen(true);
}
}}
>
PDF 업로드하고 채점받기
</button>
Expand All @@ -52,6 +72,11 @@ const Landing = () => {
<UploadReportModal open={true} onClose={() => setIsModalOpen(false)} />
)}

<LoginModal
open={isLoginModalOpen}
onClose={() => setIsLoginModalOpen(false)}
/>

<StickyBar show={showSticky} />
</>
);
Expand Down
156 changes: 107 additions & 49 deletions src/app/_components/landing/LandingPaySection.tsx
Original file line number Diff line number Diff line change
@@ -1,70 +1,128 @@
'use client';
import Check from '@/assets/icons/big_check.svg';
import BCheck from '@/assets/icons/black_check.svg';
import RightIcon from '@/assets/icons/white_right.svg';
import Polygon from '@/assets/icons/polygon.svg';
import { useRouter } from 'next/navigation';
import { useState, useEffect } from 'react';
import LoginModal from '../common/LoginModal';
import { useAuthStore } from '@/store/auth.store';

const LandingPaySection = () => {
const router = useRouter();
const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);
const { isAuthenticated, checkAuth } = useAuthStore();

useEffect(() => {
checkAuth();
}, [checkAuth]);
return (
<div className="flex h-[978px] w-full flex-col items-center justify-center gap-[67px] px-[375px] py-[120px]">
<div className="text-[52px] leading-[150%] font-semibold text-gray-900">
<span className="relative inline-block">
<span className="absolute inset-0 flex items-center">
<span className="bg-primary-500 h-[5px] w-full"></span>
</span>

<span className="relative">
300,000원{' '}
<span className="text-[32px] font-medium text-gray-700">
/ 시간당 비대면 멘토링
</span>
</span>
<div className="flex h-[1047px] w-full flex-col items-center justify-center bg-white py-[120px]">
<div className="flex flex-col items-center justify-center gap-3">
<span className="text-primary-500 ds-heading font-semibold">
멘토링 비용{' '}
</span>

<span className="text-[42px] font-bold text-gray-900">
30만 원짜리 멘토링, <span className="text-primary-500">80%</span> 비용
절감
</span>

<span className="ds-title font-medium text-gray-900">
시간당 30만원이던 멘토링을 비대면 구조로 전환해 비용을 합리적으로
만들었어요.
</span>
</div>

<div className="flex w-full flex-col items-center">
<div className="bg-primary-500 inline-flex w-full items-center justify-center rounded-t-2xl py-3">
<p className="ds-title font-medium text-white">Lite 이용권의 기능</p>
<div className="mt-[56px] flex flex-row items-center justify-center gap-6">
<div className="flex w-[456px] flex-col items-center">
<div className="inline-flex w-full items-center justify-center rounded-t-2xl bg-gray-300 py-3">
<p className="text-[20px] font-medium text-gray-700">
시간당 대면 멘토링
</p>
</div>

<div className="flex w-full flex-col rounded-b-2xl bg-gray-200 px-[60px] py-[50px]">
<p className="text-[48px] font-semibold text-gray-900">
300,000원
<span className="ml-3 text-[24px] font-medium text-gray-900">
/ 1회
</span>
</p>

<div className="mt-5 flex flex-row items-center gap-[6px]">
<BCheck />
<p className="text-[22px] font-medium text-gray-900">
전문가 비대면 멘토링 1회
</p>
</div>

<div className="ds-subtitle mt-3 flex w-full flex-col gap-[6px] px-6 font-medium text-gray-900">
<li>사업계획서 PDF/텍스트 기반 심층 검토</li>
<li>강·약점 구체 코멘트</li>
<li>AI 리포트 무제한 포함</li>
</div>
</div>
</div>
<Polygon />

<div className="flex w-full flex-col rounded-b-2xl bg-gray-900 px-[60px] py-[50px]">
<p className="text-[48px] font-semibold text-white">
49,000원{' '}
<span className="text-[24px] font-medium text-gray-300">
/ 시간당 비대면 멘토링
</span>
</p>

<div className="mt-5 flex flex-row items-center gap-[6px]">
<Check />
<p className="text-[22px] text-white">전문가 비대면 멘토링 1회</p>
<div className="flex w-[586px] flex-col items-center">
<div className="bg-primary-500 inline-flex w-full items-center justify-center rounded-t-2xl py-3">
<p className="ds-title font-medium text-white">
스타라이트의 비대면 멘토링
</p>
</div>

<div className="ds-subtitle mt-3 flex w-full flex-col gap-1 px-6 font-medium text-gray-300">
<li>사업계획서 PDF/텍스트 기반 심층 검토</li>
<li>강·약점 구체 코멘트</li>
<li>AI 리포트 무제한 포함</li>
<div className="flex w-full flex-col rounded-b-2xl bg-gray-900 px-[60px] py-[50px]">
<p className="text-[48px] font-semibold text-white">
0원
<span className="ml-3 text-[24px] font-medium text-gray-300">
/ 1회 <span className="line-through">49,000원</span>
</span>
</p>

<div className="mt-5 flex flex-row items-center gap-[6px]">
<Check />
<p className="text-[22px] text-white">전문가 비대면 멘토링 1회</p>
</div>

<div className="ds-subtitle mt-3 flex w-full flex-col gap-[6px] px-6 font-medium text-gray-300">
<li>사업계획서 PDF/텍스트 기반 심층 검토</li>
<li>강·약점 구체 코멘트</li>
<li>AI 리포트 무제한 포함</li>
</div>
</div>
</div>
</div>

<button
className="bg-primary-500 hover:bg-primary-700 mt-12 flex h-[64px] w-[516px] cursor-pointer items-center justify-center rounded-lg px-8"
onClick={() => router.push('/pay')}
>
<p className="ds-title font-semibold text-white">구매하기</p>
<RightIcon />
</button>

<div className="mt-12 flex flex-col">
<p className="ds-text font-normal text-gray-600">
*전문가 대면 멘토링 평균 약 30만 원 수준에서 구조 개선을 통해 최대
약 4.9만 원대까지 절감했습니다.
</p>
<p className="ds-text text-center font-normal text-gray-600">
*전문가 대면 멘토링 평균 비용은 1시간 기준 일반적인 시장 시세를
참고하였습니다.
</p>
</div>
<button
className="bg-primary-500 hover:bg-primary-700 mt-12 flex h-[64px] w-[516px] cursor-pointer items-center justify-center gap-1 rounded-lg px-8"
onClick={() => {
if (isAuthenticated) {
router.push('/business');
} else {
setIsLoginModalOpen(true);
}
}}
>
<p className="ds-title font-semibold text-white">0원으로 시작하기</p>
<RightIcon />
</button>

<LoginModal
open={isLoginModalOpen}
onClose={() => setIsLoginModalOpen(false)}
/>

<div className="mt-12 flex flex-col">
<p className="ds-text font-normal text-gray-600">
*전문가 대면 멘토링 평균 약 30만 원 수준에서 구조 개선을 통해 최대 약
4.9만 원대까지 절감했습니다.
</p>
<p className="ds-text text-center font-normal text-gray-600">
*전문가 대면 멘토링 평균 비용은 1시간 기준 일반적인 시장 시세를
참고하였습니다.
</p>
</div>
</div>
);
Expand Down
18 changes: 9 additions & 9 deletions src/app/_components/landing/LandingRelation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ const LandingRelation = () => {

return (
<div>
<Image
src="/images/landing/landing_final.png"
alt="랜딩 관련기관"
width={1440}
height={420}
className="w-full"
priority
/>

<div className="mt-[119px] flex w-full flex-col bg-white px-[132px] pb-[235px]">
<div className="text-[42px] leading-[150%] font-bold tracking-[-0.84px] text-gray-900">
관련 기관
Expand Down Expand Up @@ -70,15 +79,6 @@ const LandingRelation = () => {
))}
</ul>
</div>

<Image
src="/images/landing/landing_final.png"
alt="랜딩 관련기관"
width={1440}
height={420}
className="w-full"
priority
/>
</div>
);
};
Expand Down
27 changes: 24 additions & 3 deletions src/app/_components/landing/StickyBar.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
'use client';

import { useRouter } from 'next/navigation';
import { useState } from 'react';
import { useState, useEffect } from 'react';
import UploadReportModal from '../common/UploadReportModal';
import LoginModal from '../common/LoginModal';
import { useAuthStore } from '@/store/auth.store';

interface StickyBarProps {
show: boolean;
Expand All @@ -11,6 +13,12 @@ interface StickyBarProps {
const StickyBar = ({ show }: StickyBarProps) => {
const router = useRouter();
const [isModalOpen, setIsModalOpen] = useState(false);
const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);
const { isAuthenticated, checkAuth } = useAuthStore();

useEffect(() => {
checkAuth();
}, [checkAuth]);
return (
<>
<div
Expand All @@ -23,14 +31,26 @@ const StickyBar = ({ show }: StickyBarProps) => {
</div>
<div className="ml-auto flex gap-3">
<button
onClick={() => router.push('/business')}
onClick={() => {
if (isAuthenticated) {
router.push('/business');
} else {
setIsLoginModalOpen(true);
}
}}
className="bg-primary-500 ds-text hover:bg-primary-600 active:bg-primary-700 h-[50px] w-[220px] cursor-pointer rounded-full px-8 font-medium text-white"
>
사업계획서 작성하기
</button>
<button
className="ds-text h-[50px] cursor-pointer rounded-full bg-white px-8 font-semibold text-gray-900 hover:bg-gray-100 active:bg-gray-200"
onClick={() => setIsModalOpen(true)}
onClick={() => {
if (isAuthenticated) {
setIsModalOpen(true);
} else {
setIsLoginModalOpen(true);
}
}}
>
PDF 업로드하고 채점받기
</button>
Expand All @@ -41,6 +61,7 @@ const StickyBar = ({ show }: StickyBarProps) => {
{isModalOpen && (
<UploadReportModal open={true} onClose={() => setIsModalOpen(false)} />
)}
<LoginModal open={isLoginModalOpen} onClose={() => setIsLoginModalOpen(false)} />
</>
);
};
Expand Down
2 changes: 1 addition & 1 deletion src/app/expert/detail/components/ExpertDetailSidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ const ExpertDetailSidebar = ({ expert }: ExpertDetailSidebarProps) => {
const ButtonIcon = shouldShowCreateButton
? WhitePlus
: hasRequested
? GrayPlus
? GrayCheck
: disabled && !isSelectedPlanOver70
? GrayCheck
: disabled
Expand Down
30 changes: 2 additions & 28 deletions src/app/mypage/components/MyAccount.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
'use client';
import Image from 'next/image';
import React, { useState } from 'react';
import PayHistoryModal from './PayHistoryModal';
import { useUserStore } from '@/store/user.store';
import Naver from '@/assets/icons/naver_profile.svg';
import KaKao from '@/assets/icons/kakao_profile.svg';

const MyAccount = () => {
const [isModal, setIsModal] = useState(false);
const { user } = useUserStore();

return (
<div className="mt-6 flex flex-row items-start gap-4">
<div className="bg-gray-80 flex w-[556px] flex-col items-start gap-6 rounded-xl p-6">
<div className="mt-6 flex w-full flex-row items-start gap-4">
<div className="bg-gray-80 flex w-full flex-col items-start gap-6 rounded-xl p-6">
<div className="ds-subtitle font-medium text-black">내 계정 </div>

<div className="h-px w-full bg-gray-200" />
Expand Down Expand Up @@ -49,29 +46,6 @@ const MyAccount = () => {
</div>
</div>
</div>

<div className="bg-gray-80 flex w-[375px] flex-col items-start gap-6 rounded-xl p-6">
<div className="flex w-full flex-row items-center justify-between">
<div className="ds-subtitle font-medium text-black"> 요금제 관리</div>
<button
className="ds-caption inline-flex h-7 cursor-pointer items-center justify-center rounded-sm bg-gray-200 px-2 font-medium text-gray-900 hover:bg-gray-300 active:bg-gray-300"
onClick={() => setIsModal(true)}
>
구매 내역
</button>
</div>

<div className="h-px w-full bg-gray-200" />

<div className="flex w-full flex-col items-start gap-1.5">
<div className="ds-text font-medium text-black">Lite 요금제</div>
<div className="ds-subtext font-medium text-gray-500">
잔여횟수 총 1/5회
</div>
</div>
</div>

{isModal && <PayHistoryModal onClose={() => setIsModal(false)} />}
</div>
);
};
Expand Down
3 changes: 3 additions & 0 deletions src/assets/icons/black_check.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading