Skip to content

Commit 60ac4cd

Browse files
authored
Merge pull request #92 from StartUpLight/main
dev 최신화
2 parents 42a641e + 0d3381d commit 60ac4cd

File tree

16 files changed

+280
-155
lines changed

16 files changed

+280
-155
lines changed
1.48 MB
Loading

src/api/expert.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,19 @@ import {
44
expertReportsResponse,
55
getExpertReportsResponse,
66
getExpertResponse,
7-
getFeedBackExpertResponse,
87
getUserExpertReportResponse,
98
} from '@/types/expert/expert.type';
109
import api from './api';
11-
import { ExpertDetailResponse } from '@/types/expert/expert.detail';
10+
import {
11+
ExpertDetailResponse,
12+
ExpertReportDetailResponse,
13+
} from '@/types/expert/expert.detail';
1214

1315
export async function GetExpert(): Promise<getExpertResponse[]> {
1416
const res = await api.get<{ data: getExpertResponse[] }>('/v1/experts');
1517
return res.data.data;
1618
}
1719

18-
export async function GetFeedBackExpert(
19-
businessPlanId: number
20-
): Promise<getFeedBackExpertResponse> {
21-
if (!Number.isFinite(businessPlanId) || businessPlanId <= 0) {
22-
throw new Error('유효하지 않는 아이디입니다.');
23-
}
24-
const { data } = await api.get<getFeedBackExpertResponse>(
25-
'/v1/expert-applications',
26-
{ params: { businessPlanId } }
27-
);
28-
return data;
29-
}
30-
3120
export async function ApplyFeedback({
3221
businessPlanId,
3322
expertId,
@@ -92,3 +81,16 @@ export async function GetExpertDetail(
9281

9382
return res.data.data;
9483
}
84+
85+
export async function GetExpertReportDetail(
86+
expertId: number
87+
): Promise<ExpertReportDetailResponse[]> {
88+
const res = await api.get<{ data: ExpertReportDetailResponse[] }>(
89+
`/v1/experts/${expertId}/business-plans/ai-reports`,
90+
{
91+
params: { expertId },
92+
}
93+
);
94+
95+
return res.data.data;
96+
}

src/app/_components/landing/LandingChecklist.tsx

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,52 @@
1+
'use client';
12
import Image from 'next/image';
2-
import React from 'react';
3+
import ArrowIcon from '@/assets/icons/chevron_right.svg';
4+
import { useRouter } from 'next/navigation';
35

46
const LandingChecklist = () => {
7+
const router = useRouter();
58
return (
6-
<div className="h-[897px] bg-white px-[132px] py-[120px]">
7-
<div className="ds-heading gradation inline-block font-semibold">
8-
항목별 체크리스트{' '}
9-
</div>
10-
<div className="mt-3 text-[42px] leading-[150%] font-bold tracking-[-0.84px] text-black">
11-
스타라이트는 이런 분들께 추천드려요.
12-
</div>
9+
<div className="w-full bg-black px-[132px] py-40">
10+
<div className="flex w-full flex-row gap-[61px]">
11+
<div className="flex flex-col gap-[100px]">
12+
<h2 className="text-[42px] leading-[150%] font-bold text-white">
13+
2026년 지원사업, <br />
14+
사업계획서에서 탈락하지 않게 만드는 방법
15+
</h2>
1316

14-
<div className="mt-[60px] flex w-full flex-row items-start justify-center gap-9">
15-
<Image
16-
src="/images/landing/landing_checklist_1.png"
17-
alt="랜딩 체크리스트1"
18-
width={368}
19-
height={480}
20-
className="h-[480px] w-[368px]"
21-
priority
22-
unoptimized={true}
23-
/>
17+
<div className="flex flex-col gap-6">
18+
<p className="ds-title font-semibold text-gray-300">
19+
2026 지원사업 대비 모든 기능 무료 프로모션 (~1/10)
20+
</p>
2421

25-
<Image
26-
src="/images/landing/landing_checklist_2.png"
27-
alt="랜딩 체크리스트2"
28-
width={368}
29-
height={480}
30-
className="h-[480px] w-[368px]"
31-
priority
32-
unoptimized={true}
33-
/>
22+
<div className="flex flex-row items-start gap-3">
23+
{['10일', '4시간', '19분', '20초'].map((time) => (
24+
<div
25+
key={time}
26+
className="ds-heading flex h-[86px] w-[120px] items-center justify-center rounded-lg bg-gray-900 py-10 font-semibold text-white"
27+
>
28+
{time}
29+
</div>
30+
))}
31+
</div>
32+
<button
33+
className="ds-title flex h-[64px] w-[516px] cursor-pointer items-center justify-center rounded-lg bg-white px-8 font-semibold text-gray-900 hover:bg-gray-100 active:bg-gray-200"
34+
onClick={() => router.push('/business')}
35+
>
36+
2026 지원사업 준비 시작하기
37+
<ArrowIcon />
38+
</button>
39+
</div>
40+
</div>
3441

3542
<Image
36-
src="/images/landing/landing_checklist_3.png"
37-
alt="랜딩 체크리스트3"
38-
width={368}
39-
height={480}
40-
className="h-[480px] w-[368px]"
43+
src="/images/landing/landing_promotion.png"
44+
alt="프로모션 이미지"
45+
width={479}
46+
height={412}
47+
className="h-[412px] w-[479px]"
4148
priority
49+
quality={100}
4250
unoptimized={true}
4351
/>
4452
</div>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
'use client';
2+
import Check from '@/assets/icons/big_check.svg';
3+
import RightIcon from '@/assets/icons/white_right.svg';
4+
import { useRouter } from 'next/navigation';
5+
6+
const LandingPaySection = () => {
7+
const router = useRouter();
8+
return (
9+
<div className="flex h-[978px] w-full flex-col items-center justify-center gap-[67px] px-[375px] py-[120px]">
10+
<div className="text-[52px] leading-[150%] font-semibold text-gray-900">
11+
<span className="relative inline-block">
12+
<span className="absolute inset-0 flex items-center">
13+
<span className="bg-primary-500 h-[5px] w-full"></span>
14+
</span>
15+
16+
<span className="relative">
17+
300,000원{' '}
18+
<span className="text-[32px] font-medium text-gray-700">
19+
/ 시간당 비대면 멘토링
20+
</span>
21+
</span>
22+
</span>
23+
</div>
24+
25+
<div className="flex w-full flex-col items-center">
26+
<div className="bg-primary-500 inline-flex w-full items-center justify-center rounded-t-2xl py-3">
27+
<p className="ds-title font-medium text-white">Lite 이용권의 기능</p>
28+
</div>
29+
30+
<div className="flex w-full flex-col rounded-b-2xl bg-gray-900 px-[60px] py-[50px]">
31+
<p className="text-[48px] font-semibold text-white">
32+
49,000원{' '}
33+
<span className="text-[24px] font-medium text-gray-300">
34+
/ 시간당 비대면 멘토링
35+
</span>
36+
</p>
37+
38+
<div className="mt-5 flex flex-row items-center gap-[6px]">
39+
<Check />
40+
<p className="text-[22px] text-white">전문가 비대면 멘토링 1회</p>
41+
</div>
42+
43+
<div className="ds-subtitle mt-3 flex w-full flex-col gap-1 px-6 font-medium text-gray-300">
44+
<li>사업계획서 PDF/텍스트 기반 심층 검토</li>
45+
<li>강·약점 구체 코멘트</li>
46+
<li>AI 리포트 무제한 포함</li>
47+
</div>
48+
</div>
49+
50+
<button
51+
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"
52+
onClick={() => router.push('/pay')}
53+
>
54+
<p className="ds-title font-semibold text-white">구매하기</p>
55+
<RightIcon />
56+
</button>
57+
58+
<div className="mt-12 flex flex-col">
59+
<p className="ds-text font-normal text-gray-600">
60+
*전문가 대면 멘토링 평균 약 30만 원 수준에서 구조 개선을 통해 최대
61+
약 4.9만 원대까지 절감했습니다.
62+
</p>
63+
<p className="ds-text text-center font-normal text-gray-600">
64+
*전문가 대면 멘토링 평균 비용은 1시간 기준 일반적인 시장 시세를
65+
참고하였습니다.
66+
</p>
67+
</div>
68+
</div>
69+
</div>
70+
);
71+
};
72+
73+
export default LandingPaySection;

src/app/_components/landing/LandingRelation.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,6 @@ const LandingRelation = () => {
3939

4040
return (
4141
<div>
42-
<Image
43-
src="/images/landing/landing_final.png"
44-
alt="랜딩 관련기관"
45-
width={1440}
46-
height={420}
47-
className="w-full"
48-
priority
49-
/>
50-
5142
<div className="mt-[119px] flex w-full flex-col bg-white px-[132px] pb-[235px]">
5243
<div className="text-[42px] leading-[150%] font-bold tracking-[-0.84px] text-gray-900">
5344
관련 기관
@@ -79,6 +70,15 @@ const LandingRelation = () => {
7970
))}
8071
</ul>
8172
</div>
73+
74+
<Image
75+
src="/images/landing/landing_final.png"
76+
alt="랜딩 관련기관"
77+
width={1440}
78+
height={420}
79+
className="w-full"
80+
priority
81+
/>
8282
</div>
8383
);
8484
};

src/app/expert/components/ExpertCard.tsx

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,31 @@
11
'use client';
2-
import React, { useMemo, useState } from 'react';
2+
import { useMemo, useState } from 'react';
33
import ExpertTab from './ExpertTab';
4-
import { useGetExpert, useGetFeedBackExpert } from '@/hooks/queries/useExpert';
4+
import { useGetExpert } from '@/hooks/queries/useExpert';
55
import { adaptMentor, MentorProps } from '@/types/expert/expert.props';
66
import MentorCard from './MentorCard';
7-
import { useBusinessStore } from '@/store/business.store';
87
import { TAB_LABELS, TabLabel } from '@/types/expert/label';
98

109
const ExpertCard = () => {
1110
const tabs = ['전체', ...TAB_LABELS];
1211
const [activeTab, setActiveTab] = useState('전체');
1312

14-
const businessPlanId = useBusinessStore((s) => s.planId);
15-
const id = businessPlanId ?? undefined;
16-
1713
const { data: experts = [], isLoading: expertsLoading } = useGetExpert();
18-
const { data: feedback, isLoading: feedbackLoading } = useGetFeedBackExpert(
19-
id,
20-
{ enabled: id !== undefined }
21-
);
22-
23-
const expertsApply = useMemo(
24-
() => new Set<number>((feedback?.data ?? []).map(Number)),
25-
[feedback]
26-
);
2714

2815
const list = useMemo(() => {
2916
return experts.map((e) => {
3017
const mentor = adaptMentor(e);
31-
const status: MentorProps['status'] = expertsApply.has(Number(e.id))
32-
? 'done'
33-
: 'active';
18+
const status: MentorProps['status'] = 'active';
3419
return { ...mentor, status };
3520
});
36-
}, [experts, expertsApply]);
21+
}, [experts]);
3722

3823
const filtered =
3924
activeTab === '전체'
4025
? list
4126
: list.filter((m) => m.categories.includes(activeTab as TabLabel));
4227

43-
if (expertsLoading || feedbackLoading) {
28+
if (expertsLoading) {
4429
return (
4530
<div className="ds-subtext mt-10 text-center text-gray-600">로딩 중</div>
4631
);

0 commit comments

Comments
 (0)