@cannymindstech/file-viewers 0.27.9 → 0.27.11

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.
@@ -41,6 +41,7 @@ import InfoIcon from "@mui/icons-material/Info";
41
41
  import DescriptionIcon from "@mui/icons-material/Description";
42
42
  import HistoryIcon from "@mui/icons-material/History";
43
43
  import { LocalOffer } from "@mui/icons-material";
44
+ import * as UTIF from "utif";
44
45
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
45
46
  var resolveDocumentName = (file, fileName, url) => {
46
47
  if (file?.name) {
@@ -94,6 +95,40 @@ var TIFFViewerContent = ({
94
95
  autoExecuteSearch,
95
96
  onSearchComplete,
96
97
  toolbarActions,
98
+ // Annotation-related FileViewerProps (PDF only) — extract so they don't
99
+ // leak onto the DOM via {...props} on <Box>.
100
+ showAnnotations,
101
+ userDetails,
102
+ annotationSelectionMenu,
103
+ isHighlighterActive,
104
+ isStampActive,
105
+ isNoteActive,
106
+ onHighlighterClick,
107
+ onStampClick,
108
+ onSignatureClick,
109
+ onNoteClick,
110
+ permissions,
111
+ isAnnotationForeign,
112
+ onAnnotationNoteClick,
113
+ isAnnotationInteractive,
114
+ hasUnsavedAnnotations,
115
+ isSavingAnnotations,
116
+ canSaveAnnotations,
117
+ onSaveAnnotations,
118
+ onDownloadWithAnnotations,
119
+ onDownloadWithoutAnnotations,
120
+ onPrintWithAnnotations,
121
+ onPrintWithoutAnnotations,
122
+ showDownloadOriginal,
123
+ showDownloadWithAnnotations,
124
+ showPrintOriginal,
125
+ showPrintWithAnnotations,
126
+ showAnnotate,
127
+ disabledAnnotate,
128
+ showRotation,
129
+ defaultFitToPage,
130
+ loading,
131
+ onPasswordRequest,
97
132
  ...props
98
133
  }) => {
99
134
  const [currentPage, setCurrentPage] = useState(1);
@@ -105,7 +140,7 @@ var TIFFViewerContent = ({
105
140
  const [zoom, setZoom] = useState(100);
106
141
  const [viewportWidth, setViewportWidth] = useState(0);
107
142
  const [viewportHeight, setViewportHeight] = useState(0);
108
- const [isFullScreen, setIsFullScreen] = useState(false);
143
+ const [, setIsFullScreen] = useState(false);
109
144
  const [imageUrl, setImageUrl] = useState(null);
110
145
  const [pageImages, setPageImages] = useState(/* @__PURE__ */ new Map());
111
146
  const [internalLoading, setInternalLoading] = useState(false);
@@ -117,6 +152,9 @@ var TIFFViewerContent = ({
117
152
  useEffect(() => {
118
153
  pageLoaderRef.current = pageLoader;
119
154
  }, [pageLoader]);
155
+ const [localTotalPages, setLocalTotalPages] = useState(0);
156
+ const tiffSourceRef = useRef(null);
157
+ const effectiveTotalPages = localTotalPages || totalPages;
120
158
  const updatePageImage = useCallback(
121
159
  (pageData, pageNumber) => {
122
160
  const blob = new Blob([pageData]);
@@ -133,6 +171,39 @@ var TIFFViewerContent = ({
133
171
  },
134
172
  []
135
173
  );
174
+ const decodeLocalPage = useCallback(
175
+ async (pageIndex) => {
176
+ const source = tiffSourceRef.current;
177
+ if (!source) return null;
178
+ const image = source.ifds[pageIndex];
179
+ if (!image) return null;
180
+ UTIF.decodeImage(source.buffer, image);
181
+ const rgba = UTIF.toRGBA8(image);
182
+ const width2 = Number(image.width) || 0;
183
+ const height2 = Number(image.height) || 0;
184
+ if (!width2 || !height2) return null;
185
+ const canvas = document.createElement("canvas");
186
+ canvas.width = width2;
187
+ canvas.height = height2;
188
+ const ctx = canvas.getContext("2d");
189
+ if (!ctx) return null;
190
+ ctx.putImageData(
191
+ new ImageData(new Uint8ClampedArray(rgba), width2, height2),
192
+ 0,
193
+ 0
194
+ );
195
+ return await new Promise((resolve) => {
196
+ canvas.toBlob(async (blob) => {
197
+ if (!blob) {
198
+ resolve(null);
199
+ return;
200
+ }
201
+ resolve(await blob.arrayBuffer());
202
+ }, "image/png");
203
+ });
204
+ },
205
+ []
206
+ );
136
207
  useEffect(() => {
137
208
  const loadInitialPage = async () => {
138
209
  if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {
@@ -156,9 +227,66 @@ var TIFFViewerContent = ({
156
227
  };
157
228
  loadInitialPage();
158
229
  }, [pageImages, currentPage, updatePageImage, onError]);
230
+ useEffect(() => {
231
+ if (!file && !url) {
232
+ tiffSourceRef.current = null;
233
+ setLocalTotalPages(0);
234
+ return;
235
+ }
236
+ let cancelled = false;
237
+ (async () => {
238
+ try {
239
+ let buffer = null;
240
+ if (file) {
241
+ buffer = await file.arrayBuffer();
242
+ } else if (url && !pageLoader) {
243
+ buffer = await (await fetch(url)).arrayBuffer();
244
+ }
245
+ if (cancelled || !buffer) return;
246
+ const ifds = UTIF.decode(buffer);
247
+ if (!ifds.length) {
248
+ throw new Error("No pages found in TIFF");
249
+ }
250
+ tiffSourceRef.current = { buffer, ifds };
251
+ setLocalTotalPages(ifds.length);
252
+ if (pageLoader) return;
253
+ setInternalLoading(true);
254
+ setError(null);
255
+ setImageUrl(null);
256
+ setImageSize(null);
257
+ setPageImages((prev) => {
258
+ prev.forEach((u) => URL.revokeObjectURL(u));
259
+ return /* @__PURE__ */ new Map();
260
+ });
261
+ const firstPage = await decodeLocalPage(0);
262
+ if (cancelled) return;
263
+ if (!firstPage) {
264
+ throw new Error("Failed to decode TIFF page 1");
265
+ }
266
+ updatePageImage(firstPage, 1);
267
+ onLoad?.();
268
+ } catch (err) {
269
+ if (cancelled) return;
270
+ const message = err instanceof Error ? err.message : "Failed to decode TIFF";
271
+ if (!pageLoader) {
272
+ setError(message);
273
+ onError?.(new Error(message));
274
+ } else {
275
+ console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);
276
+ }
277
+ } finally {
278
+ if (!cancelled && !pageLoader) setInternalLoading(false);
279
+ }
280
+ })();
281
+ return () => {
282
+ cancelled = true;
283
+ };
284
+ }, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);
159
285
  const handlePageChange = useCallback(
160
286
  async (newPageNumber) => {
161
- if (!pageLoaderRef.current) {
287
+ const hasExternalLoader = !!pageLoaderRef.current;
288
+ const hasLocalSource = !!tiffSourceRef.current;
289
+ if (!hasExternalLoader && !hasLocalSource) {
162
290
  console.warn("pageLoader not provided - page navigation disabled");
163
291
  return;
164
292
  }
@@ -168,10 +296,9 @@ var TIFFViewerContent = ({
168
296
  setImageUrl(cachedUrl);
169
297
  return;
170
298
  }
171
- setInternalLoading(true);
172
299
  setError(null);
173
300
  try {
174
- const pageData = await pageLoaderRef.current(newPageNumber);
301
+ const pageData = hasExternalLoader ? await pageLoaderRef.current(newPageNumber) : await decodeLocalPage(newPageNumber - 1);
175
302
  if (pageData) {
176
303
  updatePageImage(pageData, newPageNumber);
177
304
  } else {
@@ -181,11 +308,9 @@ var TIFFViewerContent = ({
181
308
  const message = err instanceof Error ? err.message : `Unable to load page ${newPageNumber}`;
182
309
  setError(message);
183
310
  onError?.(new Error(message));
184
- } finally {
185
- setInternalLoading(false);
186
311
  }
187
312
  },
188
- [pageImages, onError, updatePageImage]
313
+ [pageImages, onError, updatePageImage, decodeLocalPage]
189
314
  );
190
315
  const resolvedFileName = useMemo(
191
316
  () => fileName || sourceDescription,
@@ -205,37 +330,14 @@ var TIFFViewerContent = ({
205
330
  }
206
331
  setIsLoading(true);
207
332
  setError(null);
208
- try {
209
- let imageDataUrl;
210
- if (file) {
211
- imageDataUrl = URL.createObjectURL(file);
212
- } else if (url) {
213
- imageDataUrl = url;
214
- } else {
215
- throw new Error("No file or URL provided");
216
- }
217
- setImageUrl(imageDataUrl);
218
- if (resetPage) {
219
- setCurrentPage(1);
220
- setFitMode("fit-page");
221
- setZoom(100);
222
- }
223
- onLoad?.();
224
- } catch (err) {
225
- const message = err instanceof Error ? err.message : "Unable to load image file";
226
- setError(message);
227
- setImageUrl(null);
228
- if (resetPage) {
229
- setCurrentPage(1);
230
- setFitMode("fit-width");
231
- setZoom(100);
232
- }
233
- onError?.(new Error(message));
234
- } finally {
235
- setIsLoading(false);
333
+ if (resetPage) {
334
+ setCurrentPage(1);
335
+ setFitMode("fit-page");
336
+ setZoom(100);
236
337
  }
338
+ setIsLoading(false);
237
339
  },
238
- [file, url, onLoad, onError]
340
+ [file, url]
239
341
  );
240
342
  const [previousFileSource, setPreviousFileSource] = useState({});
241
343
  useEffect(() => {
@@ -259,7 +361,7 @@ var TIFFViewerContent = ({
259
361
  };
260
362
  }, []);
261
363
  const hasImage = !!imageUrl;
262
- const hasMultiplePages = totalPages > 1;
364
+ const hasMultiplePages = effectiveTotalPages > 1;
263
365
  const MARGIN = 40;
264
366
  const MIN_ZOOM = 25;
265
367
  const MAX_ZOOM = 400;
@@ -345,8 +447,8 @@ var TIFFViewerContent = ({
345
447
  handlePageChange(1);
346
448
  }, [handlePageChange]);
347
449
  const handleLastPage = useCallback(() => {
348
- handlePageChange(totalPages);
349
- }, [handlePageChange, totalPages]);
450
+ handlePageChange(effectiveTotalPages);
451
+ }, [handlePageChange, effectiveTotalPages]);
350
452
  const handlePreviousPage = useCallback(() => {
351
453
  const newPage = Math.max(currentPage - 1, 1);
352
454
  if (newPage !== currentPage) {
@@ -354,20 +456,44 @@ var TIFFViewerContent = ({
354
456
  }
355
457
  }, [currentPage, handlePageChange]);
356
458
  const handleNextPage = useCallback(() => {
357
- const newPage = Math.min(currentPage + 1, totalPages);
459
+ const newPage = Math.min(currentPage + 1, effectiveTotalPages);
358
460
  if (newPage !== currentPage) {
359
461
  handlePageChange(newPage);
360
462
  }
361
- }, [currentPage, totalPages, handlePageChange]);
463
+ }, [currentPage, effectiveTotalPages, handlePageChange]);
362
464
  const handleToggleFullScreen = useCallback(() => {
363
- if (!isFullScreen && containerRef.current?.requestFullscreen) {
465
+ if (!document.fullscreenElement && containerRef.current?.requestFullscreen) {
364
466
  containerRef.current.requestFullscreen();
365
- setIsFullScreen(true);
366
- } else if (isFullScreen && document.exitFullscreen) {
467
+ } else if (document.fullscreenElement && document.exitFullscreen) {
367
468
  document.exitFullscreen();
368
- setIsFullScreen(false);
369
469
  }
370
- }, [isFullScreen]);
470
+ }, []);
471
+ useEffect(() => {
472
+ const onFullscreenChange = () => {
473
+ setIsFullScreen(!!document.fullscreenElement);
474
+ };
475
+ document.addEventListener("fullscreenchange", onFullscreenChange);
476
+ return () => {
477
+ document.removeEventListener("fullscreenchange", onFullscreenChange);
478
+ };
479
+ }, []);
480
+ const handlePrint = useCallback(() => {
481
+ if (!imageUrl) return;
482
+ const printWindow = window.open("", "_blank", "width=900,height=1200");
483
+ if (!printWindow) return;
484
+ const doc = printWindow.document;
485
+ doc.title = resolvedFileName || "Document";
486
+ const style2 = doc.createElement("style");
487
+ style2.textContent = "@page { margin: 0.5cm; }html, body { margin: 0; padding: 0; }img { display: block; width: 100%; height: auto; page-break-after: always; }";
488
+ doc.head.appendChild(style2);
489
+ const img = doc.createElement("img");
490
+ img.alt = resolvedFileName || "Document";
491
+ img.onload = () => {
492
+ window.setTimeout(() => printWindow.print(), 100);
493
+ };
494
+ img.src = imageUrl;
495
+ doc.body.appendChild(img);
496
+ }, [imageUrl, resolvedFileName]);
371
497
  const toolbar = mergeToolbarConfig({
372
498
  showDownload,
373
499
  showPrint,
@@ -511,7 +637,7 @@ var TIFFViewerContent = ({
511
637
  "Page ",
512
638
  currentPage,
513
639
  " of ",
514
- totalPages
640
+ effectiveTotalPages
515
641
  ]
516
642
  }
517
643
  ),
@@ -520,7 +646,7 @@ var TIFFViewerContent = ({
520
646
  {
521
647
  size: "small",
522
648
  onClick: handleNextPage,
523
- disabled: currentPage === totalPages,
649
+ disabled: currentPage === effectiveTotalPages,
524
650
  title: "Next Page",
525
651
  "aria-label": "Go to next page",
526
652
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { fontSize: "small" })
@@ -531,7 +657,7 @@ var TIFFViewerContent = ({
531
657
  {
532
658
  size: "small",
533
659
  onClick: handleLastPage,
534
- disabled: currentPage === totalPages,
660
+ disabled: currentPage === effectiveTotalPages,
535
661
  title: "Last Page",
536
662
  "aria-label": "Go to last page",
537
663
  children: /* @__PURE__ */ jsx(LastPageIcon, { fontSize: "small" })
@@ -610,7 +736,7 @@ var TIFFViewerContent = ({
610
736
  IconButton,
611
737
  {
612
738
  size: "small",
613
- onClick: toolbar.getHandler("print", onPrintClick),
739
+ onClick: toolbar.getHandler("print", onPrintClick || handlePrint),
614
740
  disabled: toolbar.isDisabled("print"),
615
741
  title: toolbar.getLabel("print") || "Print",
616
742
  "aria-label": "Print TIFF",
@@ -739,4 +865,4 @@ var TIFFViewer = (props) => {
739
865
  export {
740
866
  TIFFViewer
741
867
  };
742
- //# sourceMappingURL=chunk-QGL3ZOPD.mjs.map
868
+ //# sourceMappingURL=chunk-EI3EP65I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/TIFFViewer.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport * as UTIF from \"utif\";\nimport type { UTIFImage } from \"utif\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n // Annotation-related FileViewerProps (PDF only) — extract so they don't\n // leak onto the DOM via {...props} on <Box>.\n showAnnotations,\n userDetails,\n annotationSelectionMenu,\n isHighlighterActive,\n isStampActive,\n isNoteActive,\n onHighlighterClick,\n onStampClick,\n onSignatureClick,\n onNoteClick,\n permissions,\n isAnnotationForeign,\n onAnnotationNoteClick,\n isAnnotationInteractive,\n hasUnsavedAnnotations,\n isSavingAnnotations,\n canSaveAnnotations,\n onSaveAnnotations,\n onDownloadWithAnnotations,\n onDownloadWithoutAnnotations,\n onPrintWithAnnotations,\n onPrintWithoutAnnotations,\n showDownloadOriginal,\n showDownloadWithAnnotations,\n showPrintOriginal,\n showPrintWithAnnotations,\n showAnnotate,\n disabledAnnotate,\n showRotation,\n defaultFitToPage,\n loading,\n onPasswordRequest,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Local TIFF decoding state — used when no external pageLoader is provided\n // (e.g. direct file uploads in the demo). When pageLoader IS provided\n // (server-converted streaming flow), this remains inert.\n const [localTotalPages, setLocalTotalPages] = useState(0);\n const tiffSourceRef = useRef<{ buffer: ArrayBuffer; ifds: UTIFImage[] } | null>(null);\n\n // Prefer the locally-discovered count (UTIF parsed real IFDs) over the\n // prop, which can be stale or unset on older files whose server-side\n // metadata extraction predates the MEDIA_SERVICE_URL fix.\n const effectiveTotalPages = localTotalPages || totalPages;\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Decode a single TIFF IFD into a PNG ArrayBuffer using the cached source\n const decodeLocalPage = useCallback(\n async (pageIndex: number): Promise<ArrayBuffer | null> => {\n const source = tiffSourceRef.current;\n if (!source) return null;\n const image = source.ifds[pageIndex];\n if (!image) return null;\n UTIF.decodeImage(source.buffer, image);\n const rgba = UTIF.toRGBA8(image);\n const width = Number(image.width) || 0;\n const height = Number(image.height) || 0;\n if (!width || !height) return null;\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.putImageData(\n new ImageData(new Uint8ClampedArray(rgba), width, height),\n 0,\n 0\n );\n return await new Promise<ArrayBuffer | null>((resolve) => {\n canvas.toBlob(async (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve(await blob.arrayBuffer());\n }, \"image/png\");\n });\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Decode TIFF locally to discover page count (and, when no external\n // pageLoader is provided, also render pages locally).\n //\n // Two scenarios:\n // 1. No pageLoader (demo / direct upload): we fully own rendering —\n // decode page 1 to a PNG blob and display it. Subsequent pages\n // decoded on demand via handlePageChange.\n // 2. pageLoader provided (server-converted flow with the full decrypted\n // buffer available client-side, e.g. DMS-Client-Drive secure-view):\n // we still parse IFDs to discover the real page count, since the\n // server-side `properties.pageCount` metadata can be missing on\n // older files. pageLoader keeps handling per-page rendering.\n //\n // Skipped when only a `url` is provided alongside `pageLoader` — that\n // implies a controlled per-page fetch model we shouldn't bypass.\n useEffect(() => {\n if (!file && !url) {\n tiffSourceRef.current = null;\n setLocalTotalPages(0);\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n try {\n // Acquire raw bytes for UTIF.decode (IFD parsing only — cheap).\n let buffer: ArrayBuffer | null = null;\n if (file) {\n buffer = await file.arrayBuffer();\n } else if (url && !pageLoader) {\n buffer = await (await fetch(url)).arrayBuffer();\n }\n if (cancelled || !buffer) return;\n\n const ifds = UTIF.decode(buffer);\n if (!ifds.length) {\n throw new Error(\"No pages found in TIFF\");\n }\n\n tiffSourceRef.current = { buffer, ifds };\n setLocalTotalPages(ifds.length);\n\n // Only render locally when there's no external pageLoader.\n if (pageLoader) return;\n\n setInternalLoading(true);\n setError(null);\n setImageUrl(null);\n setImageSize(null);\n setPageImages((prev) => {\n prev.forEach((u) => URL.revokeObjectURL(u));\n return new Map();\n });\n\n const firstPage = await decodeLocalPage(0);\n if (cancelled) return;\n if (!firstPage) {\n throw new Error(\"Failed to decode TIFF page 1\");\n }\n updatePageImage(firstPage, 1);\n onLoad?.();\n } catch (err) {\n if (cancelled) return;\n const message =\n err instanceof Error ? err.message : \"Failed to decode TIFF\";\n // Surface error only when local decode is the rendering path;\n // when pageLoader handles rendering, its own error channel applies.\n if (!pageLoader) {\n setError(message);\n onError?.(new Error(message));\n } else {\n console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);\n }\n } finally {\n if (!cancelled && !pageLoader) setInternalLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n const hasExternalLoader = !!pageLoaderRef.current;\n const hasLocalSource = !!tiffSourceRef.current;\n if (!hasExternalLoader && !hasLocalSource) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setError(null);\n\n try {\n const pageData = hasExternalLoader\n ? await pageLoaderRef.current!(newPageNumber)\n : await decodeLocalPage(newPageNumber - 1);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n }\n },\n [pageImages, onError, updatePageImage, decodeLocalPage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n // Reset view state on new file/url. The actual imageUrl is set by either\n // the external pageLoader effect (server-converted flow) or the local\n // TIFF decode effect — both produce decoded PNG blobs, never raw TIFF,\n // since browsers can't render raw TIFF in <img>.\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n setIsLoading(false);\n },\n [file, url]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = effectiveTotalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(effectiveTotalPages);\n }, [handlePageChange, effectiveTotalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, effectiveTotalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, effectiveTotalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!document.fullscreenElement && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n } else if (document.fullscreenElement && document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, []);\n\n // Keep isFullScreen in sync with the actual fullscreen state so the\n // toolbar reflects Escape-to-exit and the next click re-enters cleanly.\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullScreen(!!document.fullscreenElement);\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n };\n }, []);\n\n // Default print handler — opens the current page image in a popup and\n // triggers the browser print dialog. Used when the host doesn't supply\n // an onPrintClick callback.\n const handlePrint = useCallback(() => {\n if (!imageUrl) return;\n const printWindow = window.open(\"\", \"_blank\", \"width=900,height=1200\");\n if (!printWindow) return;\n const doc = printWindow.document;\n doc.title = resolvedFileName || \"Document\";\n const style = doc.createElement(\"style\");\n style.textContent =\n \"@page { margin: 0.5cm; }\" +\n \"html, body { margin: 0; padding: 0; }\" +\n \"img { display: block; width: 100%; height: auto; page-break-after: always; }\";\n doc.head.appendChild(style);\n const img = doc.createElement(\"img\");\n img.alt = resolvedFileName || \"Document\";\n img.onload = () => {\n window.setTimeout(() => printWindow.print(), 100);\n };\n img.src = imageUrl;\n doc.body.appendChild(img);\n }, [imageUrl, resolvedFileName]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {effectiveTotalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === effectiveTotalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === effectiveTotalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick || handlePrint)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"],"mappings":"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","names":["imageUrl","width","height","url","style"]}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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; }"use client";
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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; }"use client";
2
2
 
3
3
 
4
4
  var _chunkOPJOCUSLjs = require('./chunk-OPJOCUSL.js');
@@ -41,6 +41,7 @@ var _Info = require('@mui/icons-material/Info'); var _Info2 = _interopRequireDef
41
41
  var _Description = require('@mui/icons-material/Description'); var _Description2 = _interopRequireDefault(_Description);
42
42
  var _History = require('@mui/icons-material/History'); var _History2 = _interopRequireDefault(_History);
43
43
  var _iconsmaterial = require('@mui/icons-material');
44
+ var _utif = require('utif'); var UTIF = _interopRequireWildcard(_utif);
44
45
  var _jsxruntime = require('react/jsx-runtime');
45
46
  var resolveDocumentName = (file, fileName, url) => {
46
47
  if (_optionalChain([file, 'optionalAccess', _ => _.name])) {
@@ -94,6 +95,40 @@ var TIFFViewerContent = ({
94
95
  autoExecuteSearch,
95
96
  onSearchComplete,
96
97
  toolbarActions,
98
+ // Annotation-related FileViewerProps (PDF only) — extract so they don't
99
+ // leak onto the DOM via {...props} on <Box>.
100
+ showAnnotations,
101
+ userDetails,
102
+ annotationSelectionMenu,
103
+ isHighlighterActive,
104
+ isStampActive,
105
+ isNoteActive,
106
+ onHighlighterClick,
107
+ onStampClick,
108
+ onSignatureClick,
109
+ onNoteClick,
110
+ permissions,
111
+ isAnnotationForeign,
112
+ onAnnotationNoteClick,
113
+ isAnnotationInteractive,
114
+ hasUnsavedAnnotations,
115
+ isSavingAnnotations,
116
+ canSaveAnnotations,
117
+ onSaveAnnotations,
118
+ onDownloadWithAnnotations,
119
+ onDownloadWithoutAnnotations,
120
+ onPrintWithAnnotations,
121
+ onPrintWithoutAnnotations,
122
+ showDownloadOriginal,
123
+ showDownloadWithAnnotations,
124
+ showPrintOriginal,
125
+ showPrintWithAnnotations,
126
+ showAnnotate,
127
+ disabledAnnotate,
128
+ showRotation,
129
+ defaultFitToPage,
130
+ loading,
131
+ onPasswordRequest,
97
132
  ...props
98
133
  }) => {
99
134
  const [currentPage, setCurrentPage] = _react.useState.call(void 0, 1);
@@ -105,7 +140,7 @@ var TIFFViewerContent = ({
105
140
  const [zoom, setZoom] = _react.useState.call(void 0, 100);
106
141
  const [viewportWidth, setViewportWidth] = _react.useState.call(void 0, 0);
107
142
  const [viewportHeight, setViewportHeight] = _react.useState.call(void 0, 0);
108
- const [isFullScreen, setIsFullScreen] = _react.useState.call(void 0, false);
143
+ const [, setIsFullScreen] = _react.useState.call(void 0, false);
109
144
  const [imageUrl, setImageUrl] = _react.useState.call(void 0, null);
110
145
  const [pageImages, setPageImages] = _react.useState.call(void 0, /* @__PURE__ */ new Map());
111
146
  const [internalLoading, setInternalLoading] = _react.useState.call(void 0, false);
@@ -117,6 +152,9 @@ var TIFFViewerContent = ({
117
152
  _react.useEffect.call(void 0, () => {
118
153
  pageLoaderRef.current = pageLoader;
119
154
  }, [pageLoader]);
155
+ const [localTotalPages, setLocalTotalPages] = _react.useState.call(void 0, 0);
156
+ const tiffSourceRef = _react.useRef.call(void 0, null);
157
+ const effectiveTotalPages = localTotalPages || totalPages;
120
158
  const updatePageImage = _react.useCallback.call(void 0,
121
159
  (pageData, pageNumber) => {
122
160
  const blob = new Blob([pageData]);
@@ -133,6 +171,39 @@ var TIFFViewerContent = ({
133
171
  },
134
172
  []
135
173
  );
174
+ const decodeLocalPage = _react.useCallback.call(void 0,
175
+ async (pageIndex) => {
176
+ const source = tiffSourceRef.current;
177
+ if (!source) return null;
178
+ const image = source.ifds[pageIndex];
179
+ if (!image) return null;
180
+ UTIF.decodeImage(source.buffer, image);
181
+ const rgba = UTIF.toRGBA8(image);
182
+ const width2 = Number(image.width) || 0;
183
+ const height2 = Number(image.height) || 0;
184
+ if (!width2 || !height2) return null;
185
+ const canvas = document.createElement("canvas");
186
+ canvas.width = width2;
187
+ canvas.height = height2;
188
+ const ctx = canvas.getContext("2d");
189
+ if (!ctx) return null;
190
+ ctx.putImageData(
191
+ new ImageData(new Uint8ClampedArray(rgba), width2, height2),
192
+ 0,
193
+ 0
194
+ );
195
+ return await new Promise((resolve) => {
196
+ canvas.toBlob(async (blob) => {
197
+ if (!blob) {
198
+ resolve(null);
199
+ return;
200
+ }
201
+ resolve(await blob.arrayBuffer());
202
+ }, "image/png");
203
+ });
204
+ },
205
+ []
206
+ );
136
207
  _react.useEffect.call(void 0, () => {
137
208
  const loadInitialPage = async () => {
138
209
  if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {
@@ -156,9 +227,66 @@ var TIFFViewerContent = ({
156
227
  };
157
228
  loadInitialPage();
158
229
  }, [pageImages, currentPage, updatePageImage, onError]);
230
+ _react.useEffect.call(void 0, () => {
231
+ if (!file && !url) {
232
+ tiffSourceRef.current = null;
233
+ setLocalTotalPages(0);
234
+ return;
235
+ }
236
+ let cancelled = false;
237
+ (async () => {
238
+ try {
239
+ let buffer = null;
240
+ if (file) {
241
+ buffer = await file.arrayBuffer();
242
+ } else if (url && !pageLoader) {
243
+ buffer = await (await fetch(url)).arrayBuffer();
244
+ }
245
+ if (cancelled || !buffer) return;
246
+ const ifds = UTIF.decode(buffer);
247
+ if (!ifds.length) {
248
+ throw new Error("No pages found in TIFF");
249
+ }
250
+ tiffSourceRef.current = { buffer, ifds };
251
+ setLocalTotalPages(ifds.length);
252
+ if (pageLoader) return;
253
+ setInternalLoading(true);
254
+ setError(null);
255
+ setImageUrl(null);
256
+ setImageSize(null);
257
+ setPageImages((prev) => {
258
+ prev.forEach((u) => URL.revokeObjectURL(u));
259
+ return /* @__PURE__ */ new Map();
260
+ });
261
+ const firstPage = await decodeLocalPage(0);
262
+ if (cancelled) return;
263
+ if (!firstPage) {
264
+ throw new Error("Failed to decode TIFF page 1");
265
+ }
266
+ updatePageImage(firstPage, 1);
267
+ _optionalChain([onLoad, 'optionalCall', _11 => _11()]);
268
+ } catch (err) {
269
+ if (cancelled) return;
270
+ const message = err instanceof Error ? err.message : "Failed to decode TIFF";
271
+ if (!pageLoader) {
272
+ setError(message);
273
+ _optionalChain([onError, 'optionalCall', _12 => _12(new Error(message))]);
274
+ } else {
275
+ console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);
276
+ }
277
+ } finally {
278
+ if (!cancelled && !pageLoader) setInternalLoading(false);
279
+ }
280
+ })();
281
+ return () => {
282
+ cancelled = true;
283
+ };
284
+ }, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);
159
285
  const handlePageChange = _react.useCallback.call(void 0,
160
286
  async (newPageNumber) => {
161
- if (!pageLoaderRef.current) {
287
+ const hasExternalLoader = !!pageLoaderRef.current;
288
+ const hasLocalSource = !!tiffSourceRef.current;
289
+ if (!hasExternalLoader && !hasLocalSource) {
162
290
  console.warn("pageLoader not provided - page navigation disabled");
163
291
  return;
164
292
  }
@@ -168,10 +296,9 @@ var TIFFViewerContent = ({
168
296
  setImageUrl(cachedUrl);
169
297
  return;
170
298
  }
171
- setInternalLoading(true);
172
299
  setError(null);
173
300
  try {
174
- const pageData = await pageLoaderRef.current(newPageNumber);
301
+ const pageData = hasExternalLoader ? await pageLoaderRef.current(newPageNumber) : await decodeLocalPage(newPageNumber - 1);
175
302
  if (pageData) {
176
303
  updatePageImage(pageData, newPageNumber);
177
304
  } else {
@@ -180,12 +307,10 @@ var TIFFViewerContent = ({
180
307
  } catch (err) {
181
308
  const message = err instanceof Error ? err.message : `Unable to load page ${newPageNumber}`;
182
309
  setError(message);
183
- _optionalChain([onError, 'optionalCall', _11 => _11(new Error(message))]);
184
- } finally {
185
- setInternalLoading(false);
310
+ _optionalChain([onError, 'optionalCall', _13 => _13(new Error(message))]);
186
311
  }
187
312
  },
188
- [pageImages, onError, updatePageImage]
313
+ [pageImages, onError, updatePageImage, decodeLocalPage]
189
314
  );
190
315
  const resolvedFileName = _react.useMemo.call(void 0,
191
316
  () => fileName || sourceDescription,
@@ -205,37 +330,14 @@ var TIFFViewerContent = ({
205
330
  }
206
331
  setIsLoading(true);
207
332
  setError(null);
208
- try {
209
- let imageDataUrl;
210
- if (file) {
211
- imageDataUrl = URL.createObjectURL(file);
212
- } else if (url) {
213
- imageDataUrl = url;
214
- } else {
215
- throw new Error("No file or URL provided");
216
- }
217
- setImageUrl(imageDataUrl);
218
- if (resetPage) {
219
- setCurrentPage(1);
220
- setFitMode("fit-page");
221
- setZoom(100);
222
- }
223
- _optionalChain([onLoad, 'optionalCall', _12 => _12()]);
224
- } catch (err) {
225
- const message = err instanceof Error ? err.message : "Unable to load image file";
226
- setError(message);
227
- setImageUrl(null);
228
- if (resetPage) {
229
- setCurrentPage(1);
230
- setFitMode("fit-width");
231
- setZoom(100);
232
- }
233
- _optionalChain([onError, 'optionalCall', _13 => _13(new Error(message))]);
234
- } finally {
235
- setIsLoading(false);
333
+ if (resetPage) {
334
+ setCurrentPage(1);
335
+ setFitMode("fit-page");
336
+ setZoom(100);
236
337
  }
338
+ setIsLoading(false);
237
339
  },
238
- [file, url, onLoad, onError]
340
+ [file, url]
239
341
  );
240
342
  const [previousFileSource, setPreviousFileSource] = _react.useState.call(void 0, {});
241
343
  _react.useEffect.call(void 0, () => {
@@ -259,7 +361,7 @@ var TIFFViewerContent = ({
259
361
  };
260
362
  }, []);
261
363
  const hasImage = !!imageUrl;
262
- const hasMultiplePages = totalPages > 1;
364
+ const hasMultiplePages = effectiveTotalPages > 1;
263
365
  const MARGIN = 40;
264
366
  const MIN_ZOOM = 25;
265
367
  const MAX_ZOOM = 400;
@@ -345,8 +447,8 @@ var TIFFViewerContent = ({
345
447
  handlePageChange(1);
346
448
  }, [handlePageChange]);
347
449
  const handleLastPage = _react.useCallback.call(void 0, () => {
348
- handlePageChange(totalPages);
349
- }, [handlePageChange, totalPages]);
450
+ handlePageChange(effectiveTotalPages);
451
+ }, [handlePageChange, effectiveTotalPages]);
350
452
  const handlePreviousPage = _react.useCallback.call(void 0, () => {
351
453
  const newPage = Math.max(currentPage - 1, 1);
352
454
  if (newPage !== currentPage) {
@@ -354,20 +456,44 @@ var TIFFViewerContent = ({
354
456
  }
355
457
  }, [currentPage, handlePageChange]);
356
458
  const handleNextPage = _react.useCallback.call(void 0, () => {
357
- const newPage = Math.min(currentPage + 1, totalPages);
459
+ const newPage = Math.min(currentPage + 1, effectiveTotalPages);
358
460
  if (newPage !== currentPage) {
359
461
  handlePageChange(newPage);
360
462
  }
361
- }, [currentPage, totalPages, handlePageChange]);
463
+ }, [currentPage, effectiveTotalPages, handlePageChange]);
362
464
  const handleToggleFullScreen = _react.useCallback.call(void 0, () => {
363
- if (!isFullScreen && _optionalChain([containerRef, 'access', _17 => _17.current, 'optionalAccess', _18 => _18.requestFullscreen])) {
465
+ if (!document.fullscreenElement && _optionalChain([containerRef, 'access', _17 => _17.current, 'optionalAccess', _18 => _18.requestFullscreen])) {
364
466
  containerRef.current.requestFullscreen();
365
- setIsFullScreen(true);
366
- } else if (isFullScreen && document.exitFullscreen) {
467
+ } else if (document.fullscreenElement && document.exitFullscreen) {
367
468
  document.exitFullscreen();
368
- setIsFullScreen(false);
369
469
  }
370
- }, [isFullScreen]);
470
+ }, []);
471
+ _react.useEffect.call(void 0, () => {
472
+ const onFullscreenChange = () => {
473
+ setIsFullScreen(!!document.fullscreenElement);
474
+ };
475
+ document.addEventListener("fullscreenchange", onFullscreenChange);
476
+ return () => {
477
+ document.removeEventListener("fullscreenchange", onFullscreenChange);
478
+ };
479
+ }, []);
480
+ const handlePrint = _react.useCallback.call(void 0, () => {
481
+ if (!imageUrl) return;
482
+ const printWindow = window.open("", "_blank", "width=900,height=1200");
483
+ if (!printWindow) return;
484
+ const doc = printWindow.document;
485
+ doc.title = resolvedFileName || "Document";
486
+ const style2 = doc.createElement("style");
487
+ style2.textContent = "@page { margin: 0.5cm; }html, body { margin: 0; padding: 0; }img { display: block; width: 100%; height: auto; page-break-after: always; }";
488
+ doc.head.appendChild(style2);
489
+ const img = doc.createElement("img");
490
+ img.alt = resolvedFileName || "Document";
491
+ img.onload = () => {
492
+ window.setTimeout(() => printWindow.print(), 100);
493
+ };
494
+ img.src = imageUrl;
495
+ doc.body.appendChild(img);
496
+ }, [imageUrl, resolvedFileName]);
371
497
  const toolbar = _chunkEM63H4SAjs.mergeToolbarConfig.call(void 0, {
372
498
  showDownload,
373
499
  showPrint,
@@ -511,7 +637,7 @@ var TIFFViewerContent = ({
511
637
  "Page ",
512
638
  currentPage,
513
639
  " of ",
514
- totalPages
640
+ effectiveTotalPages
515
641
  ]
516
642
  }
517
643
  ),
@@ -520,7 +646,7 @@ var TIFFViewerContent = ({
520
646
  {
521
647
  size: "small",
522
648
  onClick: handleNextPage,
523
- disabled: currentPage === totalPages,
649
+ disabled: currentPage === effectiveTotalPages,
524
650
  title: "Next Page",
525
651
  "aria-label": "Go to next page",
526
652
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ChevronRight2.default, { fontSize: "small" })
@@ -531,7 +657,7 @@ var TIFFViewerContent = ({
531
657
  {
532
658
  size: "small",
533
659
  onClick: handleLastPage,
534
- disabled: currentPage === totalPages,
660
+ disabled: currentPage === effectiveTotalPages,
535
661
  title: "Last Page",
536
662
  "aria-label": "Go to last page",
537
663
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _LastPage2.default, { fontSize: "small" })
@@ -610,7 +736,7 @@ var TIFFViewerContent = ({
610
736
  _material.IconButton,
611
737
  {
612
738
  size: "small",
613
- onClick: toolbar.getHandler("print", onPrintClick),
739
+ onClick: toolbar.getHandler("print", onPrintClick || handlePrint),
614
740
  disabled: toolbar.isDisabled("print"),
615
741
  title: toolbar.getLabel("print") || "Print",
616
742
  "aria-label": "Print TIFF",
@@ -739,4 +865,4 @@ var TIFFViewer = (props) => {
739
865
 
740
866
 
741
867
  exports.TIFFViewer = TIFFViewer;
742
- //# sourceMappingURL=chunk-MJYCPSD4.js.map
868
+ //# sourceMappingURL=chunk-MPTCXAXO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MPTCXAXO.js","../src/components/viewers/TIFFViewer.tsx"],"names":["imageUrl","width","height"],"mappings":"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","file":"/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MPTCXAXO.js","sourcesContent":[null,"import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport * as UTIF from \"utif\";\nimport type { UTIFImage } from \"utif\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n // Annotation-related FileViewerProps (PDF only) — extract so they don't\n // leak onto the DOM via {...props} on <Box>.\n showAnnotations,\n userDetails,\n annotationSelectionMenu,\n isHighlighterActive,\n isStampActive,\n isNoteActive,\n onHighlighterClick,\n onStampClick,\n onSignatureClick,\n onNoteClick,\n permissions,\n isAnnotationForeign,\n onAnnotationNoteClick,\n isAnnotationInteractive,\n hasUnsavedAnnotations,\n isSavingAnnotations,\n canSaveAnnotations,\n onSaveAnnotations,\n onDownloadWithAnnotations,\n onDownloadWithoutAnnotations,\n onPrintWithAnnotations,\n onPrintWithoutAnnotations,\n showDownloadOriginal,\n showDownloadWithAnnotations,\n showPrintOriginal,\n showPrintWithAnnotations,\n showAnnotate,\n disabledAnnotate,\n showRotation,\n defaultFitToPage,\n loading,\n onPasswordRequest,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Local TIFF decoding state — used when no external pageLoader is provided\n // (e.g. direct file uploads in the demo). When pageLoader IS provided\n // (server-converted streaming flow), this remains inert.\n const [localTotalPages, setLocalTotalPages] = useState(0);\n const tiffSourceRef = useRef<{ buffer: ArrayBuffer; ifds: UTIFImage[] } | null>(null);\n\n // Prefer the locally-discovered count (UTIF parsed real IFDs) over the\n // prop, which can be stale or unset on older files whose server-side\n // metadata extraction predates the MEDIA_SERVICE_URL fix.\n const effectiveTotalPages = localTotalPages || totalPages;\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Decode a single TIFF IFD into a PNG ArrayBuffer using the cached source\n const decodeLocalPage = useCallback(\n async (pageIndex: number): Promise<ArrayBuffer | null> => {\n const source = tiffSourceRef.current;\n if (!source) return null;\n const image = source.ifds[pageIndex];\n if (!image) return null;\n UTIF.decodeImage(source.buffer, image);\n const rgba = UTIF.toRGBA8(image);\n const width = Number(image.width) || 0;\n const height = Number(image.height) || 0;\n if (!width || !height) return null;\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.putImageData(\n new ImageData(new Uint8ClampedArray(rgba), width, height),\n 0,\n 0\n );\n return await new Promise<ArrayBuffer | null>((resolve) => {\n canvas.toBlob(async (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve(await blob.arrayBuffer());\n }, \"image/png\");\n });\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Decode TIFF locally to discover page count (and, when no external\n // pageLoader is provided, also render pages locally).\n //\n // Two scenarios:\n // 1. No pageLoader (demo / direct upload): we fully own rendering —\n // decode page 1 to a PNG blob and display it. Subsequent pages\n // decoded on demand via handlePageChange.\n // 2. pageLoader provided (server-converted flow with the full decrypted\n // buffer available client-side, e.g. DMS-Client-Drive secure-view):\n // we still parse IFDs to discover the real page count, since the\n // server-side `properties.pageCount` metadata can be missing on\n // older files. pageLoader keeps handling per-page rendering.\n //\n // Skipped when only a `url` is provided alongside `pageLoader` — that\n // implies a controlled per-page fetch model we shouldn't bypass.\n useEffect(() => {\n if (!file && !url) {\n tiffSourceRef.current = null;\n setLocalTotalPages(0);\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n try {\n // Acquire raw bytes for UTIF.decode (IFD parsing only — cheap).\n let buffer: ArrayBuffer | null = null;\n if (file) {\n buffer = await file.arrayBuffer();\n } else if (url && !pageLoader) {\n buffer = await (await fetch(url)).arrayBuffer();\n }\n if (cancelled || !buffer) return;\n\n const ifds = UTIF.decode(buffer);\n if (!ifds.length) {\n throw new Error(\"No pages found in TIFF\");\n }\n\n tiffSourceRef.current = { buffer, ifds };\n setLocalTotalPages(ifds.length);\n\n // Only render locally when there's no external pageLoader.\n if (pageLoader) return;\n\n setInternalLoading(true);\n setError(null);\n setImageUrl(null);\n setImageSize(null);\n setPageImages((prev) => {\n prev.forEach((u) => URL.revokeObjectURL(u));\n return new Map();\n });\n\n const firstPage = await decodeLocalPage(0);\n if (cancelled) return;\n if (!firstPage) {\n throw new Error(\"Failed to decode TIFF page 1\");\n }\n updatePageImage(firstPage, 1);\n onLoad?.();\n } catch (err) {\n if (cancelled) return;\n const message =\n err instanceof Error ? err.message : \"Failed to decode TIFF\";\n // Surface error only when local decode is the rendering path;\n // when pageLoader handles rendering, its own error channel applies.\n if (!pageLoader) {\n setError(message);\n onError?.(new Error(message));\n } else {\n console.warn(`[TIFFViewer] Local IFD count failed: ${message}`);\n }\n } finally {\n if (!cancelled && !pageLoader) setInternalLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [file, url, pageLoader, decodeLocalPage, updatePageImage, onLoad, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n const hasExternalLoader = !!pageLoaderRef.current;\n const hasLocalSource = !!tiffSourceRef.current;\n if (!hasExternalLoader && !hasLocalSource) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setError(null);\n\n try {\n const pageData = hasExternalLoader\n ? await pageLoaderRef.current!(newPageNumber)\n : await decodeLocalPage(newPageNumber - 1);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n }\n },\n [pageImages, onError, updatePageImage, decodeLocalPage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n // Reset view state on new file/url. The actual imageUrl is set by either\n // the external pageLoader effect (server-converted flow) or the local\n // TIFF decode effect — both produce decoded PNG blobs, never raw TIFF,\n // since browsers can't render raw TIFF in <img>.\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n setIsLoading(false);\n },\n [file, url]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = effectiveTotalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(effectiveTotalPages);\n }, [handlePageChange, effectiveTotalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, effectiveTotalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, effectiveTotalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!document.fullscreenElement && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n } else if (document.fullscreenElement && document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, []);\n\n // Keep isFullScreen in sync with the actual fullscreen state so the\n // toolbar reflects Escape-to-exit and the next click re-enters cleanly.\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullScreen(!!document.fullscreenElement);\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n };\n }, []);\n\n // Default print handler — opens the current page image in a popup and\n // triggers the browser print dialog. Used when the host doesn't supply\n // an onPrintClick callback.\n const handlePrint = useCallback(() => {\n if (!imageUrl) return;\n const printWindow = window.open(\"\", \"_blank\", \"width=900,height=1200\");\n if (!printWindow) return;\n const doc = printWindow.document;\n doc.title = resolvedFileName || \"Document\";\n const style = doc.createElement(\"style\");\n style.textContent =\n \"@page { margin: 0.5cm; }\" +\n \"html, body { margin: 0; padding: 0; }\" +\n \"img { display: block; width: 100%; height: auto; page-break-after: always; }\";\n doc.head.appendChild(style);\n const img = doc.createElement(\"img\");\n img.alt = resolvedFileName || \"Document\";\n img.onload = () => {\n window.setTimeout(() => printWindow.print(), 100);\n };\n img.src = imageUrl;\n doc.body.appendChild(img);\n }, [imageUrl, resolvedFileName]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {effectiveTotalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === effectiveTotalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === effectiveTotalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick || handlePrint)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"]}
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkMJYCPSD4js = require('../../chunk-MJYCPSD4.js');
4
+ var _chunkMPTCXAXOjs = require('../../chunk-MPTCXAXO.js');
5
5
  require('../../chunk-OPJOCUSL.js');
6
6
  require('../../chunk-EM63H4SA.js');
7
7
 
8
8
 
9
- exports.TIFFViewer = _chunkMJYCPSD4js.TIFFViewer;
9
+ exports.TIFFViewer = _chunkMPTCXAXOjs.TIFFViewer;
10
10
  //# sourceMappingURL=TIFFViewer.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  TIFFViewer
4
- } from "../../chunk-QGL3ZOPD.mjs";
4
+ } from "../../chunk-EI3EP65I.mjs";
5
5
  import "../../chunk-KJNOBIUZ.mjs";
6
6
  import "../../chunk-7PMZ4GN5.mjs";
7
7
  export {
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var _chunk7P6WEBHNjs = require('./chunk-7P6WEBHN.js');
14
14
  require('./chunk-ECZ6IBOS.js');
15
15
 
16
16
 
17
- var _chunkMJYCPSD4js = require('./chunk-MJYCPSD4.js');
17
+ var _chunkMPTCXAXOjs = require('./chunk-MPTCXAXO.js');
18
18
 
19
19
 
20
20
  var _chunkCIWCHSAAjs = require('./chunk-CIWCHSAA.js');
@@ -301,5 +301,5 @@ var LockModeType = /* @__PURE__ */ ((LockModeType2) => {
301
301
 
302
302
 
303
303
 
304
- exports.AudioViewer = _chunk2BLHLWNNjs.AudioViewer; exports.DefaultViewer = _chunkD7SDEVDMjs.DefaultViewer; exports.FileIcon = _chunkEM63H4SAjs.FileIcon_default; exports.FileViewer = FileViewer; exports.ImageViewer = _chunkQV63FULEjs.ImageViewer; exports.LockModeType = LockModeType; exports.PDFViewer = _chunk7P6WEBHNjs.PDFViewer; exports.TIFFViewer = _chunkMJYCPSD4js.TIFFViewer; exports.TextViewer = _chunkCIWCHSAAjs.TextViewer; exports.VideoViewer = _chunk6BRYDA3Bjs.VideoViewer; exports.dynamicViewerRegistry = dynamicViewerRegistry; exports.getFileExtension = _chunkOPJOCUSLjs.getFileExtension; exports.getMimeTypeFromExtension = _chunkOPJOCUSLjs.getMimeTypeFromExtension; exports.getViewerComponent = getViewerComponent; exports.getViewerInfo = getViewerInfo;
304
+ exports.AudioViewer = _chunk2BLHLWNNjs.AudioViewer; exports.DefaultViewer = _chunkD7SDEVDMjs.DefaultViewer; exports.FileIcon = _chunkEM63H4SAjs.FileIcon_default; exports.FileViewer = FileViewer; exports.ImageViewer = _chunkQV63FULEjs.ImageViewer; exports.LockModeType = LockModeType; exports.PDFViewer = _chunk7P6WEBHNjs.PDFViewer; exports.TIFFViewer = _chunkMPTCXAXOjs.TIFFViewer; exports.TextViewer = _chunkCIWCHSAAjs.TextViewer; exports.VideoViewer = _chunk6BRYDA3Bjs.VideoViewer; exports.dynamicViewerRegistry = dynamicViewerRegistry; exports.getFileExtension = _chunkOPJOCUSLjs.getFileExtension; exports.getMimeTypeFromExtension = _chunkOPJOCUSLjs.getMimeTypeFromExtension; exports.getViewerComponent = getViewerComponent; exports.getViewerInfo = getViewerInfo;
305
305
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  import "./chunk-KQCU7XW2.mjs";
15
15
  import {
16
16
  TIFFViewer
17
- } from "./chunk-QGL3ZOPD.mjs";
17
+ } from "./chunk-EI3EP65I.mjs";
18
18
  import {
19
19
  TextViewer
20
20
  } from "./chunk-IJMNPAXX.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cannymindstech/file-viewers",
3
- "version": "0.27.9",
3
+ "version": "0.27.11",
4
4
  "description": "File viewer components library with dynamic loading",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -22,7 +22,8 @@
22
22
  "dependencies": {
23
23
  "@cannymindstech/pdf-viewer": "^0.7.7",
24
24
  "pdf-lib": "^1.17.1",
25
- "react-window": "^1.8.10"
25
+ "react-window": "^1.8.10",
26
+ "utif": "^3.1.0"
26
27
  },
27
28
  "peerDependencies": {
28
29
  "@emotion/react": "^11.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MJYCPSD4.js","../src/components/viewers/TIFFViewer.tsx"],"names":["imageUrl"],"mappings":"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","file":"/home/premkumar/Documents/GitHub/DMS-File-Viewers/packages/lib/dist/chunk-MJYCPSD4.js","sourcesContent":[null,"import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [isFullScreen, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n if (!pageLoaderRef.current) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(newPageNumber);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n },\n [pageImages, onError, updatePageImage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n let imageDataUrl: string;\n if (file) {\n imageDataUrl = URL.createObjectURL(file);\n } else if (url) {\n imageDataUrl = url;\n } else {\n throw new Error(\"No file or URL provided\");\n }\n\n setImageUrl(imageDataUrl);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n onLoad?.();\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load image file\";\n setError(message);\n setImageUrl(null);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-width\");\n setZoom(100);\n }\n onError?.(new Error(message));\n } finally {\n setIsLoading(false);\n }\n },\n [file, url, onLoad, onError]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = totalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(totalPages);\n }, [handlePageChange, totalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, totalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, totalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n setIsFullScreen(true);\n } else if (isFullScreen && document.exitFullscreen) {\n document.exitFullscreen();\n setIsFullScreen(false);\n }\n }, [isFullScreen]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {totalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === totalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/viewers/TIFFViewer.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [isFullScreen, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n if (!pageLoaderRef.current) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(newPageNumber);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n },\n [pageImages, onError, updatePageImage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n let imageDataUrl: string;\n if (file) {\n imageDataUrl = URL.createObjectURL(file);\n } else if (url) {\n imageDataUrl = url;\n } else {\n throw new Error(\"No file or URL provided\");\n }\n\n setImageUrl(imageDataUrl);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n onLoad?.();\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load image file\";\n setError(message);\n setImageUrl(null);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-width\");\n setZoom(100);\n }\n onError?.(new Error(message));\n } finally {\n setIsLoading(false);\n }\n },\n [file, url, onLoad, onError]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = totalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(totalPages);\n }, [handlePageChange, totalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, totalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, totalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n setIsFullScreen(true);\n } else if (isFullScreen && document.exitFullscreen) {\n document.exitFullscreen();\n setIsFullScreen(false);\n }\n }, [isFullScreen]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {totalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === totalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"],"mappings":"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","names":["imageUrl","url"]}