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<SetStateAction<WebViewerInstance | null>>;
   onSignatureFieldFound?: (searchText: string) => void; // 서명란 발견 시 콜백
+  onLoadError?: (error: Error) => void; // 파일 로드 실패 시 콜백
 }
 
 // 서명란 텍스트 찾기 함수 (변수 추가를 위해 사용) - 모든 서명란 텍스트를 찾아서 반환
@@ -77,8 +78,10 @@ export function BasicContractTemplateViewer({
   instance,
   setInstance,
   onSignatureFieldFound,
+  onLoadError,
 }: BasicContractTemplateViewerProps) {
   const [fileLoading, setFileLoading] = useState<boolean>(true);
+  const [hasError, setHasError] = useState<boolean>(false);
   const viewer = useRef<HTMLDivElement>(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 && (
           <div className="absolute inset-0 flex flex-col items-center justify-center bg-white bg-opacity-90 z-10">
             <Loader2 className="h-8 w-8 text-blue-500 animate-spin mb-4" />
             <p className="text-sm text-muted-foreground">문서 로딩 중...</p>
-- 
cgit v1.2.3

