diff options
Diffstat (limited to 'lib/basic-contract/template/basic-contract-template-viewer.tsx')
| -rw-r--r-- | lib/basic-contract/template/basic-contract-template-viewer.tsx | 31 |
1 files changed, 29 insertions, 2 deletions
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> |
