From 7b3865645079ead7f8aad0408ead2d9ec5bfdf66 Mon Sep 17 00:00:00 2001 From: minnngo Date: Fri, 31 Jul 2026 23:23:29 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20=EA=B2=B0=EA=B3=BC=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=20=EC=A4=91=20=ED=97=A4=EB=8D=94=20=EC=88=98=EC=A0=95=20[#122]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResumeAnalysisLoadingPageClient.tsx | 39 +++++++++++++++++++ .../mockApply/ResumeAnalysisLoading.tsx | 11 +++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/jobdri/src/app/mockApply/[mockApplyId]/result/resume-analysis-loading/ResumeAnalysisLoadingPageClient.tsx b/jobdri/src/app/mockApply/[mockApplyId]/result/resume-analysis-loading/ResumeAnalysisLoadingPageClient.tsx index 8099462..3440c05 100644 --- a/jobdri/src/app/mockApply/[mockApplyId]/result/resume-analysis-loading/ResumeAnalysisLoadingPageClient.tsx +++ b/jobdri/src/app/mockApply/[mockApplyId]/result/resume-analysis-loading/ResumeAnalysisLoadingPageClient.tsx @@ -10,6 +10,7 @@ import { fetchAnalysisTaskStatus, subscribeAnalysisTaskStream, } from "@/lib/api/result"; +import { fetchMockApplyJobPosting } from "@/lib/api/mockApplies"; const RESUME_ANALYSIS_LOADING_DURATION_MS = 316_000; const ANALYSIS_POLL_INTERVAL_MS = 2_500; @@ -60,6 +61,10 @@ export default function ResumeAnalysisLoadingPageClient({ const mockApplyId = Number(params.mockApplyId); const isValidMockApplyId = Number.isInteger(mockApplyId) && mockApplyId > 0; const [pollingRetryKey, setPollingRetryKey] = useState(0); + const [jobPostingHeader, setJobPostingHeader] = useState({ + companyName: "", + jobTitle: "", + }); const [errorMessage, setErrorMessage] = useState( isError ? `응답 대기 시간이 길어져 작업을 멈췄어요.\n소모된 크레딧이 복구됐어요.` @@ -100,6 +105,38 @@ export default function ResumeAnalysisLoadingPageClient({ router.replace(`/mockApply/${mockApplyId}${jobPostingQuery}`); }, [jobPostingId, mockApplyId, router]); + useEffect(() => { + if (!isValidMockApplyId) { + return; + } + + let ignore = false; + + const loadJobPostingHeader = async () => { + try { + const jobPosting = await fetchMockApplyJobPosting(mockApplyId); + + if (!ignore) { + setJobPostingHeader({ + companyName: jobPosting.companyName, + jobTitle: + jobPosting.jobTitle || jobPosting.detailClassificationName || "", + }); + } + } catch (error) { + if (!ignore) { + console.error("채용 공고 정보를 불러오지 못했습니다.", error); + } + } + }; + + void loadJobPostingHeader(); + + return () => { + ignore = true; + }; + }, [isValidMockApplyId, mockApplyId]); + useEffect(() => { if (isError || !isValidMockApplyId) { return; @@ -282,6 +319,8 @@ export default function ResumeAnalysisLoadingPageClient({ durationMs={RESUME_ANALYSIS_LOADING_DURATION_MS} onBack={moveBackToResume} applicationLabel={applicationLabel} + companyName={jobPostingHeader.companyName} + jobTitle={jobPostingHeader.jobTitle} /> {errorMessage && ( diff --git a/jobdri/src/components/mockApply/ResumeAnalysisLoading.tsx b/jobdri/src/components/mockApply/ResumeAnalysisLoading.tsx index ecfa710..8aace9b 100644 --- a/jobdri/src/components/mockApply/ResumeAnalysisLoading.tsx +++ b/jobdri/src/components/mockApply/ResumeAnalysisLoading.tsx @@ -14,6 +14,8 @@ interface ResumeAnalysisLoadingProps { onBack?: () => void; onComplete?: () => void; applicationLabel?: string; + companyName?: string; + jobTitle?: string; isFailed?: boolean; onErrorConfirm?: () => void; } @@ -34,6 +36,8 @@ export default function ResumeAnalysisLoading({ onBack, onComplete, applicationLabel, + companyName = "", + jobTitle = "", isFailed = false, }: ResumeAnalysisLoadingProps) { const initialRemainingSeconds = Math.max(1, Math.ceil(durationMs / 1000)); @@ -102,7 +106,12 @@ export default function ResumeAnalysisLoading({ return (
-
+