From 1fe5e289ac116a64b4bb5b34530ad768162f4cac Mon Sep 17 00:00:00 2001 From: jmj Date: Wed, 3 Jun 2026 11:34:39 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(interview):=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=ED=8C=A8=EB=84=90=EC=97=90=EC=84=9C=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=20=EB=B3=B4=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 세션 종료 패널이 sessionId 를 받지 못해 COMPLETED 상태에서도 피드백 화면으로 이동할 수 없었음(워크스페이스 링크만). 라이브 중 WS 자동 리다이렉트가 놓치면 막다른 길. - SessionEndedPanel: sessionId prop 추가 + COMPLETED 시 /sessions/:id/feedback 로 가는 "피드백 보기" 버튼 노출 - LiveInterview: SessionEndedPanel 에 sessionId 전달 Co-Authored-By: Claude Opus 4.8 --- .../interview/ui/live/LiveInterview.tsx | 2 +- .../interview/ui/live/SessionEndedPanel.tsx | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/frontend/src/features/interview/ui/live/LiveInterview.tsx b/frontend/src/features/interview/ui/live/LiveInterview.tsx index 358438fe..78b5aa44 100644 --- a/frontend/src/features/interview/ui/live/LiveInterview.tsx +++ b/frontend/src/features/interview/ui/live/LiveInterview.tsx @@ -22,7 +22,7 @@ export function LiveInterview({ sessionId }: { sessionId: number }) { return } if (status !== 'IN_PROGRESS') { - return + return } const awaitingQuestion = turn === 'WAITING_FOR_QUESTION' diff --git a/frontend/src/features/interview/ui/live/SessionEndedPanel.tsx b/frontend/src/features/interview/ui/live/SessionEndedPanel.tsx index 7823b5d7..8824ff3f 100644 --- a/frontend/src/features/interview/ui/live/SessionEndedPanel.tsx +++ b/frontend/src/features/interview/ui/live/SessionEndedPanel.tsx @@ -8,13 +8,26 @@ const messageByStatus: Partial> = { CANCELLED: '면접이 취소되었습니다.', } -export function SessionEndedPanel({ status }: { status: SessionStatus }) { +export function SessionEndedPanel({ + status, + sessionId, +}: { + status: SessionStatus + sessionId: number +}) { return (

{messageByStatus[status] ?? '면접이 종료되었습니다.'}

- - - +
+ {status === 'COMPLETED' && ( + + + + )} + + + +
) } From bc339428ce6d72bfe6ae604daf4faf16a8ff07a8 Mon Sep 17 00:00:00 2001 From: jmj Date: Wed, 3 Jun 2026 11:39:15 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix(site-nav):=20=EC=84=B9=EC=85=98=20?= =?UTF-8?q?=EC=95=B5=EC=BB=A4=EB=A5=BC=20=ED=99=88=20=EC=A0=88=EB=8C=80?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EB=A1=9C=20+=20=ED=99=88=EC=97=90=EC=84=9C?= =?UTF-8?q?=20hash=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 네비바는 모든 페이지에 렌더되는데 Services/About/FAQ/로고가 인페이지 앵커(#services 등)라 홈이 아닌 페이지에서 누르면 URL 에 # 만 붙고 동작하지 않았음. - SiteNav: 섹션 링크·로고를 Link to="/#services" 등 홈 절대경로로 - HomePage: useLocation().hash 기반 scrollIntoView effect 추가 (클라이언트 이동·풀 리로드 모두에서 해당 섹션으로 스크롤) Co-Authored-By: Claude Opus 4.8 --- frontend/src/pages/Home/ui/HomePage.tsx | 19 +++++++++++++++++++ frontend/src/widgets/site-nav/ui/SiteNav.tsx | 20 ++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/frontend/src/pages/Home/ui/HomePage.tsx b/frontend/src/pages/Home/ui/HomePage.tsx index d58bccd4..9f059179 100644 --- a/frontend/src/pages/Home/ui/HomePage.tsx +++ b/frontend/src/pages/Home/ui/HomePage.tsx @@ -1,3 +1,5 @@ +import { useEffect } from 'react' +import { useLocation } from 'react-router-dom' import { SiteNav } from '@/widgets/site-nav' import { HomeHero } from '@/widgets/home-hero' import { HomeServices } from '@/widgets/home-services' @@ -7,6 +9,23 @@ import { HomeCta } from '@/widgets/home-cta' import { SiteFooter } from '@/widgets/site-footer' export default function HomePage() { + const { hash } = useLocation() + + // 다른 페이지 또는 풀 리로드로 진입할 때 #section 으로 스크롤. + // (라우터는 hash 스크롤을 보장하지 않고, 풀 리로드 시 엘리먼트가 + // 아직 마운트 전이라 브라우저 기본 스크롤이 빗나감) + useEffect(() => { + const id = hash.replace('#', '') + if (!id) { + window.scrollTo({ top: 0 }) + return + } + const raf = requestAnimationFrame(() => { + document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }) + }) + return () => cancelAnimationFrame(raf) + }, [hash]) + return (
diff --git a/frontend/src/widgets/site-nav/ui/SiteNav.tsx b/frontend/src/widgets/site-nav/ui/SiteNav.tsx index 37d8c096..de6b7d68 100644 --- a/frontend/src/widgets/site-nav/ui/SiteNav.tsx +++ b/frontend/src/widgets/site-nav/ui/SiteNav.tsx @@ -3,9 +3,9 @@ import { Link } from 'react-router-dom' import { useAuth, useLogout } from '@/features/auth' const items = [ - { href: '#services', label: 'Services' }, - { href: '#quote', label: 'About' }, - { href: '#faq', label: 'FAQ' }, + { to: '/#services', label: 'Services' }, + { to: '/#quote', label: 'About' }, + { to: '/#faq', label: 'FAQ' }, ] export function SiteNav() { @@ -31,22 +31,22 @@ export function SiteNav() { style={{ zIndex: 'var(--z-sticky)' }} >
- Stack Up - +