feat: 에러 처리 개선 + 커스텀 확인 모달 + 관리자 테스트

- 에러 코드 기반 한국어 매핑 (8개 코드, parseError 개선)
- window.confirm → 커스텀 ConfirmDialog (다크 테마, Promise 기반)
- launch URL 파라미터 ticket → token 통일
- 관리자 테스트 27개 추가 (공지사항 12 + 다운로드 6 + 유저 9)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-18 16:44:04 +09:00
parent 24cbc54a96
commit eaa3319c5d
14 changed files with 597 additions and 12 deletions

View File

@@ -0,0 +1,46 @@
import { useState, useCallback, useMemo, useRef } from 'react';
import { ConfirmContext } from './confirmContextValue';
import './Confirm.css';
export function ConfirmProvider({ children }) {
const [dialog, setDialog] = useState(null);
const resolveRef = useRef(null);
const confirm = useCallback((message) => {
return new Promise((resolve) => {
resolveRef.current = resolve;
setDialog({ message });
});
}, []);
const handleConfirm = useCallback(() => {
resolveRef.current?.(true);
resolveRef.current = null;
setDialog(null);
}, []);
const handleCancel = useCallback(() => {
resolveRef.current?.(false);
resolveRef.current = null;
setDialog(null);
}, []);
const value = useMemo(() => confirm, [confirm]);
return (
<ConfirmContext.Provider value={value}>
{children}
{dialog && (
<div className="confirm-overlay" onClick={handleCancel}>
<div className="confirm-dialog" role="alertdialog" aria-modal="true" aria-label={dialog.message} onClick={(e) => e.stopPropagation()}>
<p className="confirm-message">{dialog.message}</p>
<div className="confirm-actions">
<button className="confirm-btn confirm-btn-cancel" onClick={handleCancel}>취소</button>
<button className="confirm-btn confirm-btn-ok" onClick={handleConfirm} autoFocus>확인</button>
</div>
</div>
</div>
)}
</ConfirmContext.Provider>
);
}