From 02184031c1d152bcbad573b4d539abfc3ffa60f1 Mon Sep 17 00:00:00 2001 From: mingo Date: Sat, 18 Jul 2026 01:12:29 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Feat:=20=EC=8A=A4=ED=81=AC=EB=A1=A4?= =?UTF-8?q?=EB=B0=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20[JDDEV-109]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jobdri/src/app/mockApply/job/loading/page.tsx | 6 +- jobdri/src/app/mockApply/job/review/page.tsx | 179 ++++++++++++++++++ .../components/common/lnb/LnbScrollbar.tsx | 30 ++- 3 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 jobdri/src/app/mockApply/job/review/page.tsx diff --git a/jobdri/src/app/mockApply/job/loading/page.tsx b/jobdri/src/app/mockApply/job/loading/page.tsx index 7f0a2b1..b655f53 100644 --- a/jobdri/src/app/mockApply/job/loading/page.tsx +++ b/jobdri/src/app/mockApply/job/loading/page.tsx @@ -115,12 +115,12 @@ export default function JobPostingLoadingPage() { return; } - const errorTimer = window.setTimeout(() => { - router.replace("/mockApply/job/create?analysisError=1"); + const completionTimer = window.setTimeout(() => { + router.replace("/mockApply/job/review"); }, loadingDurationMs); return () => { - window.clearTimeout(errorTimer); + window.clearTimeout(completionTimer); }; }, [loadingDurationMs, router, showStopConfirm]); diff --git a/jobdri/src/app/mockApply/job/review/page.tsx b/jobdri/src/app/mockApply/job/review/page.tsx new file mode 100644 index 0000000..d32036f --- /dev/null +++ b/jobdri/src/app/mockApply/job/review/page.tsx @@ -0,0 +1,179 @@ +"use client"; + +import type { ReactNode } from "react"; +import { useRouter } from "next/navigation"; +import Header from "@/components/common/header/Header"; +import SideHeaderContainer from "@/components/common/header/SideHeaderContainer"; +import { + LnbScrollbar, + lnbHiddenScrollbarClass, + useLnbScrollMetrics, +} from "@/components/common/lnb/LnbScrollbar"; +import { CtaFooter } from "@/components/common/cta"; +import { JDInput } from "@/components/common/input"; +import Avatar from "@/components/mockApply/home/Avatar"; + +const wizardSteps = [ + { label: "공고 확인" }, + { label: "자소서 입력" }, + { label: "첨삭 결과" }, +]; + +function SectionCard({ + title, + children, +}: { + title: string; + children: ReactNode; +}) { + return ( +
+
+

+ {title} +

+
+ +
+ {children} +
+
+ ); +} + +function JobProfileRow() { + return ( +
+
+
+ + 공고 프로필 + + +
+ + + 이 공고의 프로필 색상을 선택해 주세요. + +
+ +
+ +
+
+ ); +} + +export default function JobPostingReviewPage() { + const router = useRouter(); + const { scrollAreaRef, scrollbarMetrics, updateScrollbarMetrics } = + useLnbScrollMetrics(true, "job-posting-review", { trackPadding: 28 }); + + return ( +
+
+
+ +
+
+
+
+ } + className="shrink-0 self-stretch" + /> + +
+ + + + + + + + + + + + + + + + + +
+
+
+ +
+ + router.push("/mockApply/job/create"), + }} + nextAction={{ + label: "다음으로", + disabled: true, + }} + /> +
+
+ ); +} diff --git a/jobdri/src/components/common/lnb/LnbScrollbar.tsx b/jobdri/src/components/common/lnb/LnbScrollbar.tsx index b7bbece..9e06c40 100644 --- a/jobdri/src/components/common/lnb/LnbScrollbar.tsx +++ b/jobdri/src/components/common/lnb/LnbScrollbar.tsx @@ -15,11 +15,17 @@ interface LnbScrollbarMetrics { thumbTop: number; } +type LnbScrollbarSize = "s" | "l"; + export function useLnbScrollMetrics( isEnabled: boolean, recalculationKey: unknown, + options?: { + trackPadding?: number; + }, ) { const scrollAreaRef = useRef(null); + const trackPadding = options?.trackPadding ?? lnbScrollbarPadding; const [scrollbarMetrics, setScrollbarMetrics] = useState({ isScrollable: false, @@ -45,7 +51,7 @@ export function useLnbScrollMetrics( return; } - const trackHeight = Math.max(clientHeight - lnbScrollbarPadding, 0); + const trackHeight = Math.max(clientHeight - trackPadding, 0); const thumbHeight = Math.min( Math.max( (clientHeight / scrollHeight) * trackHeight, @@ -63,7 +69,7 @@ export function useLnbScrollMetrics( thumbHeight, thumbTop, }); - }, []); + }, [trackPadding]); useEffect(() => { if (!isEnabled) { @@ -110,26 +116,40 @@ export function useLnbScrollMetrics( export function LnbScrollbar({ metrics, + size = "s", className, }: { metrics: LnbScrollbarMetrics; + size?: LnbScrollbarSize; className?: string; }) { if (!metrics.isScrollable) { return null; } + const isLarge = size === "l"; + return (