feat(WEB): 헤더 바로가기 버튼 추가 및 종합분석 목데이터 적용

- 공용 헤더에 종합분석/품질인정심사 바로가기 버튼 추가 (데스크톱/모바일)
- 종합분석 페이지 목데이터 적용 (API 호출 비활성화)
- 로그인 페이지 기본 계정 설정
- QMS 필터/모달 컴포넌트 개선
- 메뉴 폴링 및 fetch-wrapper 유틸리티 개선

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2025-12-31 18:40:50 +09:00
parent d4e64c290c
commit 4b1a3abf05
9 changed files with 560 additions and 128 deletions

View File

@@ -31,6 +31,17 @@ async function setNewTokenCookies(tokens: {
path: '/',
maxAge: tokens.expiresIn || 7200,
});
// 🔔 토큰 갱신 신호 쿠키 설정 (클라이언트에서 감지용)
// HttpOnly: false로 설정하여 클라이언트에서 읽을 수 있게 함
cookieStore.set('token_refreshed_at', Date.now().toString(), {
httpOnly: false,
secure: isProduction,
sameSite: 'lax',
path: '/',
maxAge: 60, // 1분 후 자동 삭제
});
console.log('🔔 [setNewTokenCookies] token_refreshed_at 신호 쿠키 설정');
}
if (tokens.refreshToken) {
@@ -164,8 +175,15 @@ export async function serverFetch(
return { response, error: null };
} catch (error) {
// redirect()는 NEXT_REDIRECT 에러를 throw하므로 다시 throw
if (error instanceof Error && error.message === 'NEXT_REDIRECT') {
// Next.js 15: redirect()는 digest 프로퍼티를 가진 에러를 throw
// 이 에러는 다시 throw해서 Next.js가 처리하도록 해야 함
if (
error &&
typeof error === 'object' &&
'digest' in error &&
typeof (error as { digest: unknown }).digest === 'string' &&
(error as { digest: string }).digest.startsWith('NEXT_REDIRECT')
) {
throw error;
}
console.error(`[serverFetch] Network error: ${url}`, error);