@cyber-harbour/ui 1.1.40 → 1.1.41-dev.1
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.
- package/dist/{PdfDriver-Y3FKOLB4.mjs → PdfDriver-2ZI2HQKV.mjs} +3 -3
- package/dist/{PdfDriver-Y3FKOLB4.mjs.map → PdfDriver-2ZI2HQKV.mjs.map} +1 -1
- package/dist/{PdfDriver-XDBM5MVE.js → PdfDriver-NOMJ2QTV.js} +3 -3
- package/dist/{PdfDriver-XDBM5MVE.js.map → PdfDriver-NOMJ2QTV.js.map} +1 -1
- package/dist/{chunk-3FF6XDIU.js → chunk-7BWLT3F6.js} +151 -145
- package/dist/chunk-7BWLT3F6.js.map +1 -0
- package/dist/{chunk-S2VTEFTY.mjs → chunk-EA47VUBF.mjs} +158 -152
- package/dist/chunk-EA47VUBF.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +26 -26
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-3FF6XDIU.js.map +0 -1
- package/dist/chunk-S2VTEFTY.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {a,A,D,mb,pa}from'./chunk-
|
|
1
|
+
import {a,A,D,mb,pa}from'./chunk-EA47VUBF.mjs';import {useState,useRef,useCallback,useMemo,useEffect}from'react';import o,{keyframes}from'styled-components';import M 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 re=1e3,oe=400,ne=150,ie=70,ae=1.414,L=400,Ce=a(({url:n})=>{let[a,j]=useState(0),[s,b]=useState(1),[O,T]=useState(true),[D$1,z]=useState(null),[x,B]=useState(L),[H,F]=useState(L),[l,E]=useState(1),[k,G]=useState(L),[I,V]=useState(ae),d=useRef(null),R=useRef(null),w=useRef(false),u=useRef(null),v=useRef(false),h=useCallback((e,r=true)=>{e<1||e>a||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{v.current&&(w.current=false);},re));},[a]),y=useMemo(()=>M((e,r=false)=>h(e,r),oe),[h]);useEffect(()=>{if(!d.current)return;let e=M(()=>{d.current&&(B(d.current.offsetWidth-ie),F(d.current.clientHeight));},ne);e();let r=new ResizeObserver(e);return r.observe(d.current),()=>{r.disconnect(),e.cancel();}},[]);let Y=useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),Z=useCallback(({numPages:e})=>{j(e),T(false);},[]),J=useCallback(e=>{z(`Failed to load PDF: ${e.message}`),T(false);},[]),A$1=useCallback(e=>{let r=s+e;b(r),h(r);},[s,h]),q=useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==s&&b(r);},[s]);if(useEffect(()=>(v.current=true,()=>{v.current=false,y.cancel(),u.current&&clearTimeout(u.current);}),[y]),useEffect(()=>{G(x*l*I);},[x,l,I]),D$1)return jsx(le,{children:jsx(de,{children:D$1})});let C=jsx(xe,{style:{height:k},children:jsx(we,{})});return jsxs(ce,{children:[O&&jsx(ue,{children:jsx(pe,{children:"Loading PDF..."})}),a>0&&jsxs(ge,{children:[jsxs(U,{children:[jsx(A,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:s<=1,onClick:()=>A$1(-1),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",style:{width:16,height:16},children:jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxs(me,{children:[jsx(fe,{type:"number",min:1,max:a,value:s,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=a&&(b(r),y(r,false));}}),jsxs("span",{children:["/ ",a]})]}),jsx(A,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:s>=a,onClick:()=>A$1(1),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",style:{width:16,height:16},children:jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxs(U,{children:[jsx(A,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsx(D,{style:{width:20,height:20}}),onClick:()=>E(e=>Math.max(e-.25,.25)),disabled:l<=.25,p:7}),jsxs(mb,{py:5,px:8,children:[l*100,"%"]}),jsx(A,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsx(pa,{style:{width:14,height:14}}),onClick:()=>E(e=>Math.min(e+.25,4)),disabled:l>=4,p:8})]})]}),jsx(he,{ref:d,children:jsx(Document,{options:Y,file:n,onLoadSuccess:Z,onLoadError:J,loading:C,children:jsx(Virtuoso,{ref:R,style:{height:H||"calc(100dvh - 190px)",width:"100%"},totalCount:a,rangeChanged:q,defaultItemHeight:k,itemContent:e=>jsx(be,{children:jsx(Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:x*l,onLoadSuccess:r=>{e===0&&V(r.height/r.width);},loading:C})})})})})]})},"PdfDriver"),se=keyframes`
|
|
2
2
|
from { transform: rotate(0deg); }
|
|
3
3
|
to { transform: rotate(360deg); }
|
|
4
4
|
`,ce=o.div`
|
|
@@ -71,5 +71,5 @@ import {a,A,D,mb,pa}from'./chunk-S2VTEFTY.mjs';import {useState,useRef,useCallba
|
|
|
71
71
|
border: 2px solid ${n.colors.stroke.light};
|
|
72
72
|
border-inline-start-color: transparent;
|
|
73
73
|
animation: ${se} 1s linear infinite;
|
|
74
|
-
`);export{Ce as PdfDriver};//# sourceMappingURL=PdfDriver-
|
|
75
|
-
//# sourceMappingURL=PdfDriver-
|
|
74
|
+
`);export{Ce as PdfDriver};//# sourceMappingURL=PdfDriver-2ZI2HQKV.mjs.map
|
|
75
|
+
//# sourceMappingURL=PdfDriver-2ZI2HQKV.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","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","handleRangeChanged","range","visiblePage","jsx","ErrorWrapper","ErrorText","PageLoader","PageLoaderWrapper","Spinner","jsxs","Wrapper","LoadingWrapper","MutedText","Toolbar","ToolbarGroup","Button","PageInputRow","PageInput","MinusIcon","prev","Box","PlusIcon","DocumentArea","Document","Virtuoso","index","PageWrapper","Page","spin","keyframes","styled","theme"],"mappings":"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","file":"PdfDriver-Y3FKOLB4.mjs","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport styled, { keyframes } from 'styled-components';\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 } from '../../../Core';\nimport { MinusIcon, PlusIcon } from '../../../Core/IconComponents';\n\nconst BASE_DIR = '/pdfjs';\n\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}\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 isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({ index: page - 1, align: 'start', behavior: smooth ? 'smooth' : 'auto' });\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\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 () => debounce((page: number, smooth = false) => scrollToPage(page, smooth), INPUT_DEBOUNCE_DELAY),\n [scrollToPage]\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 () => { observer.disconnect(); updateSize.cancel(); };\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 }) => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error) => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number) => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) return;\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) setPageNumber(visiblePage);\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <ErrorWrapper>\n <ErrorText>{error}</ErrorText>\n </ErrorWrapper>\n );\n }\n\n const PageLoader = (\n <PageLoaderWrapper style={{ height: defaultPageHeight }}>\n <Spinner />\n </PageLoaderWrapper>\n );\n\n return (\n <Wrapper>\n {loading && (\n <LoadingWrapper>\n <MutedText>Loading PDF...</MutedText>\n </LoadingWrapper>\n )}\n {numPages > 0 && (\n <Toolbar>\n <ToolbarGroup>\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={() => changePage(-1)}\n p={5}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n <PageInputRow>\n <PageInput\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 />\n <span>/ {numPages}</span>\n </PageInputRow>\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={() => changePage(1)}\n p={7}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </ToolbarGroup>\n <ToolbarGroup>\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={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>{scale * 100}%</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={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </ToolbarGroup>\n </Toolbar>\n )}\n <DocumentArea ref={containerRef}>\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={PageLoader}\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 <PageWrapper>\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) setPageAspectRatio(page.height / page.width);\n }}\n loading={PageLoader}\n />\n </PageWrapper>\n )}\n />\n </Document>\n </DocumentArea>\n </Wrapper>\n );\n};\n\nconst spin = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding-bottom: 20px;\n`;\n\nconst ErrorWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n`;\n\nconst ErrorText = styled.p(\n ({ theme }) => `\n color: ${theme.colors.error};\n text-align: center;\n`\n);\n\nconst LoadingWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n`;\n\nconst MutedText = styled.span(\n ({ theme }) => `\n color: ${theme.colors.text.light};\n`\n);\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px;\n\n @media (min-width: 768px) {\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n`;\n\nconst PageInputRow = styled.span`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nconst PageInput = styled.input(\n ({ theme }) => `\n width: 60px;\n padding: 4px;\n border: 1px solid ${theme.colors.stroke.main};\n border-radius: 4px;\n text-align: center;\n background: ${theme.colors.background};\n color: ${theme.colors.text.main};\n`\n);\n\nconst DocumentArea = styled.div`\n flex: 1;\n overflow: hidden;\n min-height: 0;\n`;\n\nconst PageWrapper = styled.div`\n margin: 0 auto;\n width: fit-content;\n margin-bottom: 16px;\n`;\n\nconst PageLoaderWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Spinner = styled.div(\n ({ theme }) => `\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: 2px solid ${theme.colors.stroke.light};\n border-inline-start-color: transparent;\n animation: ${spin} 1s linear infinite;\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","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","handleRangeChanged","range","visiblePage","jsx","ErrorWrapper","ErrorText","PageLoader","PageLoaderWrapper","Spinner","jsxs","Wrapper","LoadingWrapper","MutedText","Toolbar","ToolbarGroup","Button","PageInputRow","PageInput","MinusIcon","prev","Box","PlusIcon","DocumentArea","Document","Virtuoso","index","PageWrapper","Page","spin","keyframes","styled","theme"],"mappings":"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","file":"PdfDriver-2ZI2HQKV.mjs","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport styled, { keyframes } from 'styled-components';\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 } from '../../../Core';\nimport { MinusIcon, PlusIcon } from '../../../Core/IconComponents';\n\nconst BASE_DIR = '/pdfjs';\n\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}\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 isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({ index: page - 1, align: 'start', behavior: smooth ? 'smooth' : 'auto' });\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\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 () => debounce((page: number, smooth = false) => scrollToPage(page, smooth), INPUT_DEBOUNCE_DELAY),\n [scrollToPage]\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 () => { observer.disconnect(); updateSize.cancel(); };\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 }) => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error) => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number) => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) return;\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) setPageNumber(visiblePage);\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <ErrorWrapper>\n <ErrorText>{error}</ErrorText>\n </ErrorWrapper>\n );\n }\n\n const PageLoader = (\n <PageLoaderWrapper style={{ height: defaultPageHeight }}>\n <Spinner />\n </PageLoaderWrapper>\n );\n\n return (\n <Wrapper>\n {loading && (\n <LoadingWrapper>\n <MutedText>Loading PDF...</MutedText>\n </LoadingWrapper>\n )}\n {numPages > 0 && (\n <Toolbar>\n <ToolbarGroup>\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={() => changePage(-1)}\n p={5}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n <PageInputRow>\n <PageInput\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 />\n <span>/ {numPages}</span>\n </PageInputRow>\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={() => changePage(1)}\n p={7}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </ToolbarGroup>\n <ToolbarGroup>\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={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>{scale * 100}%</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={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </ToolbarGroup>\n </Toolbar>\n )}\n <DocumentArea ref={containerRef}>\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={PageLoader}\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 <PageWrapper>\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) setPageAspectRatio(page.height / page.width);\n }}\n loading={PageLoader}\n />\n </PageWrapper>\n )}\n />\n </Document>\n </DocumentArea>\n </Wrapper>\n );\n};\n\nconst spin = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding-bottom: 20px;\n`;\n\nconst ErrorWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n`;\n\nconst ErrorText = styled.p(\n ({ theme }) => `\n color: ${theme.colors.error};\n text-align: center;\n`\n);\n\nconst LoadingWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n`;\n\nconst MutedText = styled.span(\n ({ theme }) => `\n color: ${theme.colors.text.light};\n`\n);\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px;\n\n @media (min-width: 768px) {\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n`;\n\nconst PageInputRow = styled.span`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nconst PageInput = styled.input(\n ({ theme }) => `\n width: 60px;\n padding: 4px;\n border: 1px solid ${theme.colors.stroke.main};\n border-radius: 4px;\n text-align: center;\n background: ${theme.colors.background};\n color: ${theme.colors.text.main};\n`\n);\n\nconst DocumentArea = styled.div`\n flex: 1;\n overflow: hidden;\n min-height: 0;\n`;\n\nconst PageWrapper = styled.div`\n margin: 0 auto;\n width: fit-content;\n margin-bottom: 16px;\n`;\n\nconst PageLoaderWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Spinner = styled.div(\n ({ theme }) => `\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: 2px solid ${theme.colors.stroke.light};\n border-inline-start-color: transparent;\n animation: ${spin} 1s linear infinite;\n`\n);\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunk7BWLT3F6_js=require('./chunk-7BWLT3F6.js'),react=require('react'),o=require('styled-components'),M=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 o__default=/*#__PURE__*/_interopDefault(o);var M__default=/*#__PURE__*/_interopDefault(M);var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(reactPdf.pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var re=1e3,oe=400,ne=150,ie=70,ae=1.414,L=400,Ne=chunk7BWLT3F6_js.a(({url:n})=>{let[a,j]=react.useState(0),[s,b]=react.useState(1),[O,T]=react.useState(true),[D,z]=react.useState(null),[x,B]=react.useState(L),[H,F]=react.useState(L),[l,E]=react.useState(1),[k,G]=react.useState(L),[I,V]=react.useState(ae),d=react.useRef(null),R=react.useRef(null),w=react.useRef(false),u=react.useRef(null),v=react.useRef(false),h=react.useCallback((e,r=true)=>{e<1||e>a||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{v.current&&(w.current=false);},re));},[a]),y=react.useMemo(()=>M__default.default((e,r=false)=>h(e,r),oe),[h]);react.useEffect(()=>{if(!d.current)return;let e=M__default.default(()=>{d.current&&(B(d.current.offsetWidth-ie),F(d.current.clientHeight));},ne);e();let r=new ResizeObserver(e);return r.observe(d.current),()=>{r.disconnect(),e.cancel();}},[]);let Y=react.useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),Z=react.useCallback(({numPages:e})=>{j(e),T(false);},[]),J=react.useCallback(e=>{z(`Failed to load PDF: ${e.message}`),T(false);},[]),A=react.useCallback(e=>{let r=s+e;b(r),h(r);},[s,h]),q=react.useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==s&&b(r);},[s]);if(react.useEffect(()=>(v.current=true,()=>{v.current=false,y.cancel(),u.current&&clearTimeout(u.current);}),[y]),react.useEffect(()=>{G(x*l*I);},[x,l,I]),D)return jsxRuntime.jsx(le,{children:jsxRuntime.jsx(de,{children:D})});let C=jsxRuntime.jsx(xe,{style:{height:k},children:jsxRuntime.jsx(we,{})});return jsxRuntime.jsxs(ce,{children:[O&&jsxRuntime.jsx(ue,{children:jsxRuntime.jsx(pe,{children:"Loading PDF..."})}),a>0&&jsxRuntime.jsxs(ge,{children:[jsxRuntime.jsxs(U,{children:[jsxRuntime.jsx(chunk7BWLT3F6_js.A,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:s<=1,onClick:()=>A(-1),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",style:{width:16,height:16},children:jsxRuntime.jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxRuntime.jsxs(me,{children:[jsxRuntime.jsx(fe,{type:"number",min:1,max:a,value:s,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=a&&(b(r),y(r,false));}}),jsxRuntime.jsxs("span",{children:["/ ",a]})]}),jsxRuntime.jsx(chunk7BWLT3F6_js.A,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:s>=a,onClick:()=>A(1),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",style:{width:16,height:16},children:jsxRuntime.jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxRuntime.jsxs(U,{children:[jsxRuntime.jsx(chunk7BWLT3F6_js.A,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsxRuntime.jsx(chunk7BWLT3F6_js.D,{style:{width:20,height:20}}),onClick:()=>E(e=>Math.max(e-.25,.25)),disabled:l<=.25,p:7}),jsxRuntime.jsxs(chunk7BWLT3F6_js.mb,{py:5,px:8,children:[l*100,"%"]}),jsxRuntime.jsx(chunk7BWLT3F6_js.A,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsxRuntime.jsx(chunk7BWLT3F6_js.pa,{style:{width:14,height:14}}),onClick:()=>E(e=>Math.min(e+.25,4)),disabled:l>=4,p:8})]})]}),jsxRuntime.jsx(he,{ref:d,children:jsxRuntime.jsx(reactPdf.Document,{options:Y,file:n,onLoadSuccess:Z,onLoadError:J,loading:C,children:jsxRuntime.jsx(reactVirtuoso.Virtuoso,{ref:R,style:{height:H||"calc(100dvh - 190px)",width:"100%"},totalCount:a,rangeChanged:q,defaultItemHeight:k,itemContent:e=>jsxRuntime.jsx(be,{children:jsxRuntime.jsx(reactPdf.Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:x*l,onLoadSuccess:r=>{e===0&&V(r.height/r.width);},loading:C})})})})})]})},"PdfDriver"),se=o.keyframes`
|
|
2
2
|
from { transform: rotate(0deg); }
|
|
3
3
|
to { transform: rotate(360deg); }
|
|
4
4
|
`,ce=o__default.default.div`
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
border: 2px solid ${n.colors.stroke.light};
|
|
72
72
|
border-inline-start-color: transparent;
|
|
73
73
|
animation: ${se} 1s linear infinite;
|
|
74
|
-
`);exports.PdfDriver=Ne;//# sourceMappingURL=PdfDriver-
|
|
75
|
-
//# sourceMappingURL=PdfDriver-
|
|
74
|
+
`);exports.PdfDriver=Ne;//# sourceMappingURL=PdfDriver-NOMJ2QTV.js.map
|
|
75
|
+
//# sourceMappingURL=PdfDriver-NOMJ2QTV.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","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","handleRangeChanged","range","visiblePage","jsx","ErrorWrapper","ErrorText","PageLoader","PageLoaderWrapper","Spinner","jsxs","Wrapper","LoadingWrapper","MutedText","Toolbar","ToolbarGroup","Button","PageInputRow","PageInput","MinusIcon","prev","Box","PlusIcon","DocumentArea","Document","Virtuoso","index","PageWrapper","Page","spin","keyframes","styled","theme"],"mappings":"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","file":"PdfDriver-XDBM5MVE.js","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport styled, { keyframes } from 'styled-components';\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 } from '../../../Core';\nimport { MinusIcon, PlusIcon } from '../../../Core/IconComponents';\n\nconst BASE_DIR = '/pdfjs';\n\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}\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 isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({ index: page - 1, align: 'start', behavior: smooth ? 'smooth' : 'auto' });\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\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 () => debounce((page: number, smooth = false) => scrollToPage(page, smooth), INPUT_DEBOUNCE_DELAY),\n [scrollToPage]\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 () => { observer.disconnect(); updateSize.cancel(); };\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 }) => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error) => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number) => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) return;\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) setPageNumber(visiblePage);\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <ErrorWrapper>\n <ErrorText>{error}</ErrorText>\n </ErrorWrapper>\n );\n }\n\n const PageLoader = (\n <PageLoaderWrapper style={{ height: defaultPageHeight }}>\n <Spinner />\n </PageLoaderWrapper>\n );\n\n return (\n <Wrapper>\n {loading && (\n <LoadingWrapper>\n <MutedText>Loading PDF...</MutedText>\n </LoadingWrapper>\n )}\n {numPages > 0 && (\n <Toolbar>\n <ToolbarGroup>\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={() => changePage(-1)}\n p={5}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n <PageInputRow>\n <PageInput\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 />\n <span>/ {numPages}</span>\n </PageInputRow>\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={() => changePage(1)}\n p={7}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </ToolbarGroup>\n <ToolbarGroup>\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={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>{scale * 100}%</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={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </ToolbarGroup>\n </Toolbar>\n )}\n <DocumentArea ref={containerRef}>\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={PageLoader}\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 <PageWrapper>\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) setPageAspectRatio(page.height / page.width);\n }}\n loading={PageLoader}\n />\n </PageWrapper>\n )}\n />\n </Document>\n </DocumentArea>\n </Wrapper>\n );\n};\n\nconst spin = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding-bottom: 20px;\n`;\n\nconst ErrorWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n`;\n\nconst ErrorText = styled.p(\n ({ theme }) => `\n color: ${theme.colors.error};\n text-align: center;\n`\n);\n\nconst LoadingWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n`;\n\nconst MutedText = styled.span(\n ({ theme }) => `\n color: ${theme.colors.text.light};\n`\n);\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px;\n\n @media (min-width: 768px) {\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n`;\n\nconst PageInputRow = styled.span`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nconst PageInput = styled.input(\n ({ theme }) => `\n width: 60px;\n padding: 4px;\n border: 1px solid ${theme.colors.stroke.main};\n border-radius: 4px;\n text-align: center;\n background: ${theme.colors.background};\n color: ${theme.colors.text.main};\n`\n);\n\nconst DocumentArea = styled.div`\n flex: 1;\n overflow: hidden;\n min-height: 0;\n`;\n\nconst PageWrapper = styled.div`\n margin: 0 auto;\n width: fit-content;\n margin-bottom: 16px;\n`;\n\nconst PageLoaderWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Spinner = styled.div(\n ({ theme }) => `\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: 2px solid ${theme.colors.stroke.light};\n border-inline-start-color: transparent;\n animation: ${spin} 1s linear infinite;\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","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","handleRangeChanged","range","visiblePage","jsx","ErrorWrapper","ErrorText","PageLoader","PageLoaderWrapper","Spinner","jsxs","Wrapper","LoadingWrapper","MutedText","Toolbar","ToolbarGroup","Button","PageInputRow","PageInput","MinusIcon","prev","Box","PlusIcon","DocumentArea","Document","Virtuoso","index","PageWrapper","Page","spin","keyframes","styled","theme"],"mappings":"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","file":"PdfDriver-NOMJ2QTV.js","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport styled, { keyframes } from 'styled-components';\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 } from '../../../Core';\nimport { MinusIcon, PlusIcon } from '../../../Core/IconComponents';\n\nconst BASE_DIR = '/pdfjs';\n\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}\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 isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({ index: page - 1, align: 'start', behavior: smooth ? 'smooth' : 'auto' });\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\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 () => debounce((page: number, smooth = false) => scrollToPage(page, smooth), INPUT_DEBOUNCE_DELAY),\n [scrollToPage]\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 () => { observer.disconnect(); updateSize.cancel(); };\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 }) => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error) => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number) => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) return;\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) setPageNumber(visiblePage);\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <ErrorWrapper>\n <ErrorText>{error}</ErrorText>\n </ErrorWrapper>\n );\n }\n\n const PageLoader = (\n <PageLoaderWrapper style={{ height: defaultPageHeight }}>\n <Spinner />\n </PageLoaderWrapper>\n );\n\n return (\n <Wrapper>\n {loading && (\n <LoadingWrapper>\n <MutedText>Loading PDF...</MutedText>\n </LoadingWrapper>\n )}\n {numPages > 0 && (\n <Toolbar>\n <ToolbarGroup>\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={() => changePage(-1)}\n p={5}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n <PageInputRow>\n <PageInput\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 />\n <span>/ {numPages}</span>\n </PageInputRow>\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={() => changePage(1)}\n p={7}\n icon={\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ width: 16, height: 16 }}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </ToolbarGroup>\n <ToolbarGroup>\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={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>{scale * 100}%</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={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </ToolbarGroup>\n </Toolbar>\n )}\n <DocumentArea ref={containerRef}>\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={PageLoader}\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 <PageWrapper>\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) setPageAspectRatio(page.height / page.width);\n }}\n loading={PageLoader}\n />\n </PageWrapper>\n )}\n />\n </Document>\n </DocumentArea>\n </Wrapper>\n );\n};\n\nconst spin = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n padding-bottom: 20px;\n`;\n\nconst ErrorWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n`;\n\nconst ErrorText = styled.p(\n ({ theme }) => `\n color: ${theme.colors.error};\n text-align: center;\n`\n);\n\nconst LoadingWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n`;\n\nconst MutedText = styled.span(\n ({ theme }) => `\n color: ${theme.colors.text.light};\n`\n);\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px;\n\n @media (min-width: 768px) {\n justify-content: space-between;\n }\n`;\n\nconst ToolbarGroup = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n`;\n\nconst PageInputRow = styled.span`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nconst PageInput = styled.input(\n ({ theme }) => `\n width: 60px;\n padding: 4px;\n border: 1px solid ${theme.colors.stroke.main};\n border-radius: 4px;\n text-align: center;\n background: ${theme.colors.background};\n color: ${theme.colors.text.main};\n`\n);\n\nconst DocumentArea = styled.div`\n flex: 1;\n overflow: hidden;\n min-height: 0;\n`;\n\nconst PageWrapper = styled.div`\n margin: 0 auto;\n width: fit-content;\n margin-bottom: 16px;\n`;\n\nconst PageLoaderWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst Spinner = styled.div(\n ({ theme }) => `\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: 2px solid ${theme.colors.stroke.light};\n border-inline-start-color: transparent;\n animation: ${spin} 1s linear infinite;\n`\n);\n"]}
|