"use client" import * as React from "react" import { useState, useRef, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { X, Loader2, AlertCircle } from "lucide-react" interface PDFTronViewerDialogProps { open: boolean onOpenChange: (open: boolean) => void fileUrl?: string fileName?: string } export function PDFTronViewerDialog({ open, onOpenChange, fileUrl, fileName }: PDFTronViewerDialogProps) { const viewerRef = useRef(null) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [instance, setInstance] = useState(null) // PDFTron WebViewer 초기화 const initializeViewer = async () => { if (!viewerRef.current || !fileUrl) return setIsLoading(true) setError(null) try { // @pdftron/webviewer 패키지에서 동적으로 import const { default: WebViewer } = await import("@pdftron/webviewer") const viewerInstance = await WebViewer({ path: '/pdftronWeb', licenseKey: process.env.NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY, fullAPI: false, enableFilePicker: false, enableRedaction: false, enableMeasurement: false, enableAnnotations: false, disabledElements: [ 'header', 'toolsHeader', 'searchButton', 'menuButton', 'viewControlsButton', 'selectToolButton', 'freeHandToolButton', 'textSelectButton', 'panToolButton', 'annotationCommentButton', 'leftPanel', 'leftPanelButton', 'notesPanelButton', 'searchPanel', 'thumbnailControl', 'outlineControl', 'contextMenuPopup', 'toolsOverlay', 'signatureModal', 'redactionModal', 'linkModal', 'filterModal', 'passwordModal', 'progressModal', 'errorModal', 'toolbarGroup-Annotate', 'toolbarGroup-Shapes', 'toolbarGroup-Edit', 'toolbarGroup-Insert', 'toolbarGroup-Forms', 'toolbarGroup-View', 'downloadButton', 'printButton', 'saveAsButton', 'textToolButton', 'stickyToolButton', 'calloutToolButton', 'rubberStampToolButton', 'stampToolButton', 'freeTextToolButton', 'toolsButton' ] }, viewerRef.current) setInstance(viewerInstance) // 문서 로드 if (fileUrl) { const { documentViewer } = viewerInstance.Core // 문서 로드 완료 후 읽기 전용 설정 documentViewer.addEventListener('documentLoaded', () => { setIsLoading(false) }) // 문서 로드 viewerInstance.UI.loadDocument(fileUrl) } else { setIsLoading(false) } } catch (err) { console.error('PDFTron 뷰어 초기화 실패:', err) setError('문서를 불러올 수 없습니다. PDFTron이 설치되어 있는지 확인해주세요.') setIsLoading(false) } } // 다이얼로그가 열릴 때 뷰어 초기화 useEffect(() => { if (open && fileUrl) { // 약간의 지연을 두어 DOM이 완전히 렌더링된 후 초기화 const timer = setTimeout(initializeViewer, 100) return () => clearTimeout(timer) } }, [open, fileUrl]) // 다이얼로그가 닫힐 때 정리 useEffect(() => { if (!open && instance) { try { // WebViewer 인스턴스 정리 if (viewerRef.current) { viewerRef.current.innerHTML = '' } setInstance(null) } catch (err) { console.error('뷰어 정리 실패:', err) } } }, [open, instance]) return (
{fileName || '문서 뷰어'} PDF 및 Office 문서를 읽기 전용으로 보기
{/* */}
{isLoading && (
문서를 불러오는 중...
)} {error && (

문서를 불러올 수 없습니다

{error}

)}
) }