summaryrefslogtreecommitdiff
path: root/lib/basic-contract/template/basic-contract-template-viewer.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/basic-contract/template/basic-contract-template-viewer.tsx')
-rw-r--r--lib/basic-contract/template/basic-contract-template-viewer.tsx31
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>