From cad50d4d625cec610bc3985db95a5025cc044157 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Mon, 10 Nov 2025 17:42:02 +0900 Subject: (김준회) 기본계약문서관리: pdftron이 보여줄 템플릿 파일을 못찾았을 경우의 폴백 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/basic-contract-template-viewer.tsx | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'lib/basic-contract/template/basic-contract-template-viewer.tsx') diff --git a/lib/basic-contract/template/basic-contract-template-viewer.tsx b/lib/basic-contract/template/basic-contract-template-viewer.tsx index 38438d33..59273dca 100644 --- a/lib/basic-contract/template/basic-contract-template-viewer.tsx +++ b/lib/basic-contract/template/basic-contract-template-viewer.tsx @@ -17,6 +17,7 @@ interface BasicContractTemplateViewerProps { instance: WebViewerInstance | null; setInstance: Dispatch>; onSignatureFieldFound?: (searchText: string) => void; // 서명란 발견 시 콜백 + onLoadError?: (error: Error) => void; // 파일 로드 실패 시 콜백 } // 서명란 텍스트 찾기 함수 (변수 추가를 위해 사용) - 모든 서명란 텍스트를 찾아서 반환 @@ -77,8 +78,10 @@ export function BasicContractTemplateViewer({ instance, setInstance, onSignatureFieldFound, + onLoadError, }: BasicContractTemplateViewerProps) { const [fileLoading, setFileLoading] = useState(true); + const [hasError, setHasError] = useState(false); const viewer = useRef(null); const initialized = useRef(false); const isCancelled = useRef(false); @@ -234,6 +237,8 @@ export function BasicContractTemplateViewer({ // 한글 지원 Office 문서 로드 const loadDocument = async (instance: WebViewerInstance, documentPath: string) => { setFileLoading(true); + setHasError(false); + try { // 절대 URL로 변환 const fullPath = documentPath.startsWith('http') @@ -246,6 +251,21 @@ export function BasicContractTemplateViewer({ console.log("📄 한글 지원 Office 문서 로드 시작:", fullPath); console.log("📎 파일명:", fileName); + // 파일 존재 여부 먼저 확인 + try { + const response = await fetch(fullPath, { method: 'HEAD' }); + if (!response.ok) { + throw new Error(`파일을 찾을 수 없습니다 (${response.status})`); + } + } catch (fetchError) { + const error = new Error('파일이 존재하지 않거나 접근할 수 없습니다.'); + setHasError(true); + if (onLoadError) { + onLoadError(error); + } + throw error; + } + // PDFTron 공식 방법: instance.UI.loadDocument() + 한글 지원 옵션 await instance.UI.loadDocument(fullPath, { filename: fileName, @@ -283,7 +303,14 @@ export function BasicContractTemplateViewer({ } catch (err) { console.error("❌ Office 문서 로딩 중 오류:", err); - toast.error(`Office 문서 로드 실패: ${err instanceof Error ? err.message : '알 수 없는 오류'}`); + const errorMessage = err instanceof Error ? err.message : '알 수 없는 오류'; + + setHasError(true); + if (onLoadError) { + onLoadError(err instanceof Error ? err : new Error(errorMessage)); + } + + toast.error(`Office 문서 로드 실패: ${errorMessage}`); } finally { setFileLoading(false); } @@ -301,7 +328,7 @@ export function BasicContractTemplateViewer({ contain: 'layout style paint', // CSS containment로 격리 }} > - {fileLoading && ( + {fileLoading && !hasError && (

문서 로딩 중...

-- cgit v1.2.3