import React, { useState, useEffect } from 'react'; import { Button, Paper, Group, NumberInput } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import FirstPageIcon from '@mui/icons-material/FirstPage'; import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; import LastPageIcon from '@mui/icons-material/LastPage'; import DescriptionIcon from '@mui/icons-material/Description'; import ViewWeekIcon from '@mui/icons-material/ViewWeek'; interface PdfViewerToolbarProps { // Page navigation props (placeholders for now) currentPage?: number; totalPages?: number; onPageChange?: (page: number) => void; // Dual page toggle (placeholder for now) dualPage?: boolean; onDualPageToggle?: () => void; // Zoom controls (will connect to window.embedPdfZoom) currentZoom?: number; } export function PdfViewerToolbar({ currentPage = 1, totalPages = 1, onPageChange, dualPage = false, onDualPageToggle, currentZoom = 100, }: PdfViewerToolbarProps) { const { t } = useTranslation(); const [pageInput, setPageInput] = useState(currentPage); const [dynamicZoom, setDynamicZoom] = useState(currentZoom); const [dynamicPage, setDynamicPage] = useState(currentPage); const [dynamicTotalPages, setDynamicTotalPages] = useState(totalPages); // Update zoom and scroll state from EmbedPDF APIs useEffect(() => { const updateState = () => { // Update zoom if ((window as any).embedPdfZoom) { const zoomPercent = (window as any).embedPdfZoom.zoomPercent || currentZoom; setDynamicZoom(zoomPercent); } // Update scroll/page state if ((window as any).embedPdfScroll) { const currentPageNum = (window as any).embedPdfScroll.currentPage || currentPage; const totalPagesNum = (window as any).embedPdfScroll.totalPages || totalPages; setDynamicPage(currentPageNum); setDynamicTotalPages(totalPagesNum); setPageInput(currentPageNum); } }; // Update state immediately updateState(); // Set up periodic updates to keep state in sync const interval = setInterval(updateState, 200); return () => clearInterval(interval); }, [currentZoom, currentPage, totalPages]); const handleZoomOut = () => { if ((window as any).embedPdfZoom) { (window as any).embedPdfZoom.zoomOut(); } }; const handleZoomIn = () => { if ((window as any).embedPdfZoom) { (window as any).embedPdfZoom.zoomIn(); } }; const handlePageNavigation = (page: number) => { if ((window as any).embedPdfScroll) { (window as any).embedPdfScroll.scrollToPage(page); } else if (onPageChange) { onPageChange(page); } setPageInput(page); }; const handleFirstPage = () => { if ((window as any).embedPdfScroll) { (window as any).embedPdfScroll.scrollToFirstPage(); } else { handlePageNavigation(1); } }; const handlePreviousPage = () => { if ((window as any).embedPdfScroll) { (window as any).embedPdfScroll.scrollToPreviousPage(); } else { handlePageNavigation(Math.max(1, dynamicPage - 1)); } }; const handleNextPage = () => { if ((window as any).embedPdfScroll) { (window as any).embedPdfScroll.scrollToNextPage(); } else { handlePageNavigation(Math.min(dynamicTotalPages, dynamicPage + 1)); } }; const handleLastPage = () => { if ((window as any).embedPdfScroll) { (window as any).embedPdfScroll.scrollToLastPage(); } else { handlePageNavigation(dynamicTotalPages); } }; return ( {/* First Page Button */} {/* Previous Page Button */} {/* Page Input */} { const page = Number(value); setPageInput(page); if (!isNaN(page) && page >= 1 && page <= dynamicTotalPages) { handlePageNavigation(page); } }} min={1} max={dynamicTotalPages} hideControls styles={{ input: { width: 48, textAlign: "center", fontWeight: 500, fontSize: 16 }, }} /> / {dynamicTotalPages} {/* Next Page Button */} {/* Last Page Button */} {/* Dual Page Toggle */} {/* Zoom Controls */} {dynamicZoom}% ); }