fix(WEB): 토큰 만료 시 무한 로딩 대신 로그인 리다이렉트 처리

- 52개 이상의 컴포넌트에 isNextRedirectError 처리 추가
- Server Action의 redirect() 에러가 catch 블록에서 삼켜지는 문제 해결
- access_token + refresh_token 모두 만료 시 정상적으로 로그인 페이지로 리다이렉트

수정된 영역:
- accounting: 10개 컴포넌트
- production: 12개 컴포넌트
- hr: 5개 컴포넌트
- settings: 8개 컴포넌트
- approval: 5개 컴포넌트
- items: 20개+ 컴포넌트
- board: 5개 컴포넌트
- quality: 4개 컴포넌트
- material, outbound, quotes 등 기타 컴포넌트

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2026-01-11 17:19:11 +09:00
parent 8bc4b90fe9
commit e56b7d53a4
131 changed files with 3320 additions and 1979 deletions

View File

@@ -425,6 +425,29 @@ function ItemMasterDataManagementContent() {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const setNewPageItemTypeWrapper: React.Dispatch<React.SetStateAction<'FG' | 'PT' | 'SM' | 'RM' | 'CS'>> = setNewPageItemType as any;
// SectionTemplateDialog 카테고리 래퍼 (string | string[] → string[])
const handleSetNewSectionTemplateCategory = (category: string | string[]) => {
if (Array.isArray(category)) {
setNewSectionTemplateCategory(category);
} else {
setNewSectionTemplateCategory(category ? [category] : []);
}
};
// LoadTemplateDialog 선택 ID 래퍼 (string | number | null → string | null)
const handleSetSelectedTemplateId = (id: string | number | null) => {
if (id === null) {
setSelectedTemplateId(null);
} else {
setSelectedTemplateId(String(id));
}
};
// TemplateFieldDialog 선택 ID 래퍼 (string | number | null → string)
const handleSetTemplateFieldSelectedMasterFieldId = (id: string | number | null) => {
setTemplateFieldSelectedMasterFieldId(id === null ? '' : String(id));
};
// 초기 로딩 중 UI
if (isInitialLoading) {
return (
@@ -782,7 +805,7 @@ function ItemMasterDataManagementContent() {
newFieldDescription={newFieldDescription}
setNewFieldDescription={setNewFieldDescription}
newFieldOptions={newFieldOptions}
setNewFieldOptions={setNewFieldOptions}
setNewFieldOptions={setNewFieldOptions as (options: string | string[]) => void}
selectedSectionForField={selectedPage?.sections.find(s => s.id === selectedSectionForField) || null}
selectedPage={selectedPage || null}
itemMasterFields={itemMasterFields}
@@ -830,7 +853,7 @@ function ItemMasterDataManagementContent() {
newFieldDescription={newFieldDescription}
setNewFieldDescription={setNewFieldDescription}
newFieldOptions={newFieldOptions}
setNewFieldOptions={setNewFieldOptions}
setNewFieldOptions={setNewFieldOptions as (options: string | string[]) => void}
selectedSectionForField={selectedPage?.sections.find(s => s.id === selectedSectionForField) || null}
selectedPage={selectedPage || null}
itemMasterFields={itemMasterFields}
@@ -899,7 +922,7 @@ function ItemMasterDataManagementContent() {
newSectionTemplateDescription={newSectionTemplateDescription}
setNewSectionTemplateDescription={setNewSectionTemplateDescription}
newSectionTemplateCategory={newSectionTemplateCategory}
setNewSectionTemplateCategory={setNewSectionTemplateCategory}
setNewSectionTemplateCategory={handleSetNewSectionTemplateCategory}
newSectionTemplateType={newSectionTemplateType}
setNewSectionTemplateType={setNewSectionTemplateType}
handleUpdateSectionTemplate={handleUpdateSectionTemplate}
@@ -938,7 +961,7 @@ function ItemMasterDataManagementContent() {
showMasterFieldList={templateFieldShowMasterFieldList}
setShowMasterFieldList={setTemplateFieldShowMasterFieldList}
selectedMasterFieldId={templateFieldSelectedMasterFieldId}
setSelectedMasterFieldId={setTemplateFieldSelectedMasterFieldId}
setSelectedMasterFieldId={handleSetTemplateFieldSelectedMasterFieldId}
/>
<LoadTemplateDialog
@@ -946,7 +969,7 @@ function ItemMasterDataManagementContent() {
setIsLoadTemplateDialogOpen={setIsLoadTemplateDialogOpen}
sectionTemplates={sectionTemplates}
selectedTemplateId={selectedTemplateId}
setSelectedTemplateId={setSelectedTemplateId}
setSelectedTemplateId={handleSetSelectedTemplateId}
handleLoadTemplate={handleLoadTemplateWrapper}
/>