react-ipdf-viewer-lite
Version:
A lightweight, dependency-free media viewer for PDFs and other media types with advanced controls
91 lines (90 loc) • 3.94 kB
JavaScript
import { useState, useCallback, useEffect } from "react";
export var useViewerControls = function (initialZoom, onDownload, initialTheme, onPrint, rotateValue) {
if (initialZoom === void 0) { initialZoom = 1; }
if (initialTheme === void 0) { initialTheme = "light"; }
if (rotateValue === void 0) { rotateValue = 0; }
var _a = useState(initialZoom), zoom = _a[0], setZoom = _a[1];
var _b = useState(rotateValue), rotation = _b[0], setRotation = _b[1];
var _c = useState(false), isFullscreen = _c[0], setIsFullscreen = _c[1];
var _d = useState(initialTheme), currentTheme = _d[0], setCurrentTheme = _d[1];
// Zoom controls
var zoomIn = useCallback(function () {
setZoom(function (prev) { return Math.min(prev + 0.25, 3); }); // Cap at 3x zoom
}, []);
var zoomOut = useCallback(function () {
setZoom(function (prev) { return Math.max(prev - 0.25, 0.5); }); // Floor at 0.5x zoom
}, []);
// Rotation control (fixed for negative values)
// const rotate = useCallback((degrees: number) => {
// setRotation(prev => (prev + degrees + 360) % 360);
// }, []);
// Reset to initial state
var reset = useCallback(function () {
setZoom(initialZoom);
setRotation(0);
}, [initialZoom]);
// File operations
var download = useCallback(function () {
onDownload === null || onDownload === void 0 ? void 0 : onDownload();
}, [onDownload]);
var print = useCallback(function () {
onPrint === null || onPrint === void 0 ? void 0 : onPrint();
}, [onPrint]);
// Fullscreen handling with event listeners
var handleFullscreenChange = useCallback(function () {
setIsFullscreen(!!document.fullscreenElement);
}, []);
useEffect(function () {
document.addEventListener("fullscreenchange", handleFullscreenChange);
return function () {
document.removeEventListener("fullscreenchange", handleFullscreenChange);
};
}, [handleFullscreenChange]);
var enterFullscreen = useCallback(function () {
var _a, _b;
(_b = (_a = document.documentElement).requestFullscreen) === null || _b === void 0 ? void 0 : _b.call(_a).then(function () { return setIsFullscreen(true); }).catch(console.error);
}, []);
var exitFullscreen = useCallback(function () {
var _a;
(_a = document
.exitFullscreen) === null || _a === void 0 ? void 0 : _a.call(document).then(function () { return setIsFullscreen(false); }).catch(console.error);
}, []);
// Theme management
var toggleTheme = useCallback(function () {
setCurrentTheme(function (prev) {
var newTheme = prev === "light" ? "dark" : "light";
document.documentElement.setAttribute("data-theme", newTheme);
return newTheme;
});
}, []);
// const rotate = useCallback(() => {
// setRotation(prev => (prev + 90));
// }, [rotateValue]);
var rotateLeft = useCallback(function () {
setRotation(function (prev) { return prev - 90; });
}, [rotateValue]);
var rotateRight = useCallback(function () {
setRotation(function (prev) { return prev + 90; });
}, [rotateValue]);
// Initialize theme
useEffect(function () {
document.documentElement.setAttribute("data-theme", initialTheme);
}, [initialTheme]);
return {
zoom: zoom,
rotation: rotation,
isFullscreen: isFullscreen,
currentTheme: currentTheme,
zoomIn: zoomIn,
zoomOut: zoomOut,
// rotate
rotateRight: rotateRight,
rotateLeft: rotateLeft,
reset: reset,
download: download,
print: print,
enterFullscreen: enterFullscreen,
exitFullscreen: exitFullscreen,
toggleTheme: toggleTheme,
};
};