@cyber-harbour/ui 2.1.11 → 2.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- 'use strict';var chunkBZYQS7OV_js=require('./chunk-BZYQS7OV.js'),react=require('react'),_=require('lodash.debounce'),reactPdf=require('react-pdf');require('react-pdf/dist/Page/AnnotationLayer.css'),require('react-pdf/dist/Page/TextLayer.css');var reactVirtuoso=require('react-virtuoso'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ___default=/*#__PURE__*/_interopDefault(_);var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(reactPdf.pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,be=chunkBZYQS7OV_js.a(({url:j})=>{let[s,U]=react.useState(0),[a,v]=react.useState(1),[M,D]=react.useState(true),[I,O]=react.useState(null),[h,z]=react.useState(P),[B,H]=react.useState(P),[i,L]=react.useState(1),[b,F]=react.useState(P),[E,$]=react.useState(ie),l=react.useRef(null),R=react.useRef(null),w=react.useRef(false),d=react.useRef(null),x=react.useRef(false),p=react.useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=react.useMemo(()=>___default.default((e,r=false)=>{p(e,r);},oe),[p]),W=react.useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=react.useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);react.useEffect(()=>{if(!l.current)return;let e=___default.default(()=>{l.current&&(z(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=react.useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=react.useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=react.useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=react.useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=react.useCallback(()=>{g(-1);},[g]),q=react.useCallback(()=>{g(1);},[g]),K=react.useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return react.useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),react.useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsxRuntime.jsx("div",{className:"text-red-500 text-center",children:jsxRuntime.jsx("p",{children:I})})}):jsxRuntime.jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full",children:jsxRuntime.jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxRuntime.jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxRuntime.jsxs("span",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsxRuntime.jsx(chunkBZYQS7OV_js.Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxRuntime.jsxs(chunkBZYQS7OV_js.ob,{py:5,px:8,children:[i*100,"%"]}),jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsxRuntime.jsx(chunkBZYQS7OV_js.ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsxRuntime.jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsxRuntime.jsx(reactPdf.Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsxRuntime.jsx(reactVirtuoso.Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsxRuntime.jsx("div",{className:"mx-auto w-fit mb-4",children:jsxRuntime.jsx(reactPdf.Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
- exports.PdfDriver=be;//# sourceMappingURL=PdfDriver-NPQFFUSQ.js.map
3
- //# sourceMappingURL=PdfDriver-NPQFFUSQ.js.map
1
+ 'use strict';var chunkMSAZ7WH2_js=require('./chunk-MSAZ7WH2.js'),react=require('react'),_=require('lodash.debounce'),reactPdf=require('react-pdf');require('react-pdf/dist/Page/AnnotationLayer.css'),require('react-pdf/dist/Page/TextLayer.css');var reactVirtuoso=require('react-virtuoso'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ___default=/*#__PURE__*/_interopDefault(_);var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(reactPdf.pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,be=chunkMSAZ7WH2_js.a(({url:j})=>{let[s,U]=react.useState(0),[a,v]=react.useState(1),[M,D]=react.useState(true),[I,O]=react.useState(null),[h,z]=react.useState(P),[B,H]=react.useState(P),[i,L]=react.useState(1),[b,F]=react.useState(P),[E,$]=react.useState(ie),l=react.useRef(null),R=react.useRef(null),w=react.useRef(false),d=react.useRef(null),x=react.useRef(false),p=react.useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=react.useMemo(()=>___default.default((e,r=false)=>{p(e,r);},oe),[p]),W=react.useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=react.useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);react.useEffect(()=>{if(!l.current)return;let e=___default.default(()=>{l.current&&(z(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=react.useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=react.useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=react.useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=react.useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=react.useCallback(()=>{g(-1);},[g]),q=react.useCallback(()=>{g(1);},[g]),K=react.useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return react.useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),react.useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsxRuntime.jsx("div",{className:"text-red-500 text-center",children:jsxRuntime.jsx("p",{children:I})})}):jsxRuntime.jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full",children:jsxRuntime.jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxRuntime.jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkMSAZ7WH2_js.z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxRuntime.jsxs("span",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsxRuntime.jsx(chunkMSAZ7WH2_js.z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkMSAZ7WH2_js.z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsxRuntime.jsx(chunkMSAZ7WH2_js.Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxRuntime.jsxs(chunkMSAZ7WH2_js.pb,{py:5,px:8,children:[i*100,"%"]}),jsxRuntime.jsx(chunkMSAZ7WH2_js.z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsxRuntime.jsx(chunkMSAZ7WH2_js.ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsxRuntime.jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsxRuntime.jsx(reactPdf.Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsxRuntime.jsx(reactVirtuoso.Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsxRuntime.jsx("div",{className:"mx-auto w-fit mb-4",children:jsxRuntime.jsx(reactPdf.Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
+ exports.PdfDriver=be;//# sourceMappingURL=PdfDriver-6UH5X6AL.js.map
3
+ //# sourceMappingURL=PdfDriver-6UH5X6AL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-NPQFFUSQ.js","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-6UH5X6AL.js","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}
@@ -1,3 +1,3 @@
1
- import {a,z,Pa,ob,ma}from'./chunk-F7QBTZ73.mjs';import {useState,useRef,useCallback,useMemo,useEffect}from'react';import _ from'lodash.debounce';import {pdfjs,Document,Page}from'react-pdf';import'react-pdf/dist/Page/AnnotationLayer.css';import'react-pdf/dist/Page/TextLayer.css';import {Virtuoso}from'react-virtuoso';import {jsx,jsxs}from'react/jsx-runtime';var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,he=a(({url:j})=>{let[s,U]=useState(0),[a,v]=useState(1),[M,D]=useState(true),[I,O]=useState(null),[h,z$1]=useState(P),[B,H]=useState(P),[i,L]=useState(1),[b,F]=useState(P),[E,$]=useState(ie),l=useRef(null),R=useRef(null),w=useRef(false),d=useRef(null),x=useRef(false),p=useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=useMemo(()=>_((e,r=false)=>{p(e,r);},oe),[p]),W=useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);useEffect(()=>{if(!l.current)return;let e=_(()=>{l.current&&(z$1(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=useCallback(()=>{g(-1);},[g]),q=useCallback(()=>{g(1);},[g]),K=useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsx("div",{className:"text-red-500 text-center",children:jsx("p",{children:I})})}):jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsx("div",{className:"flex items-center justify-center h-full",children:jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxs("span",{className:"flex items-center gap-2",children:[jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsx(z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsx(Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxs(ob,{py:5,px:8,children:[i*100,"%"]}),jsx(z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsx(ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsx(Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsx(Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsx("div",{className:"mx-auto w-fit mb-4",children:jsx(Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
- export{he as PdfDriver};//# sourceMappingURL=PdfDriver-6JQ3D3E6.mjs.map
3
- //# sourceMappingURL=PdfDriver-6JQ3D3E6.mjs.map
1
+ import {a,z,Pa,pb,ma}from'./chunk-TTMXYQDC.mjs';import {useState,useRef,useCallback,useMemo,useEffect}from'react';import _ from'lodash.debounce';import {pdfjs,Document,Page}from'react-pdf';import'react-pdf/dist/Page/AnnotationLayer.css';import'react-pdf/dist/Page/TextLayer.css';import {Virtuoso}from'react-virtuoso';import {jsx,jsxs}from'react/jsx-runtime';var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,he=a(({url:j})=>{let[s,U]=useState(0),[a,v]=useState(1),[M,D]=useState(true),[I,O]=useState(null),[h,z$1]=useState(P),[B,H]=useState(P),[i,L]=useState(1),[b,F]=useState(P),[E,$]=useState(ie),l=useRef(null),R=useRef(null),w=useRef(false),d=useRef(null),x=useRef(false),p=useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=useMemo(()=>_((e,r=false)=>{p(e,r);},oe),[p]),W=useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);useEffect(()=>{if(!l.current)return;let e=_(()=>{l.current&&(z$1(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=useCallback(()=>{g(-1);},[g]),q=useCallback(()=>{g(1);},[g]),K=useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsx("div",{className:"text-red-500 text-center",children:jsx("p",{children:I})})}):jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsx("div",{className:"flex items-center justify-center h-full",children:jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxs("span",{className:"flex items-center gap-2",children:[jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsx(z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsx(Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxs(pb,{py:5,px:8,children:[i*100,"%"]}),jsx(z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsx(ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsx(Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsx(Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsx("div",{className:"mx-auto w-fit mb-4",children:jsx(Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
+ export{he as PdfDriver};//# sourceMappingURL=PdfDriver-CRJ354FP.mjs.map
3
+ //# sourceMappingURL=PdfDriver-CRJ354FP.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"sWAQA,IAAMA,CAAW,CAAA,QAAA,CAGb,OAAO,MAAW,CAAA,GAAA,EAAe,OAAO,QAAA,CAAa,GACvDC,GAAAA,KAAAA,CAAM,oBAAoB,SAAY,CAAA,CAAA,EAAGD,CAAQ,CAAA,kBAAA,CAAA,CAAA,CAM7CE,IAAAA,EAAAA,CAA4B,IAC5BC,EAAuB,CAAA,GAAA,CACvBC,GAAwB,GACxBC,CAAAA,EAAAA,CAAoB,GACpBC,EAAmB,CAAA,KAAA,CACnBC,CAAmB,CAAA,GAAA,CAEZC,EAAsCC,CAAAA,CAAAA,CAAA,CAAC,CAAE,GAAA,CAAAC,CAAI,CAAA,GAAM,CAC9D,GAAM,CAACC,CAAUC,CAAAA,CAAW,CAAIC,CAAAA,QAAAA,CAAiB,CAAC,CAAA,CAC5C,CAACC,CAAYC,CAAAA,CAAa,CAAIF,CAAAA,QAAAA,CAAiB,CAAC,CAAA,CAChD,CAACG,CAASC,CAAAA,CAAU,CAAIJ,CAAAA,QAAAA,CAAkB,IAAI,CAAA,CAC9C,CAACK,CAAOC,CAAAA,CAAQ,CAAIN,CAAAA,QAAAA,CAAwB,IAAI,CAAA,CAChD,CAACO,CAAOC,CAAAA,GAAQ,CAAIR,CAAAA,QAAAA,CAAiBN,CAAgB,CAAA,CACrD,CAACe,CAAQC,CAAAA,CAAS,EAAIV,QAAiBN,CAAAA,CAAgB,EACvD,CAACiB,CAAAA,CAAOC,CAAQ,CAAA,CAAIZ,QAAS,CAAA,CAAC,EAC9B,CAACa,CAAAA,CAAmBC,CAAoB,CAAA,CAAId,QAASN,CAAAA,CAAgB,EACrE,CAACqB,CAAAA,CAAiBC,CAAkB,CAAA,CAAIhB,QAASP,CAAAA,EAAgB,EAEjEwB,CAAeC,CAAAA,MAAAA,CAAuB,IAAI,CAC1CC,CAAAA,CAAAA,CAAcD,OAAuB,IAAI,CAAA,CACzCE,CAAqBF,CAAAA,MAAAA,CAAgB,KAAK,CAAA,CAC1CG,EAAmBH,MAA8B,CAAA,IAAI,CACrDI,CAAAA,CAAAA,CAAeJ,MAAO,CAAA,KAAK,EAE3BK,CAAeC,CAAAA,WAAAA,CACnB,CAACC,CAAAA,CAAcC,CAAS,CAAA,IAAA,GAAS,CAC3BD,CAAO,CAAA,CAAA,EAAKA,EAAO3B,CAEvBsB,GAAAA,CAAAA,CAAmB,QAAU,IAC7BD,CAAAA,CAAAA,CAAY,OAAS,EAAA,aAAA,CAAc,CACjC,KAAA,CAAOM,EAAO,CACd,CAAA,KAAA,CAAO,OACP,CAAA,QAAA,CAAUC,CAAS,CAAA,QAAA,CAAW,MAChC,CAAC,CAAA,CAEGL,CAAiB,CAAA,OAAA,EACnB,YAAaA,CAAAA,CAAAA,CAAiB,OAAO,CAGvCA,CAAAA,CAAAA,CAAiB,OAAU,CAAA,UAAA,CAAW,IAAM,CACtCC,EAAa,OAASF,GAAAA,CAAAA,CAAmB,OAAU,CAAA,KAAA,EACzD,CAAG/B,CAAAA,EAAyB,GAC9B,CACA,CAAA,CAACS,CAAQ,CACX,CAEM6B,CAAAA,CAAAA,CAAkBC,QAAQ,IACvBC,CAAAA,CAAS,CAACJ,CAAAA,CAAcC,CAAS,CAAA,KAAA,GAAU,CAChDH,CAAaE,CAAAA,CAAAA,CAAMC,CAAM,EAC3B,CAAA,CAAGpC,EAAoB,CACtB,CAAA,CAACiC,CAAY,CAAC,CAEXO,CAAAA,CAAAA,CAAeN,YAAY,IAAM,CACrCZ,CAAUmB,CAAAA,CAAAA,EAAS,IAAK,CAAA,GAAA,CAAIA,EAAO,GAAM,CAAA,CAAC,CAAC,EAC7C,CAAG,CAAA,EAAE,CAECC,CAAAA,CAAAA,CAAgBR,YAAY,IAAM,CACtCZ,EAAUmB,CAAS,EAAA,IAAA,CAAK,GAAIA,CAAAA,CAAAA,CAAO,GAAM,CAAA,GAAI,CAAC,EAChD,CAAA,CAAG,EAAE,CAELE,CAAAA,SAAAA,CAAU,IAAM,CACd,GAAI,CAAChB,CAAAA,CAAa,OAAS,CAAA,OAC3B,IAAMiB,CAAaL,CAAAA,CAAAA,CAAS,IAAM,CAC5BZ,CAAAA,CAAa,UACfT,GAASS,CAAAA,CAAAA,CAAa,OAAQ,CAAA,WAAA,CAAczB,EAAiB,CAAA,CAC7DkB,EAAUO,CAAa,CAAA,OAAA,CAAQ,YAAY,CAAA,EAE/C,CAAG1B,CAAAA,EAAqB,EACxB2C,CAAW,EAAA,CACX,IAAMC,CAAAA,CAAW,IAAI,cAAA,CAAeD,CAAU,CAC9C,CAAA,OAAAC,CAAS,CAAA,OAAA,CAAQlB,CAAa,CAAA,OAAO,EAC9B,IAAM,CACXkB,CAAS,CAAA,UAAA,EACTD,CAAAA,CAAAA,CAAW,SACb,CACF,CAAG,CAAA,EAAE,CAAA,CAEL,IAAME,CAAUR,CAAAA,OAAAA,CACd,KAAO,CACL,UAAY,CAAA,IAAA,CACZ,QAAS,CAAGzC,EAAAA,CAAQ,UACpB,mBAAqB,CAAA,CAAA,EAAGA,CAAQ,CAChC,gBAAA,CAAA,CAAA,OAAA,CAAS,CAAGA,EAAAA,CAAQ,CACpB,MAAA,CAAA,CAAA,MAAA,CAAQ,GAAGA,CAAQ,CAAA,KAAA,CACrB,CACA,CAAA,CAAA,EACF,CAAA,CAEMkD,EAAwBb,WAAY,CAAA,CAAC,CAAE,QAAA,CAAA1B,CAAS,CAAA,GAAkC,CACtFC,CAAYD,CAAAA,CAAQ,EACpBM,CAAW,CAAA,KAAK,EAClB,CAAG,CAAA,EAAE,CAAA,CAECkC,CAAsBd,CAAAA,WAAAA,CAAanB,GAAuB,CAC9DC,CAAAA,CAAS,CAAuBD,oBAAAA,EAAAA,CAAAA,CAAM,OAAO,CAAA,CAAE,EAC/CD,CAAW,CAAA,KAAK,EAClB,CAAA,CAAG,EAAE,EAECmC,CAAaf,CAAAA,WAAAA,CAChBgB,GAAyB,CACxB,IAAMC,EAAUxC,CAAauC,CAAAA,CAAAA,CAC7BtC,CAAcuC,CAAAA,CAAO,CACrBlB,CAAAA,CAAAA,CAAakB,CAAO,EACtB,CAAA,CACA,CAACxC,CAAAA,CAAYsB,CAAY,CAC3B,EAEMmB,CAAelB,CAAAA,WAAAA,CAAY,IAAY,CAC3Ce,CAAW,CAAA,EAAE,EACf,CAAG,CAAA,CAACA,CAAU,CAAC,CAETI,CAAAA,CAAAA,CAAWnB,YAAY,IAAY,CACvCe,CAAW,CAAA,CAAC,EACd,CAAA,CAAG,CAACA,CAAU,CAAC,CAETK,CAAAA,CAAAA,CAAqBpB,WACxBqB,CAAAA,CAAAA,EAAoD,CACnD,GAAIzB,CAAAA,CAAmB,OACrB,CAAA,OAEF,IAAM0B,CAAAA,CAAcD,EAAM,UAAa,CAAA,CAAA,CACnCC,IAAgB7C,CAClBC,EAAAA,CAAAA,CAAc4C,CAAW,EAE7B,CAAA,CACA,CAAC7C,CAAU,CACb,CAAA,CAiBA,OAfAgC,SAAU,CAAA,KACRX,CAAa,CAAA,OAAA,CAAU,IAChB,CAAA,IAAM,CACXA,CAAa,CAAA,OAAA,CAAU,KACvBK,CAAAA,CAAAA,CAAgB,MAAO,EAAA,CACnBN,EAAiB,OACnB,EAAA,YAAA,CAAaA,EAAiB,OAAO,EAEzC,GACC,CAACM,CAAe,CAAC,CAAA,CAEpBM,SAAU,CAAA,IAAM,CACdnB,CAAqBP,CAAAA,CAAAA,CAAQI,CAAQI,CAAAA,CAAe,EACtD,CAAA,CAAG,CAACR,CAAOI,CAAAA,CAAAA,CAAOI,CAAe,CAAC,CAE9BV,CAAAA,CAAAA,CAEA0C,IAAC,KAAI,CAAA,CAAA,SAAA,CAAU,iDACb,QAAAA,CAAAA,GAAAA,CAAC,OAAI,SAAU,CAAA,0BAAA,CACb,QAAAA,CAAAA,GAAAA,CAAC,GAAG,CAAA,CAAA,QAAA,CAAA1C,EAAM,CACZ,CAAA,CAAA,CACF,CAKF2C,CAAAA,IAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,mDACZ,QAAA7C,CAAAA,CAAAA,CAAAA,EACC4C,GAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,yCAAA,CACb,SAAAA,GAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,eAAA,CAAgB,QAAc,CAAA,gBAAA,CAAA,CAAA,CAC/C,EAEDjD,CAAW,CAAA,CAAA,EACVkD,IAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,yEAAA,CACb,UAAAA,IAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,wCAAA,CACb,QAAAD,CAAAA,CAAAA,GAAAA,CAACE,EAAA,CACC,OAAA,CAAQ,UACR,CAAA,YAAA,CAAW,eACX,CAAA,KAAA,CAAM,YACN,IAAK,CAAA,OAAA,CACL,KAAK,QACL,CAAA,QAAA,CAAUhD,GAAc,CACxB,CAAA,OAAA,CAASyC,CACT,CAAA,CAAA,CAAG,CACH,CAAA,IAAA,CACEK,IAAC,KACC,CAAA,CAAA,KAAA,CAAM,4BACN,CAAA,OAAA,CAAQ,WACR,CAAA,IAAA,CAAK,OACL,MAAO,CAAA,cAAA,CACP,WAAY,CAAA,GAAA,CACZ,aAAc,CAAA,OAAA,CACd,eAAe,OAEf,CAAA,QAAA,CAAAA,IAAC,MAAK,CAAA,CAAA,CAAA,CAAE,iBAAiB,CAC3B,CAAA,CAAA,CAEJ,CAEAC,CAAAA,IAAAA,CAAC,MAAK,CAAA,CAAA,SAAA,CAAU,0BACd,QAAAD,CAAAA,CAAAA,GAAAA,CAAC,OACC,CAAA,CAAA,IAAA,CAAK,QACL,CAAA,GAAA,CAAK,EACL,GAAKjD,CAAAA,CAAAA,CACL,KAAOG,CAAAA,CAAAA,CACP,QAAW,CAAA,CAAA,EAAM,CACf,IAAMwB,CAAAA,CAAO,SAAS,CAAE,CAAA,MAAA,CAAO,MAAO,EAAE,CAAA,CACpCA,CAAQ,EAAA,CAAA,EAAKA,CAAQ3B,EAAAA,CAAAA,GACvBI,EAAcuB,CAAI,CAAA,CAClBE,CAAgBF,CAAAA,CAAAA,CAAM,KAAK,CAAA,EAE/B,EACA,SAAU,CAAA,4DAAA,CACZ,CAAE,CAAA,IAAA,CACC3B,CACL,CAAA,CAAA,CAAA,CACAiD,IAACE,CAAA,CAAA,CACC,OAAQ,CAAA,UAAA,CACR,YAAW,CAAA,WAAA,CACX,MAAM,WACN,CAAA,IAAA,CAAK,OACL,CAAA,IAAA,CAAK,QACL,CAAA,QAAA,CAAUhD,GAAcH,CACxB,CAAA,OAAA,CAAS6C,CACT,CAAA,CAAA,CAAG,CACH,CAAA,IAAA,CACEI,IAAC,KACC,CAAA,CAAA,KAAA,CAAM,4BACN,CAAA,OAAA,CAAQ,WACR,CAAA,IAAA,CAAK,OACL,MAAO,CAAA,cAAA,CACP,YAAY,GACZ,CAAA,aAAA,CAAc,QACd,cAAe,CAAA,OAAA,CAEf,QAAAA,CAAAA,GAAAA,CAAC,MAAK,CAAA,CAAA,CAAA,CAAE,gBAAgB,CAC1B,CAAA,CAAA,CAEJ,CACF,CAAA,CAAA,CAAA,CACAC,IAAC,CAAA,KAAA,CAAA,CAAI,UAAU,wCACb,CAAA,QAAA,CAAA,CAAAD,GAACE,CAAAA,CAAAA,CAAA,CACC,OAAA,CAAQ,WACR,YAAW,CAAA,UAAA,CACX,MAAM,WACN,CAAA,IAAA,CAAK,QACL,IAAMF,CAAAA,GAAAA,CAACG,EAAA,CAAA,CAAU,KAAO,CAAA,CAAE,MAAO,EAAI,CAAA,MAAA,CAAQ,EAAG,CAAA,CAAG,CACnD,CAAA,OAAA,CAASlB,EACT,QAAUrB,CAAAA,CAAAA,EAAS,GACnB,CAAA,CAAA,CAAG,CACL,CAAA,CAAA,CACAqC,KAACG,EAAA,CAAA,CAAI,GAAI,CAAG,CAAA,EAAA,CAAI,EACb,QAAAxC,CAAAA,CAAAA,CAAAA,CAAQ,GAAI,CAAA,GAAA,CAAA,CACf,CACAoC,CAAAA,GAAAA,CAACE,EAAA,CACC,OAAA,CAAQ,UACR,CAAA,YAAA,CAAW,SACX,CAAA,IAAA,CAAK,QACL,KAAM,CAAA,WAAA,CACN,IAAMF,CAAAA,GAAAA,CAACK,EAAA,CAAA,CAAS,MAAO,CAAE,KAAA,CAAO,EAAI,CAAA,MAAA,CAAQ,EAAG,CAAA,CAAG,EAClD,OAAStB,CAAAA,CAAAA,CACT,QAAUnB,CAAAA,CAAAA,EAAS,CACnB,CAAA,CAAA,CAAG,EACL,CACF,CAAA,CAAA,CAAA,CAAA,CACF,CAEFoC,CAAAA,GAAAA,CAAC,KAAI,CAAA,CAAA,GAAA,CAAK9B,EAAc,SAAU,CAAA,gCAAA,CAChC,QAAA8B,CAAAA,GAAAA,CAACM,QAAA,CAAA,CACC,QAASjB,CACT,CAAA,IAAA,CAAMvC,EACN,aAAewC,CAAAA,CAAAA,CACf,YAAaC,CACb,CAAA,OAAA,CACES,GAAC,CAAA,KAAA,CAAA,CAAI,SAAU,CAAA,kCAAA,CAAmC,MAAO,CAAE,MAAA,CAAQlC,CAAkB,CAAA,CACnF,QAAAkC,CAAAA,GAAAA,CAAC,OAAI,SAAU,CAAA,0FAAA,CAA2F,CAC5G,CAAA,CAAA,CAGF,QAAAA,CAAAA,GAAAA,CAACO,SAAA,CACC,GAAA,CAAKnC,CACL,CAAA,KAAA,CAAO,CAAE,MAAA,CAAQV,GAAU,sBAAwB,CAAA,KAAA,CAAO,MAAO,CAAA,CACjE,UAAYX,CAAAA,CAAAA,CACZ,aAAc8C,CACd,CAAA,iBAAA,CAAmB/B,CACnB,CAAA,WAAA,CAAc0C,CACZR,EAAAA,GAAAA,CAAC,OAAI,SAAU,CAAA,oBAAA,CACb,QAAAA,CAAAA,GAAAA,CAACS,IAAA,CAAA,CACC,WAAYD,CAAQ,CAAA,CAAA,CACpB,gBAAiB,IACjB,CAAA,qBAAA,CAAuB,KACvB,KAAOhD,CAAAA,CAAAA,CAAQI,CACf,CAAA,aAAA,CAAgBc,CAAS,EAAA,CACvB,GAAI8B,CAAU,GAAA,CAAA,CAAG,CACf,IAAME,CAAQhC,CAAAA,CAAAA,CAAK,OAASA,CAAK,CAAA,KAAA,CACjCT,CAAmByC,CAAAA,CAAK,EAC1B,CACF,EACA,OACEV,CAAAA,GAAAA,CAAC,KAAI,CAAA,CAAA,SAAA,CAAU,kCAAmC,CAAA,KAAA,CAAO,CAAE,MAAQlC,CAAAA,CAAkB,CACnF,CAAA,QAAA,CAAAkC,GAAC,CAAA,KAAA,CAAA,CAAI,UAAU,0FAA2F,CAAA,CAAA,CAC5G,CAEF,CAAA,SAAA,CAAU,+DACZ,CAAA,CAAA,CACF,EAEJ,CACF,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAEJ,CArSmD,CAAA,WAAA","file":"PdfDriver-6JQ3D3E6.mjs","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-CRJ354FP.mjs","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}