@eka-care/medical-records-ui 1.0.3
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/README.md +151 -0
- package/dist/DocumentViewer-WXL7OZXK.mjs +197 -0
- package/dist/DocumentViewer-WXL7OZXK.mjs.map +1 -0
- package/dist/DocumentViewer-Z3GOU5NU.js +197 -0
- package/dist/DocumentViewer-Z3GOU5NU.js.map +1 -0
- package/dist/PdfViewer-EAN6EQAB.js +141 -0
- package/dist/PdfViewer-EAN6EQAB.js.map +1 -0
- package/dist/PdfViewer-WIV5AUJB.mjs +141 -0
- package/dist/PdfViewer-WIV5AUJB.mjs.map +1 -0
- package/dist/index.css +3869 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.mts +390 -0
- package/dist/index.d.ts +390 -0
- package/dist/index.js +4796 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4796 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +3869 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.mts +2 -0
- package/dist/styles.d.ts +2 -0
- package/package.json +57 -0
- package/src/index.ts +40 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/views/RecordPreview/PdfViewer.tsx
|
|
2
|
+
var _react = require('react');
|
|
3
|
+
|
|
4
|
+
// src/views/RecordPreview/ensurePdfjs.ts
|
|
5
|
+
var PDFJS_VERSION = "5.4.296";
|
|
6
|
+
var CDN_BASE = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${PDFJS_VERSION}/legacy/build`;
|
|
7
|
+
var loadPromise = null;
|
|
8
|
+
function ensurePdfjs() {
|
|
9
|
+
if (typeof window === "undefined") return Promise.resolve();
|
|
10
|
+
if (window.pdfjsLib) return Promise.resolve();
|
|
11
|
+
if (loadPromise) return loadPromise;
|
|
12
|
+
loadPromise = new Promise((resolve, reject) => {
|
|
13
|
+
const script = document.createElement("script");
|
|
14
|
+
script.type = "module";
|
|
15
|
+
script.textContent = `
|
|
16
|
+
import * as pdfjsLib from '${CDN_BASE}/pdf.min.mjs';
|
|
17
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = '${CDN_BASE}/pdf.worker.min.mjs';
|
|
18
|
+
window.pdfjsLib = pdfjsLib;
|
|
19
|
+
window.dispatchEvent(new Event('pdfjs-ready'));
|
|
20
|
+
`;
|
|
21
|
+
script.onerror = () => reject(new Error("Failed to load pdf.js from CDN"));
|
|
22
|
+
window.addEventListener("pdfjs-ready", () => resolve(), { once: true });
|
|
23
|
+
document.head.appendChild(script);
|
|
24
|
+
});
|
|
25
|
+
return loadPromise;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/views/RecordPreview/PdfViewer.tsx
|
|
29
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
30
|
+
function PdfViewer({ url, baseWidth, scale, scrollToPage, onPageInfo }) {
|
|
31
|
+
const [pages, setPages] = _react.useState.call(void 0, []);
|
|
32
|
+
const [status, setStatus] = _react.useState.call(void 0, "loading");
|
|
33
|
+
const [current, setCurrent] = _react.useState.call(void 0, 1);
|
|
34
|
+
const containerRef = _react.useRef.call(void 0, null);
|
|
35
|
+
const pageRefs = _react.useRef.call(void 0, []);
|
|
36
|
+
_react.useEffect.call(void 0, () => {
|
|
37
|
+
let cancelled = false;
|
|
38
|
+
setStatus("loading");
|
|
39
|
+
setPages([]);
|
|
40
|
+
(async () => {
|
|
41
|
+
try {
|
|
42
|
+
await ensurePdfjs();
|
|
43
|
+
const pdfjs = window.pdfjsLib;
|
|
44
|
+
const pdf = await pdfjs.getDocument(url).promise;
|
|
45
|
+
const numPages = pdf.numPages;
|
|
46
|
+
const rendered = [];
|
|
47
|
+
for (let i = 1; i <= numPages; i++) {
|
|
48
|
+
if (cancelled) return;
|
|
49
|
+
const page = await pdf.getPage(i);
|
|
50
|
+
const viewport = page.getViewport({ scale: baseWidth / page.getViewport({ scale: 1 }).width });
|
|
51
|
+
const canvas = document.createElement("canvas");
|
|
52
|
+
const dpr = Math.min(window.devicePixelRatio * 2, 4);
|
|
53
|
+
canvas.width = viewport.width * dpr;
|
|
54
|
+
canvas.height = viewport.height * dpr;
|
|
55
|
+
const ctx = canvas.getContext("2d");
|
|
56
|
+
ctx.scale(dpr, dpr);
|
|
57
|
+
await page.render({ canvasContext: ctx, canvas, viewport }).promise;
|
|
58
|
+
rendered.push({ pageNum: i, dataUrl: canvas.toDataURL(), width: viewport.width, height: viewport.height });
|
|
59
|
+
if (!cancelled) setPages([...rendered]);
|
|
60
|
+
}
|
|
61
|
+
if (!cancelled) setStatus("done");
|
|
62
|
+
} catch (e2) {
|
|
63
|
+
if (!cancelled) setStatus("error");
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
return () => {
|
|
67
|
+
cancelled = true;
|
|
68
|
+
};
|
|
69
|
+
}, [url, baseWidth]);
|
|
70
|
+
_react.useEffect.call(void 0, () => {
|
|
71
|
+
_optionalChain([onPageInfo, 'optionalCall', _ => _({ current, total: pages.length })]);
|
|
72
|
+
}, [current, pages.length, onPageInfo]);
|
|
73
|
+
_react.useEffect.call(void 0, () => {
|
|
74
|
+
const el = pageRefs.current[scrollToPage - 1];
|
|
75
|
+
if (el) el.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
76
|
+
}, [scrollToPage]);
|
|
77
|
+
_react.useEffect.call(void 0, () => {
|
|
78
|
+
const root = containerRef.current;
|
|
79
|
+
if (!root || pages.length === 0) return;
|
|
80
|
+
const observer = new IntersectionObserver(
|
|
81
|
+
(entries) => {
|
|
82
|
+
const visible = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];
|
|
83
|
+
if (visible) {
|
|
84
|
+
const idx = Number(visible.target.dataset.pageIndex);
|
|
85
|
+
if (!Number.isNaN(idx)) setCurrent(idx + 1);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{ root, rootMargin: "0px 0px -70% 0px", threshold: 0 }
|
|
89
|
+
);
|
|
90
|
+
pageRefs.current.forEach((el) => el && observer.observe(el));
|
|
91
|
+
return () => observer.disconnect();
|
|
92
|
+
}, [pages.length]);
|
|
93
|
+
const setPageRef = _react.useCallback.call(void 0, (i) => (el) => {
|
|
94
|
+
pageRefs.current[i] = el;
|
|
95
|
+
}, []);
|
|
96
|
+
if (status === "error") {
|
|
97
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-doc-viewer__status", children: "Couldn't load this document." });
|
|
98
|
+
}
|
|
99
|
+
const totalWidth = (_nullishCoalesce(_optionalChain([pages, 'access', _2 => _2[0], 'optionalAccess', _3 => _3.width]), () => ( baseWidth))) * scale;
|
|
100
|
+
const totalHeight = pages.reduce((sum, p) => sum + p.height, 0) * scale;
|
|
101
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: containerRef, className: "mr-doc-viewer__pdf-scroll", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: "mr-doc-viewer__pdf-sizer",
|
|
105
|
+
style: { width: totalWidth, height: totalHeight || void 0 },
|
|
106
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
className: "mr-doc-viewer__pdf-stack",
|
|
110
|
+
style: { transform: `scale(${scale})`, transformOrigin: "top left" },
|
|
111
|
+
children: [
|
|
112
|
+
status === "loading" && pages.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-doc-viewer__status", children: "Loading document\u2026" }),
|
|
113
|
+
pages.map((p, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
"data-page-index": i,
|
|
117
|
+
ref: setPageRef(i),
|
|
118
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
119
|
+
"img",
|
|
120
|
+
{
|
|
121
|
+
src: p.dataUrl,
|
|
122
|
+
width: p.width,
|
|
123
|
+
height: p.height,
|
|
124
|
+
alt: `Page ${p.pageNum}`,
|
|
125
|
+
className: "mr-doc-viewer__page",
|
|
126
|
+
draggable: false
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
},
|
|
130
|
+
p.pageNum
|
|
131
|
+
))
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
) });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
exports.PdfViewer = PdfViewer;
|
|
141
|
+
//# sourceMappingURL=PdfViewer-EAN6EQAB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/PdfViewer-EAN6EQAB.js","../src/views/RecordPreview/PdfViewer.tsx","../src/views/RecordPreview/ensurePdfjs.ts"],"names":[],"mappings":"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","file":"/home/runner/work/medical-records-ui/medical-records-ui/dist/PdfViewer-EAN6EQAB.js","sourcesContent":[null,"import { useState, useEffect, useRef, useCallback } from 'react';\nimport { ensurePdfjs } from './ensurePdfjs';\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pdfjsLib: any;\n }\n}\n\nexport interface PdfViewerProps {\n url: string;\n baseWidth: number;\n scale: number;\n scrollToPage: number;\n onPageInfo?: (info: { current: number; total: number }) => void;\n}\n\ninterface RenderedPage {\n pageNum: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport function PdfViewer({ url, baseWidth, scale, scrollToPage, onPageInfo }: PdfViewerProps) {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [status, setStatus] = useState<'loading' | 'error' | 'done'>('loading');\n const [current, setCurrent] = useState(1);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n useEffect(() => {\n let cancelled = false;\n setStatus('loading');\n setPages([]);\n\n (async () => {\n try {\n await ensurePdfjs();\n const pdfjs = window.pdfjsLib;\n const pdf = await pdfjs.getDocument(url).promise;\n const numPages = pdf.numPages;\n const rendered: RenderedPage[] = [];\n\n for (let i = 1; i <= numPages; i++) {\n if (cancelled) return;\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale: baseWidth / page.getViewport({ scale: 1 }).width });\n const canvas = document.createElement('canvas');\n const dpr = Math.min(window.devicePixelRatio * 2, 4);\n canvas.width = viewport.width * dpr;\n canvas.height = viewport.height * dpr;\n const ctx = canvas.getContext('2d')!;\n ctx.scale(dpr, dpr);\n await page.render({ canvasContext: ctx, canvas, viewport }).promise;\n rendered.push({ pageNum: i, dataUrl: canvas.toDataURL(), width: viewport.width, height: viewport.height });\n if (!cancelled) setPages([...rendered]);\n }\n\n if (!cancelled) setStatus('done');\n } catch {\n if (!cancelled) setStatus('error');\n }\n })();\n\n return () => { cancelled = true; };\n }, [url, baseWidth]);\n\n useEffect(() => {\n onPageInfo?.({ current, total: pages.length });\n }, [current, pages.length, onPageInfo]);\n\n useEffect(() => {\n const el = pageRefs.current[scrollToPage - 1];\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, [scrollToPage]);\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root || pages.length === 0) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if (visible) {\n const idx = Number((visible.target as HTMLElement).dataset.pageIndex);\n if (!Number.isNaN(idx)) setCurrent(idx + 1);\n }\n },\n { root, rootMargin: '0px 0px -70% 0px', threshold: 0 },\n );\n pageRefs.current.forEach((el) => el && observer.observe(el));\n return () => observer.disconnect();\n }, [pages.length]);\n\n const setPageRef = useCallback((i: number) => (el: HTMLDivElement | null) => {\n pageRefs.current[i] = el;\n }, []);\n\n if (status === 'error') {\n return <div className=\"mr-doc-viewer__status\">Couldn't load this document.</div>;\n }\n\n const totalWidth = (pages[0]?.width ?? baseWidth) * scale;\n const totalHeight = pages.reduce((sum, p) => sum + p.height, 0) * scale;\n\n return (\n <div ref={containerRef} className=\"mr-doc-viewer__pdf-scroll\">\n <div\n className=\"mr-doc-viewer__pdf-sizer\"\n style={{ width: totalWidth, height: totalHeight || undefined }}\n >\n <div\n className=\"mr-doc-viewer__pdf-stack\"\n style={{ transform: `scale(${scale})`, transformOrigin: 'top left' }}\n >\n {status === 'loading' && pages.length === 0 && (\n <div className=\"mr-doc-viewer__status\">Loading document…</div>\n )}\n {pages.map((p, i) => (\n <div\n key={p.pageNum}\n data-page-index={i}\n ref={setPageRef(i)}\n >\n <img\n src={p.dataUrl}\n width={p.width}\n height={p.height}\n alt={`Page ${p.pageNum}`}\n className=\"mr-doc-viewer__page\"\n draggable={false}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Loads pdf.js from the CDN at runtime and exposes it as `window.pdfjsLib`.\n *\n * pdfjs-dist v5 is externalized from the webpack bundle (see next.config.ts) to\n * avoid the \"Object.defineProperty called on non-object\" ESM error. So the\n * library must exist as a global *before* react-pdf (which imports `pdfjs-dist`,\n * resolved to `window.pdfjsLib`) evaluates. Call and await this before lazily\n * importing the PDF viewer. The legacy ESM build assigns `globalThis.pdfjsLib`\n * on load and also configures the matching worker.\n */\nconst PDFJS_VERSION = '5.4.296'; // must match the installed pdfjs-dist\n// jsDelivr mirrors the npm package exactly (cdnjs doesn't host the .mjs build).\n// The legacy build is the most browser-compatible.\nconst CDN_BASE = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${PDFJS_VERSION}/legacy/build`;\n\nlet loadPromise: Promise<void> | null = null;\n\nexport function ensurePdfjs(): Promise<void> {\n if (typeof window === 'undefined') return Promise.resolve();\n // Already loaded.\n if ((window as unknown as { pdfjsLib?: unknown }).pdfjsLib) return Promise.resolve();\n if (loadPromise) return loadPromise;\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'module';\n // Import the legacy ESM build (sets globalThis.pdfjsLib), then point its\n // worker at the matching CDN worker.\n script.textContent = `\n import * as pdfjsLib from '${CDN_BASE}/pdf.min.mjs';\n pdfjsLib.GlobalWorkerOptions.workerSrc = '${CDN_BASE}/pdf.worker.min.mjs';\n window.pdfjsLib = pdfjsLib;\n window.dispatchEvent(new Event('pdfjs-ready'));\n `;\n script.onerror = () => reject(new Error('Failed to load pdf.js from CDN'));\n window.addEventListener('pdfjs-ready', () => resolve(), { once: true });\n document.head.appendChild(script);\n });\n return loadPromise;\n}\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// src/views/RecordPreview/PdfViewer.tsx
|
|
2
|
+
import { useState, useEffect, useRef, useCallback } from "react";
|
|
3
|
+
|
|
4
|
+
// src/views/RecordPreview/ensurePdfjs.ts
|
|
5
|
+
var PDFJS_VERSION = "5.4.296";
|
|
6
|
+
var CDN_BASE = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${PDFJS_VERSION}/legacy/build`;
|
|
7
|
+
var loadPromise = null;
|
|
8
|
+
function ensurePdfjs() {
|
|
9
|
+
if (typeof window === "undefined") return Promise.resolve();
|
|
10
|
+
if (window.pdfjsLib) return Promise.resolve();
|
|
11
|
+
if (loadPromise) return loadPromise;
|
|
12
|
+
loadPromise = new Promise((resolve, reject) => {
|
|
13
|
+
const script = document.createElement("script");
|
|
14
|
+
script.type = "module";
|
|
15
|
+
script.textContent = `
|
|
16
|
+
import * as pdfjsLib from '${CDN_BASE}/pdf.min.mjs';
|
|
17
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = '${CDN_BASE}/pdf.worker.min.mjs';
|
|
18
|
+
window.pdfjsLib = pdfjsLib;
|
|
19
|
+
window.dispatchEvent(new Event('pdfjs-ready'));
|
|
20
|
+
`;
|
|
21
|
+
script.onerror = () => reject(new Error("Failed to load pdf.js from CDN"));
|
|
22
|
+
window.addEventListener("pdfjs-ready", () => resolve(), { once: true });
|
|
23
|
+
document.head.appendChild(script);
|
|
24
|
+
});
|
|
25
|
+
return loadPromise;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/views/RecordPreview/PdfViewer.tsx
|
|
29
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
30
|
+
function PdfViewer({ url, baseWidth, scale, scrollToPage, onPageInfo }) {
|
|
31
|
+
const [pages, setPages] = useState([]);
|
|
32
|
+
const [status, setStatus] = useState("loading");
|
|
33
|
+
const [current, setCurrent] = useState(1);
|
|
34
|
+
const containerRef = useRef(null);
|
|
35
|
+
const pageRefs = useRef([]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
let cancelled = false;
|
|
38
|
+
setStatus("loading");
|
|
39
|
+
setPages([]);
|
|
40
|
+
(async () => {
|
|
41
|
+
try {
|
|
42
|
+
await ensurePdfjs();
|
|
43
|
+
const pdfjs = window.pdfjsLib;
|
|
44
|
+
const pdf = await pdfjs.getDocument(url).promise;
|
|
45
|
+
const numPages = pdf.numPages;
|
|
46
|
+
const rendered = [];
|
|
47
|
+
for (let i = 1; i <= numPages; i++) {
|
|
48
|
+
if (cancelled) return;
|
|
49
|
+
const page = await pdf.getPage(i);
|
|
50
|
+
const viewport = page.getViewport({ scale: baseWidth / page.getViewport({ scale: 1 }).width });
|
|
51
|
+
const canvas = document.createElement("canvas");
|
|
52
|
+
const dpr = Math.min(window.devicePixelRatio * 2, 4);
|
|
53
|
+
canvas.width = viewport.width * dpr;
|
|
54
|
+
canvas.height = viewport.height * dpr;
|
|
55
|
+
const ctx = canvas.getContext("2d");
|
|
56
|
+
ctx.scale(dpr, dpr);
|
|
57
|
+
await page.render({ canvasContext: ctx, canvas, viewport }).promise;
|
|
58
|
+
rendered.push({ pageNum: i, dataUrl: canvas.toDataURL(), width: viewport.width, height: viewport.height });
|
|
59
|
+
if (!cancelled) setPages([...rendered]);
|
|
60
|
+
}
|
|
61
|
+
if (!cancelled) setStatus("done");
|
|
62
|
+
} catch {
|
|
63
|
+
if (!cancelled) setStatus("error");
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
return () => {
|
|
67
|
+
cancelled = true;
|
|
68
|
+
};
|
|
69
|
+
}, [url, baseWidth]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
onPageInfo?.({ current, total: pages.length });
|
|
72
|
+
}, [current, pages.length, onPageInfo]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const el = pageRefs.current[scrollToPage - 1];
|
|
75
|
+
if (el) el.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
76
|
+
}, [scrollToPage]);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
const root = containerRef.current;
|
|
79
|
+
if (!root || pages.length === 0) return;
|
|
80
|
+
const observer = new IntersectionObserver(
|
|
81
|
+
(entries) => {
|
|
82
|
+
const visible = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];
|
|
83
|
+
if (visible) {
|
|
84
|
+
const idx = Number(visible.target.dataset.pageIndex);
|
|
85
|
+
if (!Number.isNaN(idx)) setCurrent(idx + 1);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{ root, rootMargin: "0px 0px -70% 0px", threshold: 0 }
|
|
89
|
+
);
|
|
90
|
+
pageRefs.current.forEach((el) => el && observer.observe(el));
|
|
91
|
+
return () => observer.disconnect();
|
|
92
|
+
}, [pages.length]);
|
|
93
|
+
const setPageRef = useCallback((i) => (el) => {
|
|
94
|
+
pageRefs.current[i] = el;
|
|
95
|
+
}, []);
|
|
96
|
+
if (status === "error") {
|
|
97
|
+
return /* @__PURE__ */ jsx("div", { className: "mr-doc-viewer__status", children: "Couldn't load this document." });
|
|
98
|
+
}
|
|
99
|
+
const totalWidth = (pages[0]?.width ?? baseWidth) * scale;
|
|
100
|
+
const totalHeight = pages.reduce((sum, p) => sum + p.height, 0) * scale;
|
|
101
|
+
return /* @__PURE__ */ jsx("div", { ref: containerRef, className: "mr-doc-viewer__pdf-scroll", children: /* @__PURE__ */ jsx(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: "mr-doc-viewer__pdf-sizer",
|
|
105
|
+
style: { width: totalWidth, height: totalHeight || void 0 },
|
|
106
|
+
children: /* @__PURE__ */ jsxs(
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
className: "mr-doc-viewer__pdf-stack",
|
|
110
|
+
style: { transform: `scale(${scale})`, transformOrigin: "top left" },
|
|
111
|
+
children: [
|
|
112
|
+
status === "loading" && pages.length === 0 && /* @__PURE__ */ jsx("div", { className: "mr-doc-viewer__status", children: "Loading document\u2026" }),
|
|
113
|
+
pages.map((p, i) => /* @__PURE__ */ jsx(
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
"data-page-index": i,
|
|
117
|
+
ref: setPageRef(i),
|
|
118
|
+
children: /* @__PURE__ */ jsx(
|
|
119
|
+
"img",
|
|
120
|
+
{
|
|
121
|
+
src: p.dataUrl,
|
|
122
|
+
width: p.width,
|
|
123
|
+
height: p.height,
|
|
124
|
+
alt: `Page ${p.pageNum}`,
|
|
125
|
+
className: "mr-doc-viewer__page",
|
|
126
|
+
draggable: false
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
},
|
|
130
|
+
p.pageNum
|
|
131
|
+
))
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
) });
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
PdfViewer
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=PdfViewer-WIV5AUJB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/views/RecordPreview/PdfViewer.tsx","../src/views/RecordPreview/ensurePdfjs.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { ensurePdfjs } from './ensurePdfjs';\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pdfjsLib: any;\n }\n}\n\nexport interface PdfViewerProps {\n url: string;\n baseWidth: number;\n scale: number;\n scrollToPage: number;\n onPageInfo?: (info: { current: number; total: number }) => void;\n}\n\ninterface RenderedPage {\n pageNum: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport function PdfViewer({ url, baseWidth, scale, scrollToPage, onPageInfo }: PdfViewerProps) {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [status, setStatus] = useState<'loading' | 'error' | 'done'>('loading');\n const [current, setCurrent] = useState(1);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n useEffect(() => {\n let cancelled = false;\n setStatus('loading');\n setPages([]);\n\n (async () => {\n try {\n await ensurePdfjs();\n const pdfjs = window.pdfjsLib;\n const pdf = await pdfjs.getDocument(url).promise;\n const numPages = pdf.numPages;\n const rendered: RenderedPage[] = [];\n\n for (let i = 1; i <= numPages; i++) {\n if (cancelled) return;\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale: baseWidth / page.getViewport({ scale: 1 }).width });\n const canvas = document.createElement('canvas');\n const dpr = Math.min(window.devicePixelRatio * 2, 4);\n canvas.width = viewport.width * dpr;\n canvas.height = viewport.height * dpr;\n const ctx = canvas.getContext('2d')!;\n ctx.scale(dpr, dpr);\n await page.render({ canvasContext: ctx, canvas, viewport }).promise;\n rendered.push({ pageNum: i, dataUrl: canvas.toDataURL(), width: viewport.width, height: viewport.height });\n if (!cancelled) setPages([...rendered]);\n }\n\n if (!cancelled) setStatus('done');\n } catch {\n if (!cancelled) setStatus('error');\n }\n })();\n\n return () => { cancelled = true; };\n }, [url, baseWidth]);\n\n useEffect(() => {\n onPageInfo?.({ current, total: pages.length });\n }, [current, pages.length, onPageInfo]);\n\n useEffect(() => {\n const el = pageRefs.current[scrollToPage - 1];\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, [scrollToPage]);\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root || pages.length === 0) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if (visible) {\n const idx = Number((visible.target as HTMLElement).dataset.pageIndex);\n if (!Number.isNaN(idx)) setCurrent(idx + 1);\n }\n },\n { root, rootMargin: '0px 0px -70% 0px', threshold: 0 },\n );\n pageRefs.current.forEach((el) => el && observer.observe(el));\n return () => observer.disconnect();\n }, [pages.length]);\n\n const setPageRef = useCallback((i: number) => (el: HTMLDivElement | null) => {\n pageRefs.current[i] = el;\n }, []);\n\n if (status === 'error') {\n return <div className=\"mr-doc-viewer__status\">Couldn't load this document.</div>;\n }\n\n const totalWidth = (pages[0]?.width ?? baseWidth) * scale;\n const totalHeight = pages.reduce((sum, p) => sum + p.height, 0) * scale;\n\n return (\n <div ref={containerRef} className=\"mr-doc-viewer__pdf-scroll\">\n <div\n className=\"mr-doc-viewer__pdf-sizer\"\n style={{ width: totalWidth, height: totalHeight || undefined }}\n >\n <div\n className=\"mr-doc-viewer__pdf-stack\"\n style={{ transform: `scale(${scale})`, transformOrigin: 'top left' }}\n >\n {status === 'loading' && pages.length === 0 && (\n <div className=\"mr-doc-viewer__status\">Loading document…</div>\n )}\n {pages.map((p, i) => (\n <div\n key={p.pageNum}\n data-page-index={i}\n ref={setPageRef(i)}\n >\n <img\n src={p.dataUrl}\n width={p.width}\n height={p.height}\n alt={`Page ${p.pageNum}`}\n className=\"mr-doc-viewer__page\"\n draggable={false}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Loads pdf.js from the CDN at runtime and exposes it as `window.pdfjsLib`.\n *\n * pdfjs-dist v5 is externalized from the webpack bundle (see next.config.ts) to\n * avoid the \"Object.defineProperty called on non-object\" ESM error. So the\n * library must exist as a global *before* react-pdf (which imports `pdfjs-dist`,\n * resolved to `window.pdfjsLib`) evaluates. Call and await this before lazily\n * importing the PDF viewer. The legacy ESM build assigns `globalThis.pdfjsLib`\n * on load and also configures the matching worker.\n */\nconst PDFJS_VERSION = '5.4.296'; // must match the installed pdfjs-dist\n// jsDelivr mirrors the npm package exactly (cdnjs doesn't host the .mjs build).\n// The legacy build is the most browser-compatible.\nconst CDN_BASE = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${PDFJS_VERSION}/legacy/build`;\n\nlet loadPromise: Promise<void> | null = null;\n\nexport function ensurePdfjs(): Promise<void> {\n if (typeof window === 'undefined') return Promise.resolve();\n // Already loaded.\n if ((window as unknown as { pdfjsLib?: unknown }).pdfjsLib) return Promise.resolve();\n if (loadPromise) return loadPromise;\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'module';\n // Import the legacy ESM build (sets globalThis.pdfjsLib), then point its\n // worker at the matching CDN worker.\n script.textContent = `\n import * as pdfjsLib from '${CDN_BASE}/pdf.min.mjs';\n pdfjsLib.GlobalWorkerOptions.workerSrc = '${CDN_BASE}/pdf.worker.min.mjs';\n window.pdfjsLib = pdfjsLib;\n window.dispatchEvent(new Event('pdfjs-ready'));\n `;\n script.onerror = () => reject(new Error('Failed to load pdf.js from CDN'));\n window.addEventListener('pdfjs-ready', () => resolve(), { once: true });\n document.head.appendChild(script);\n });\n return loadPromise;\n}\n"],"mappings":"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","names":[]}
|