fix(WEB): 알림 폴링 시 인증 에러 처리 및 토큰 자동 갱신

- ApiResponse 타입에 authError 플래그 추가
- today-issue.ts에 인증 에러 감지 로직 추가
- AuthenticatedLayout에서 authError 시 토큰 갱신 후 재시도
- 토큰 갱신 실패 시 폴링 중지하여 반복 에러 방지
This commit is contained in:
2026-01-22 19:51:24 +09:00
parent 390c1a8450
commit 14186d98c0
3 changed files with 102 additions and 6 deletions

View File

@@ -6,6 +6,7 @@
*/
import { apiClient } from './index';
import { AuthError } from './errors';
import type {
ApiResponse,
TodayIssueUnreadResponse,
@@ -13,6 +14,20 @@ import type {
TodayIssueMarkAllReadResponse,
} from '@/types/today-issue';
/**
* 인증 에러인지 확인
*/
function isAuthenticationError(error: unknown): boolean {
if (error instanceof AuthError) return true;
if (error && typeof error === 'object') {
const err = error as { status?: number; code?: string; message?: string };
if (err.status === 401) return true;
if (err.code === 'AUTH_ERROR') return true;
if (err.message?.includes('회원정보') || err.message?.includes('인증')) return true;
}
return false;
}
/**
* 읽지 않은 이슈 목록 조회 (헤더 알림용)
* @param limit 조회할 최대 항목 수 (기본 10)
@@ -26,7 +41,18 @@ export async function getUnreadTodayIssues(limit: number = 10): Promise<ApiRespo
return response;
} catch (error) {
console.error('[TodayIssue] getUnreadTodayIssues error:', error);
// 에러 시 빈 응답 반환 (UI에서 처리)
// 인증 에러인 경우 authError 플래그 설정
if (isAuthenticationError(error)) {
return {
success: false,
message: '인증이 만료되었습니다.',
data: { items: [], total: 0 },
authError: true,
};
}
// 일반 에러
return {
success: false,
message: '알림을 불러오는데 실패했습니다.',