@cyber-harbour/ui 2.2.6 → 2.2.7-beta.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-Y3356KN3.js.map +1 -1
- package/dist/PdfDriver-ZHGUHQV2.mjs.map +1 -1
- package/dist/chunk-FRUL75XR.mjs.map +1 -1
- package/dist/chunk-WYSK7UOM.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +55 -42
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -38
- package/dist/index.mjs.map +1 -1
- package/dist/styles/tailwind.css +1 -1
- package/dist/styles/tailwind.css.map +1 -1
- package/package.json +1 -1
|
@@ -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","Box","Typography","Button","ChevronUpIcon","ChevronDownIcon","MinusIcon","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-Y3356KN3.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, ChevronDownIcon, ChevronUpIcon, MinusIcon, PlusIcon, Typography } 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 px-8.5\">\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 px-8.5\">\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 px-8.5 py-3\">\n <Box py={4} px={8} className=\"flex items-center justify-start gap-1 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Page:\n </Typography>\n <span className=\"flex items-center gap-2 text-[12px]\">\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 text-end text-[12px]\"\n />\n / {numPages}\n </span>\n <div className=\"flex flex-col gap-0.25 pl-1\">\n <Button\n variant=\"empty\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n icon={<ChevronUpIcon style={{ width: 8, height: 8 }} />}\n />\n <Button\n variant=\"empty\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n icon={<ChevronDownIcon style={{ width: 8, height: 8 }} />}\n />\n </div>\n </Box>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"default\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={8} px={8} className=\"flex items-center justify-between gap-1.5 min-w-21 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Scale:\n </Typography>\n <Typography>{scale * 100}%</Typography>\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"default\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale >= 4}\n p={10}\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%', scrollbarGutter: 'stable both-edges' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4 border border-1 border-gray-100\">\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","Box","Typography","Button","ChevronUpIcon","ChevronDownIcon","MinusIcon","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-Y3356KN3.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, ChevronDownIcon, ChevronUpIcon, MinusIcon, PlusIcon, Typography } 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 px-8.5\">\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 px-8.5\">\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 px-8.5 py-3\">\n <Box py={4} px={8} className=\"flex items-center justify-start gap-1 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Page:\n </Typography>\n <span className=\"flex items-center gap-2 text-[12px]\">\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 text-end text-[12px]\"\n />\n / {numPages}\n </span>\n <div className=\"flex flex-col gap-0.25 pl-1\">\n <Button\n variant=\"empty\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n icon={<ChevronUpIcon style={{ width: 8, height: 8 }} />}\n />\n <Button\n variant=\"empty\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n icon={<ChevronDownIcon style={{ width: 8, height: 8 }} />}\n />\n </div>\n </Box>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"default\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={8} px={8} className=\"flex items-center justify-between gap-1.5 min-w-21 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Scale:\n </Typography>\n <Typography>{scale * 100}%</Typography>\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"default\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale >= 4}\n p={10}\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%', scrollbarGutter: 'stable both-edges' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4 border border-1 border-gray-100\">\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 +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","Box","Typography","Button","ChevronUpIcon","ChevronDownIcon","MinusIcon","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-ZHGUHQV2.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, ChevronDownIcon, ChevronUpIcon, MinusIcon, PlusIcon, Typography } 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 px-8.5\">\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 px-8.5\">\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 px-8.5 py-3\">\n <Box py={4} px={8} className=\"flex items-center justify-start gap-1 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Page:\n </Typography>\n <span className=\"flex items-center gap-2 text-[12px]\">\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 text-end text-[12px]\"\n />\n / {numPages}\n </span>\n <div className=\"flex flex-col gap-0.25 pl-1\">\n <Button\n variant=\"empty\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n icon={<ChevronUpIcon style={{ width: 8, height: 8 }} />}\n />\n <Button\n variant=\"empty\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n icon={<ChevronDownIcon style={{ width: 8, height: 8 }} />}\n />\n </div>\n </Box>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"default\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={8} px={8} className=\"flex items-center justify-between gap-1.5 min-w-21 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Scale:\n </Typography>\n <Typography>{scale * 100}%</Typography>\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"default\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale >= 4}\n p={10}\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%', scrollbarGutter: 'stable both-edges' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4 border border-1 border-gray-100\">\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","Box","Typography","Button","ChevronUpIcon","ChevronDownIcon","MinusIcon","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-ZHGUHQV2.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, ChevronDownIcon, ChevronUpIcon, MinusIcon, PlusIcon, Typography } 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 px-8.5\">\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 px-8.5\">\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 px-8.5 py-3\">\n <Box py={4} px={8} className=\"flex items-center justify-start gap-1 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Page:\n </Typography>\n <span className=\"flex items-center gap-2 text-[12px]\">\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 text-end text-[12px]\"\n />\n / {numPages}\n </span>\n <div className=\"flex flex-col gap-0.25 pl-1\">\n <Button\n variant=\"empty\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n icon={<ChevronUpIcon style={{ width: 8, height: 8 }} />}\n />\n <Button\n variant=\"empty\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n icon={<ChevronDownIcon style={{ width: 8, height: 8 }} />}\n />\n </div>\n </Box>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"default\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={8} px={8} className=\"flex items-center justify-between gap-1.5 min-w-21 rounded-[5px]!\">\n <Typography color=\"text.lighter\" style={{ fontSize: 10 }}>\n Scale:\n </Typography>\n <Typography>{scale * 100}%</Typography>\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"default\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n className=\"bg-white! hover:bg-blue-50!\"\n disabled={scale >= 4}\n p={10}\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%', scrollbarGutter: 'stable both-edges' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4 border border-1 border-gray-100\">\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"]}
|