import React, { useState, useEffect } from 'react'; import { Button, Paper, Group, NumberInput } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import { useViewer } from '../../contexts/ViewerContext'; 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'; import '../../types/embedPdf'; 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 (connected via ViewerContext) currentZoom?: number; } export function PdfViewerToolbar({ currentPage = 1, totalPages: _totalPages = 1, onPageChange, dualPage = false, onDualPageToggle, currentZoom: _currentZoom = 100, }: PdfViewerToolbarProps) { const { t } = useTranslation(); const { getScrollState, getZoomState, scrollActions, zoomActions, registerImmediateZoomUpdate, registerImmediateScrollUpdate } = useViewer(); const scrollState = getScrollState(); const zoomState = getZoomState(); const [pageInput, setPageInput] = useState(scrollState.currentPage || currentPage); const [displayZoomPercent, setDisplayZoomPercent] = useState(zoomState.zoomPercent || 140); // Register for immediate scroll updates and sync with actual scroll state useEffect(() => { registerImmediateScrollUpdate((currentPage, totalPages) => { setPageInput(currentPage); }); setPageInput(scrollState.currentPage); }, [registerImmediateScrollUpdate]); // Register for immediate zoom updates and sync with actual zoom state useEffect(() => { registerImmediateZoomUpdate(setDisplayZoomPercent); setDisplayZoomPercent(zoomState.zoomPercent || 140); }, [zoomState.zoomPercent, registerImmediateZoomUpdate]); const handleZoomOut = () => { zoomActions.zoomOut(); }; const handleZoomIn = () => { zoomActions.zoomIn(); }; const handlePageNavigation = (page: number) => { scrollActions.scrollToPage(page); if (onPageChange) { onPageChange(page); } setPageInput(page); }; const handleFirstPage = () => { scrollActions.scrollToFirstPage(); }; const handlePreviousPage = () => { scrollActions.scrollToPreviousPage(); }; const handleNextPage = () => { scrollActions.scrollToNextPage(); }; const handleLastPage = () => { scrollActions.scrollToLastPage(); }; return ( {/* First Page Button */} {/* Previous Page Button */} {/* Page Input */} { const page = Number(value); setPageInput(page); if (!isNaN(page) && page >= 1 && page <= scrollState.totalPages) { handlePageNavigation(page); } }} min={1} max={scrollState.totalPages} hideControls styles={{ input: { width: 48, textAlign: "center", fontWeight: 500, fontSize: 16 }, }} /> / {scrollState.totalPages} {/* Next Page Button */} {/* Last Page Button */} {/* Dual Page Toggle */} {/* Zoom Controls */} {displayZoomPercent}% ); }