'use client' import { useState, useRef, useCallback, useEffect } from 'react' interface DocumentViewerProps { fileUrl: string fileType: 'pdf' | 'image' currentPage: number totalPages: number onPageChange: (page: number) => void children?: React.ReactNode // For annotation overlay className?: string } export function DocumentViewer({ fileUrl, fileType, currentPage, totalPages, onPageChange, children, className = '', }: DocumentViewerProps) { const [zoom, setZoom] = useState(1) const [isDragging, setIsDragging] = useState(false) const [position, setPosition] = useState({ x: 0, y: 0 }) const [startPos, setStartPos] = useState({ x: 0, y: 0 }) const containerRef = useRef(null) const handleZoomIn = () => setZoom((prev) => Math.min(prev + 0.25, 3)) const handleZoomOut = () => setZoom((prev) => Math.max(prev - 0.25, 0.5)) const handleFit = () => { setZoom(1) setPosition({ x: 0, y: 0 }) } const handleMouseDown = (e: React.MouseEvent) => { if (e.button !== 1 && !e.ctrlKey) return // Middle click or Ctrl+click for pan setIsDragging(true) setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y }) } const handleMouseMove = useCallback( (e: MouseEvent) => { if (!isDragging) return setPosition({ x: e.clientX - startPos.x, y: e.clientY - startPos.y, }) }, [isDragging, startPos] ) const handleMouseUp = useCallback(() => { setIsDragging(false) }, []) useEffect(() => { if (isDragging) { window.addEventListener('mousemove', handleMouseMove) window.addEventListener('mouseup', handleMouseUp) } return () => { window.removeEventListener('mousemove', handleMouseMove) window.removeEventListener('mouseup', handleMouseUp) } }, [isDragging, handleMouseMove, handleMouseUp]) // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === '+' || e.key === '=') { e.preventDefault() handleZoomIn() } else if (e.key === '-') { e.preventDefault() handleZoomOut() } else if (e.key === '0') { e.preventDefault() handleFit() } else if (e.key === 'ArrowLeft' && currentPage > 1) { e.preventDefault() onPageChange(currentPage - 1) } else if (e.key === 'ArrowRight' && currentPage < totalPages) { e.preventDefault() onPageChange(currentPage + 1) } } window.addEventListener('keydown', handleKeyDown) return () => window.removeEventListener('keydown', handleKeyDown) }, [currentPage, totalPages, onPageChange]) return (
{/* Toolbar */}
{Math.round(zoom * 100)}%
{/* Page Navigation */} {totalPages > 1 && (
{currentPage} / {totalPages}
)}
{/* Document Area */}
{/* Document Image/PDF */}
{fileType === 'image' ? ( Schuelerarbeit ) : (