@cannyminds/dms-file-viewers 0.2.0 → 0.4.0

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.
Files changed (81) hide show
  1. package/dist/{chunk-FZYMVHF6.mjs → chunk-4DJJINTB.mjs} +54 -55
  2. package/dist/chunk-4DJJINTB.mjs.map +1 -0
  3. package/dist/chunk-677DWENS.mjs +133 -0
  4. package/dist/chunk-677DWENS.mjs.map +1 -0
  5. package/dist/chunk-77UARJVQ.js +133 -0
  6. package/dist/chunk-77UARJVQ.js.map +1 -0
  7. package/dist/{chunk-LKBM4O47.mjs → chunk-7BLEPGZ4.mjs} +67 -61
  8. package/dist/chunk-7BLEPGZ4.mjs.map +1 -0
  9. package/dist/{chunk-QRYIHDRT.mjs → chunk-BHMFZTZ7.mjs} +54 -55
  10. package/dist/chunk-BHMFZTZ7.mjs.map +1 -0
  11. package/dist/{chunk-XQBXRMB7.mjs → chunk-BONT4K3R.mjs} +14 -8
  12. package/dist/chunk-BONT4K3R.mjs.map +1 -0
  13. package/dist/{chunk-3STHCDAC.js → chunk-DDT3GC3C.js} +425 -164
  14. package/dist/chunk-DDT3GC3C.js.map +1 -0
  15. package/dist/{chunk-EMP7RZM2.js → chunk-DOOYIHGW.js} +52 -53
  16. package/dist/chunk-DOOYIHGW.js.map +1 -0
  17. package/dist/{chunk-73ZIFR3P.mjs → chunk-J2YW5DHC.mjs} +457 -196
  18. package/dist/chunk-J2YW5DHC.mjs.map +1 -0
  19. package/dist/{chunk-BNHQYEZ7.js → chunk-SBEFC7HP.js} +203 -158
  20. package/dist/chunk-SBEFC7HP.js.map +1 -0
  21. package/dist/{chunk-4RL77HKO.js → chunk-SNEIVT4R.js} +52 -53
  22. package/dist/chunk-SNEIVT4R.js.map +1 -0
  23. package/dist/{chunk-7JTIG6OU.js → chunk-WP55NYFS.js} +67 -61
  24. package/dist/chunk-WP55NYFS.js.map +1 -0
  25. package/dist/{chunk-NOLXOOIP.mjs → chunk-YHMHDPLQ.mjs} +200 -155
  26. package/dist/chunk-YHMHDPLQ.mjs.map +1 -0
  27. package/dist/{chunk-GNWU6XHH.js → chunk-Z3IUTTJQ.js} +15 -9
  28. package/dist/{chunk-GNWU6XHH.js.map → chunk-Z3IUTTJQ.js.map} +1 -1
  29. package/dist/components/viewers/AudioViewer.d.mts +1 -1
  30. package/dist/components/viewers/AudioViewer.d.ts +1 -1
  31. package/dist/components/viewers/AudioViewer.js +2 -2
  32. package/dist/components/viewers/AudioViewer.mjs +1 -1
  33. package/dist/components/viewers/DefaultViewer.d.mts +1 -1
  34. package/dist/components/viewers/DefaultViewer.d.ts +1 -1
  35. package/dist/components/viewers/DefaultViewer.js +3 -2
  36. package/dist/components/viewers/DefaultViewer.js.map +1 -1
  37. package/dist/components/viewers/DefaultViewer.mjs +2 -1
  38. package/dist/components/viewers/ImageViewer.d.mts +1 -1
  39. package/dist/components/viewers/ImageViewer.d.ts +1 -1
  40. package/dist/components/viewers/ImageViewer.js +3 -3
  41. package/dist/components/viewers/ImageViewer.mjs +2 -2
  42. package/dist/components/viewers/PDFViewer.d.mts +1 -1
  43. package/dist/components/viewers/PDFViewer.d.ts +1 -1
  44. package/dist/components/viewers/PDFViewer.js +2 -2
  45. package/dist/components/viewers/PDFViewer.mjs +1 -1
  46. package/dist/components/viewers/TIFFViewer.d.mts +1 -1
  47. package/dist/components/viewers/TIFFViewer.d.ts +1 -1
  48. package/dist/components/viewers/TIFFViewer.js +2 -2
  49. package/dist/components/viewers/TIFFViewer.mjs +1 -1
  50. package/dist/components/viewers/TextViewer.d.mts +1 -1
  51. package/dist/components/viewers/TextViewer.d.ts +1 -1
  52. package/dist/components/viewers/TextViewer.js +2 -2
  53. package/dist/components/viewers/TextViewer.mjs +1 -1
  54. package/dist/components/viewers/VideoViewer.d.mts +1 -1
  55. package/dist/components/viewers/VideoViewer.d.ts +1 -1
  56. package/dist/components/viewers/VideoViewer.js +2 -2
  57. package/dist/components/viewers/VideoViewer.mjs +1 -1
  58. package/dist/index.d.mts +2 -2
  59. package/dist/index.d.ts +2 -2
  60. package/dist/index.js +30 -19
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +29 -18
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/{types-CquKzJLE.d.mts → types-C6IEfcTM.d.mts} +13 -1
  65. package/dist/{types-CquKzJLE.d.ts → types-C6IEfcTM.d.ts} +13 -1
  66. package/package.json +1 -1
  67. package/dist/chunk-3STHCDAC.js.map +0 -1
  68. package/dist/chunk-4RL77HKO.js.map +0 -1
  69. package/dist/chunk-73ZIFR3P.mjs.map +0 -1
  70. package/dist/chunk-7JTIG6OU.js.map +0 -1
  71. package/dist/chunk-BNHQYEZ7.js.map +0 -1
  72. package/dist/chunk-EMP7RZM2.js.map +0 -1
  73. package/dist/chunk-FZYMVHF6.mjs.map +0 -1
  74. package/dist/chunk-LKBM4O47.mjs.map +0 -1
  75. package/dist/chunk-NOLXOOIP.mjs.map +0 -1
  76. package/dist/chunk-QLJKOQTP.mjs +0 -78
  77. package/dist/chunk-QLJKOQTP.mjs.map +0 -1
  78. package/dist/chunk-QRYIHDRT.mjs.map +0 -1
  79. package/dist/chunk-XQBXRMB7.mjs.map +0 -1
  80. package/dist/chunk-Z7FUO5RX.js +0 -78
  81. package/dist/chunk-Z7FUO5RX.js.map +0 -1
@@ -5,9 +5,11 @@ import {
5
5
  } from "./chunk-QQDQJ7TS.mjs";
6
6
 
7
7
  // src/components/viewers/VideoViewer.tsx
8
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
9
- import { Box, Card, CardContent, CardHeader, LinearProgress, Typography, IconButton, Tooltip } from "@mui/material";
8
+ import { useEffect, useMemo, useRef, useState } from "react";
9
+ import { Box, Card, CardContent, CardHeader, LinearProgress, Typography, Stack, IconButton, Tooltip } from "@mui/material";
10
10
  import DownloadIcon from "@mui/icons-material/Download";
11
+ import InfoIcon from "@mui/icons-material/Info";
12
+ import DescriptionIcon from "@mui/icons-material/Description";
11
13
  import { jsx, jsxs } from "react/jsx-runtime";
12
14
  var VideoViewer = ({
13
15
  file,
@@ -20,21 +22,26 @@ var VideoViewer = ({
20
22
  onLoad,
21
23
  onError,
22
24
  onDownloadClick,
23
- // Filter out props that shouldn't be passed to DOM
24
- mimeType: _mimeType,
25
- fileSize: _fileSize,
26
- showPageCount: _showPageCount,
27
- showPageNavigation: _showPageNavigation,
28
- showZoomControls: _showZoomControls,
29
- showDownload: _showDownload,
30
- showPrint: _showPrint,
31
- showSearch: _showSearch,
32
- showMetadata: _showMetadata,
33
- showProperties: _showProperties,
34
- onMetadataClick: _onMetadataClick,
35
- onPropertiesClick: _onPropertiesClick,
36
- onPrintClick: _onPrintClick,
37
- customRegistry: _customRegistry,
25
+ onMetadataClick,
26
+ onPropertiesClick,
27
+ showMetadata = true,
28
+ showProperties = true,
29
+ // Extract props that shouldn't be passed to DOM elements
30
+ mimeType,
31
+ fileSize,
32
+ showPageCount,
33
+ showPageNavigation,
34
+ showZoomControls,
35
+ showDownload,
36
+ showPrint,
37
+ showSearch,
38
+ onPrintClick,
39
+ customRegistry,
40
+ initialSearchText,
41
+ initialSearchPages,
42
+ autoOpenSearch,
43
+ autoExecuteSearch,
44
+ onSearchComplete,
38
45
  ...props
39
46
  }) => {
40
47
  const videoRef = useRef(null);
@@ -94,35 +101,6 @@ var VideoViewer = ({
94
101
  () => getFileExtension(resolvedFileName || ""),
95
102
  [resolvedFileName]
96
103
  );
97
- const handleDownload = useCallback(async () => {
98
- if (!file && !url) return;
99
- try {
100
- let blob;
101
- let filename = resolvedFileName || "video.mp4";
102
- if (file) {
103
- blob = file;
104
- filename = file.name;
105
- } else if (url) {
106
- const response = await fetch(url);
107
- if (!response.ok) {
108
- throw new Error(`Failed to fetch video (${response.status})`);
109
- }
110
- blob = await response.blob();
111
- } else {
112
- return;
113
- }
114
- const downloadUrl = URL.createObjectURL(blob);
115
- const link = document.createElement("a");
116
- link.href = downloadUrl;
117
- link.download = filename;
118
- document.body.appendChild(link);
119
- link.click();
120
- document.body.removeChild(link);
121
- URL.revokeObjectURL(downloadUrl);
122
- } catch (err) {
123
- onError?.(err instanceof Error ? err : new Error("Download failed"));
124
- }
125
- }, [file, url, resolvedFileName, onError]);
126
104
  return /* @__PURE__ */ jsx(
127
105
  Box,
128
106
  {
@@ -135,14 +113,35 @@ var VideoViewer = ({
135
113
  {
136
114
  avatar: /* @__PURE__ */ jsx(FileIcon_default, { ext: fileExtension, size: 32 }),
137
115
  title: /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
138
- action: /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
139
- IconButton,
140
- {
141
- size: "small",
142
- onClick: onDownloadClick,
143
- children: /* @__PURE__ */ jsx(DownloadIcon, {})
144
- }
145
- ) }),
116
+ action: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
117
+ /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
118
+ IconButton,
119
+ {
120
+ size: "small",
121
+ onClick: onDownloadClick,
122
+ "aria-label": "Download video",
123
+ children: /* @__PURE__ */ jsx(DownloadIcon, {})
124
+ }
125
+ ) }),
126
+ showMetadata && /* @__PURE__ */ jsx(Tooltip, { title: "Document Metadata", children: /* @__PURE__ */ jsx(
127
+ IconButton,
128
+ {
129
+ size: "small",
130
+ onClick: onMetadataClick,
131
+ "aria-label": "View document metadata",
132
+ children: /* @__PURE__ */ jsx(InfoIcon, {})
133
+ }
134
+ ) }),
135
+ showProperties && /* @__PURE__ */ jsx(Tooltip, { title: "Document Properties", children: /* @__PURE__ */ jsx(
136
+ IconButton,
137
+ {
138
+ size: "small",
139
+ onClick: onPropertiesClick,
140
+ "aria-label": "View document properties",
141
+ children: /* @__PURE__ */ jsx(DescriptionIcon, {})
142
+ }
143
+ ) })
144
+ ] }),
146
145
  sx: { pb: 1.5 }
147
146
  }
148
147
  ),
@@ -193,4 +192,4 @@ var VideoViewer = ({
193
192
  export {
194
193
  VideoViewer
195
194
  };
196
- //# sourceMappingURL=chunk-QRYIHDRT.mjs.map
195
+ //# sourceMappingURL=chunk-BHMFZTZ7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/VideoViewer.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Card, CardContent, CardHeader, LinearProgress, Typography, Stack, IconButton, Tooltip } from '@mui/material';\r\nimport DownloadIcon from '@mui/icons-material/Download';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport DescriptionIcon from '@mui/icons-material/Description';\r\nimport { FileViewerProps } from '../../types';\r\nimport { getFileExtension } from '../../utils/fileUtils';\r\nimport FileIcon from '../FileIcon';\r\n\r\nexport const VideoViewer: React.FC<FileViewerProps> = ({\r\n file,\r\n url,\r\n fileName,\r\n className = '',\r\n style = {},\r\n width = '100%',\r\n height = '100%',\r\n onLoad,\r\n onError,\r\n onDownloadClick,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n showMetadata = true,\r\n showProperties = true,\r\n // Extract props that shouldn't be passed to DOM elements\r\n mimeType,\r\n fileSize,\r\n showPageCount,\r\n showPageNavigation,\r\n showZoomControls,\r\n showDownload,\r\n showPrint,\r\n showSearch,\r\n onPrintClick,\r\n customRegistry,\r\n initialSearchText,\r\n initialSearchPages,\r\n autoOpenSearch,\r\n autoExecuteSearch,\r\n onSearchComplete,\r\n ...props\r\n}) => {\r\n const videoRef = useRef<HTMLVideoElement | null>(null);\r\n const [videoSource, setVideoSource] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [videoDimensions, setVideoDimensions] = useState<{ width: number; height: number } | null>(null);\r\n\r\n useEffect(() => {\r\n let objectUrl: string | null = null;\r\n\r\n if (file) {\r\n objectUrl = URL.createObjectURL(file);\r\n setVideoSource(objectUrl);\r\n setIsLoading(true);\r\n } else if (url) {\r\n setVideoSource(url);\r\n } else {\r\n setVideoSource(null);\r\n }\r\n\r\n setError(null);\r\n\r\n return () => {\r\n if (objectUrl) {\r\n URL.revokeObjectURL(objectUrl);\r\n }\r\n };\r\n }, [file, url]);\r\n\r\n useEffect(() => {\r\n const element = videoRef.current;\r\n if (!element) {\r\n return;\r\n }\r\n\r\n const handleLoaded = () => {\r\n setIsLoading(false);\r\n // Capture video dimensions\r\n setVideoDimensions({\r\n width: element.videoWidth,\r\n height: element.videoHeight\r\n });\r\n onLoad?.();\r\n };\r\n\r\n const handleError = () => {\r\n const message = 'Failed to load video resource';\r\n setIsLoading(false);\r\n setError(message);\r\n onError?.(new Error(message));\r\n };\r\n\r\n element.addEventListener('loadedmetadata', handleLoaded);\r\n element.addEventListener('error', handleError);\r\n\r\n return () => {\r\n element.removeEventListener('loadedmetadata', handleLoaded);\r\n element.removeEventListener('error', handleError);\r\n };\r\n }, [onLoad, onError, videoSource]);\r\n\r\n const resolvedFileName = useMemo(\r\n () => fileName || file?.name || (url ? url.split('/').pop() : 'video'),\r\n [fileName, file, url]\r\n );\r\n\r\n const fileExtension = useMemo(\r\n () => getFileExtension(resolvedFileName || ''),\r\n [resolvedFileName]\r\n );\r\n\r\n return (\r\n <Box\r\n className={`video-viewer ${className}`}\r\n sx={{ width, height, ...style }}\r\n {...props}\r\n >\r\n <Card sx={{ height: '100%', display: 'flex', flexDirection: 'column' }} elevation={1}>\r\n <CardHeader\r\n avatar={<FileIcon ext={fileExtension} size={32} />}\r\n title={\r\n <Typography variant=\"subtitle1\" fontWeight={500}>\r\n {resolvedFileName}\r\n </Typography>\r\n }\r\n action={\r\n <Stack direction=\"row\" spacing={1}>\r\n <Tooltip title=\"Download\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={onDownloadClick}\r\n aria-label=\"Download video\"\r\n >\r\n <DownloadIcon />\r\n </IconButton>\r\n </Tooltip>\r\n {showMetadata && (\r\n <Tooltip title=\"Document Metadata\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={onMetadataClick}\r\n aria-label=\"View document metadata\"\r\n >\r\n <InfoIcon />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {showProperties && (\r\n <Tooltip title=\"Document Properties\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={onPropertiesClick}\r\n aria-label=\"View document properties\"\r\n >\r\n <DescriptionIcon />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n </Stack>\r\n }\r\n sx={{ pb: 1.5 }}\r\n />\r\n {isLoading && <LinearProgress sx={{ mx: 3, mb: 2 }} />}\r\n {error && (\r\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\r\n {error}\r\n </Typography>\r\n )}\r\n <CardContent sx={{ \r\n flexGrow: 1, \r\n display: 'flex', \r\n alignItems: 'center', \r\n justifyContent: 'center', \r\n p: 2,\r\n overflow: 'hidden'\r\n }}>\r\n {videoSource ? (\r\n <Box\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n backgroundColor: '#000',\r\n borderRadius: 2\r\n }}\r\n >\r\n <video\r\n ref={videoRef}\r\n controls\r\n controlsList=\"nodownload\"\r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n width: 'auto',\r\n height: 'auto',\r\n objectFit: 'contain'\r\n }}\r\n src={videoSource}\r\n />\r\n </Box>\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n No video source provided.\r\n </Typography>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n );\r\n};"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  PDFViewer
4
- } from "./chunk-73ZIFR3P.mjs";
4
+ } from "./chunk-J2YW5DHC.mjs";
5
5
  import {
6
6
  getFileExtension,
7
7
  getMimeTypeFromExtension
@@ -118,7 +118,6 @@ var ImageViewer = ({
118
118
  file,
119
119
  url,
120
120
  fileName,
121
- mimeType,
122
121
  className = "",
123
122
  style = {},
124
123
  width = "100%",
@@ -131,15 +130,21 @@ var ImageViewer = ({
131
130
  showDownload = true,
132
131
  showPrint = true,
133
132
  showSearch = false,
134
- showMetadata = false,
135
- showProperties = false,
133
+ showMetadata = true,
134
+ showProperties = true,
136
135
  onMetadataClick,
137
136
  onPropertiesClick,
138
137
  onDownloadClick,
139
138
  onPrintClick,
140
- // Filter out props that shouldn't be passed to DOM
141
- fileSize: _fileSize,
142
- customRegistry: _customRegistry,
139
+ // Extract props that shouldn't be passed to DOM elements
140
+ mimeType,
141
+ fileSize,
142
+ customRegistry,
143
+ initialSearchText,
144
+ initialSearchPages,
145
+ autoOpenSearch,
146
+ autoExecuteSearch,
147
+ onSearchComplete,
143
148
  ...props
144
149
  }) => {
145
150
  const [state, setState] = useState("idle");
@@ -273,6 +278,7 @@ var ImageViewer = ({
273
278
  onPropertiesClick,
274
279
  onDownloadClick,
275
280
  onPrintClick,
281
+ defaultFitToPage: true,
276
282
  ...props
277
283
  },
278
284
  viewerKey
@@ -285,4 +291,4 @@ var ImageViewer = ({
285
291
  export {
286
292
  ImageViewer
287
293
  };
288
- //# sourceMappingURL=chunk-XQBXRMB7.mjs.map
294
+ //# sourceMappingURL=chunk-BONT4K3R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/ImageViewer.tsx","../src/utils/imageToPdf.ts"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\r\nimport { FileViewerProps } from '../../types';\r\nimport { imageBufferToPdf } from '../../utils/imageToPdf';\r\nimport { getFileExtension, getMimeTypeFromExtension } from '../../utils/fileUtils';\r\nimport { PDFViewer } from './PDFViewer';\r\n\r\ntype LoaderState = 'idle' | 'loading' | 'ready' | 'error';\r\n\r\nconst stripQuery = (value: string): string => value.split('?')[0]?.split('#')[0] ?? value;\r\n\r\nconst stripExtension = (value: string): string => value.replace(/\\.[^.]+$/, '');\r\n\r\nconst deriveDisplayName = (file?: File, fileName?: string, url?: string): string => {\r\n if (file?.name) {\r\n return stripExtension(file.name) || 'image';\r\n }\r\n if (fileName) {\r\n return stripExtension(fileName) || 'image';\r\n }\r\n if (url) {\r\n const cleaned = stripQuery(url);\r\n const parts = cleaned.split('/').filter(Boolean);\r\n const last = parts[parts.length - 1] ?? 'image';\r\n return stripExtension(last);\r\n }\r\n return 'image';\r\n};\r\n\r\nconst normalizeImageMime = (value?: string | null): string | undefined => {\r\n if (!value) {\r\n return undefined;\r\n }\r\n const cleaned = value.split(';')[0]?.trim().toLowerCase();\r\n if (!cleaned || !cleaned.startsWith('image/')) {\r\n return undefined;\r\n }\r\n if (cleaned === 'image/jpg') {\r\n return 'image/jpeg';\r\n }\r\n return cleaned;\r\n};\r\n\r\nconst resolveMimeType = (\r\n userMimeType?: string,\r\n file?: File,\r\n responseMime?: string,\r\n fileName?: string,\r\n url?: string\r\n): string | undefined => {\r\n const candidates = [userMimeType, file?.type, responseMime];\r\n for (const candidate of candidates) {\r\n const normalized = normalizeImageMime(candidate);\r\n if (normalized) {\r\n return normalized;\r\n }\r\n }\r\n const sourceName = file?.name ?? fileName ?? (url ? stripQuery(url) : undefined);\r\n if (!sourceName) {\r\n return undefined;\r\n }\r\n const extension = getFileExtension(sourceName);\r\n if (!extension) {\r\n return undefined;\r\n }\r\n return normalizeImageMime(getMimeTypeFromExtension(extension));\r\n};\r\n\r\nexport const ImageViewer: React.FC<FileViewerProps> = ({\r\n file,\r\n url,\r\n fileName,\r\n className = '',\r\n style = {},\r\n width = '100%',\r\n height = '100%',\r\n onLoad,\r\n onError,\r\n showPageCount = false,\r\n showPageNavigation = false,\r\n showZoomControls = true,\r\n showDownload = true,\r\n showPrint = true,\r\n showSearch = false,\r\n showMetadata = true,\r\n showProperties = true,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n onDownloadClick,\r\n onPrintClick,\r\n // Extract props that shouldn't be passed to DOM elements\r\n mimeType,\r\n fileSize,\r\n customRegistry,\r\n initialSearchText,\r\n initialSearchPages,\r\n autoOpenSearch,\r\n autoExecuteSearch,\r\n onSearchComplete,\r\n ...props\r\n}) => {\r\n const [state, setState] = useState<LoaderState>('idle');\r\n const [error, setError] = useState<Error | null>(null);\r\n const [convertedFile, setConvertedFile] = useState<File | null>(null);\r\n const viewerKey = useMemo(() => (\r\n convertedFile ? `${convertedFile.name}-${convertedFile.lastModified}` : 'image-viewer'\r\n ), [convertedFile]);\r\n\r\n useEffect(() => {\r\n let isActive = true;\r\n\r\n const reset = () => {\r\n setState('idle');\r\n setError(null);\r\n setConvertedFile(null);\r\n };\r\n\r\n if (!file && !url) {\r\n reset();\r\n return undefined;\r\n }\r\n\r\n const convert = async () => {\r\n setState('loading');\r\n setError(null);\r\n\r\n try {\r\n let buffer: ArrayBuffer;\r\n let responseMime: string | undefined;\r\n\r\n if (file) {\r\n buffer = await file.arrayBuffer();\r\n } else if (url) {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch image (${response.status})`);\r\n }\r\n\r\n responseMime = response.headers.get('content-type') ?? undefined;\r\n buffer = await response.arrayBuffer();\r\n } else {\r\n throw new Error('No image source provided');\r\n }\r\n\r\n const resolvedMime = resolveMimeType(mimeType, file, responseMime, fileName, url);\r\n const pdfBytes = await imageBufferToPdf(buffer, { mimeType: resolvedMime });\r\n\r\n const baseName = deriveDisplayName(file, fileName, url);\r\n const originalExtension = getFileExtension(file?.name || fileName || url || '');\r\n const pdfBlob = new Blob([pdfBytes as BlobPart], { type: 'application/pdf' });\r\n const newFile = new File([pdfBlob], `${baseName}.${originalExtension || 'jpg'}`, {\r\n type: 'application/pdf',\r\n lastModified: file?.lastModified ?? Date.now()\r\n });\r\n\r\n if (!isActive) {\r\n return;\r\n }\r\n\r\n setConvertedFile(newFile);\r\n setState('ready');\r\n } catch (cause) {\r\n if (!isActive) {\r\n return;\r\n }\r\n\r\n const failure = cause instanceof Error\r\n ? cause\r\n : new Error('Unable to convert image to PDF');\r\n setError(failure);\r\n setConvertedFile(null);\r\n setState('error');\r\n onError?.(failure);\r\n }\r\n };\r\n\r\n void convert();\r\n\r\n return () => {\r\n isActive = false;\r\n };\r\n }, [file, url, fileName, mimeType, onError]);\r\n\r\n return (\r\n <div\r\n className={`image-viewer ${className}`}\r\n style={{ width, height, ...style }}\r\n {...props}\r\n >\r\n {!file && !url && (\r\n <div style={{\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '1px dashed #ccc',\r\n borderRadius: '4px',\r\n color: '#666'\r\n }}>\r\n <strong>No image source provided</strong>\r\n <span style={{ fontSize: '0.9rem', marginTop: '8px' }}>\r\n Choose a file or supply a URL.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {state === 'loading' && (\r\n <div style={{\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '1px solid #ddd',\r\n borderRadius: '4px',\r\n backgroundColor: '#f9f9f9',\r\n color: '#555',\r\n fontSize: '0.95rem'\r\n }}>\r\n Preparing image viewer...\r\n </div>\r\n )}\r\n\r\n {state === 'error' && error && (\r\n <div style={{\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '1px solid #f0b4b4',\r\n borderRadius: '4px',\r\n backgroundColor: '#fff2f2',\r\n color: '#b71c1c',\r\n padding: '24px',\r\n textAlign: 'center'\r\n }}>\r\n <strong style={{ marginBottom: '12px' }}>Failed to prepare image viewer</strong>\r\n <span style={{ fontSize: '0.9rem' }}>{error.message}</span>\r\n </div>\r\n )}\r\n\r\n {state === 'ready' && convertedFile && (\r\n <PDFViewer\r\n key={viewerKey}\r\n file={convertedFile}\r\n fileName={convertedFile.name}\r\n width=\"100%\"\r\n height=\"100%\"\r\n onLoad={onLoad}\r\n onError={onError}\r\n showPageCount={showPageCount}\r\n showPageNavigation={showPageNavigation}\r\n showZoomControls={showZoomControls}\r\n showDownload={showDownload}\r\n showPrint={showPrint}\r\n showSearch={showSearch}\r\n showMetadata={showMetadata}\r\n showProperties={showProperties}\r\n onMetadataClick={onMetadataClick}\r\n onPropertiesClick={onPropertiesClick}\r\n onDownloadClick={onDownloadClick}\r\n onPrintClick={onPrintClick}\r\n defaultFitToPage={true}\r\n {...props}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { PDFDocument } from 'pdf-lib';\r\n\r\nconst SUPPORTED_IMAGE_TYPES = new Set(['image/png', 'image/jpeg']);\r\n\r\nconst sanitizeMimeType = (mimeType?: string | null): string | null => {\r\n if (!mimeType) {\r\n return null;\r\n }\r\n const lower = mimeType.toLowerCase();\r\n if (lower === 'image/jpg') {\r\n return 'image/jpeg';\r\n }\r\n return lower;\r\n};\r\n\r\nconst detectMimeTypeFromBuffer = (buffer: ArrayBuffer): string | null => {\r\n if (buffer.byteLength < 8) {\r\n return null;\r\n }\r\n const signature = new Uint8Array(buffer, 0, 8);\r\n const [b0, b1, b2, b3, b4, b5, b6, b7] = signature;\r\n\r\n if (\r\n b0 === 0x89 && b1 === 0x50 && b2 === 0x4e && b3 === 0x47 &&\r\n b4 === 0x0d && b5 === 0x0a && b6 === 0x1a && b7 === 0x0a\r\n ) {\r\n return 'image/png';\r\n }\r\n\r\n if (b0 === 0xff && b1 === 0xd8) {\r\n return 'image/jpeg';\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport interface ImageConversionOptions {\r\n mimeType?: string | null;\r\n}\r\n\r\nexport const imageBufferToPdf = async (\r\n buffer: ArrayBuffer,\r\n { mimeType }: ImageConversionOptions = {}\r\n): Promise<Uint8Array> => {\r\n const detectedMimeType = detectMimeTypeFromBuffer(buffer);\r\n const resolvedMimeType = sanitizeMimeType(mimeType) ?? detectedMimeType;\r\n\r\n if (!resolvedMimeType) {\r\n throw new Error('Unable to detect image type for PDF conversion');\r\n }\r\n\r\n if (!SUPPORTED_IMAGE_TYPES.has(resolvedMimeType)) {\r\n throw new Error('Unsupported image type for PDF conversion');\r\n }\r\n\r\n const pdfDoc = await PDFDocument.create();\r\n\r\n let embeddedImage;\r\n if (resolvedMimeType === 'image/png') {\r\n embeddedImage = await pdfDoc.embedPng(buffer);\r\n } else {\r\n embeddedImage = await pdfDoc.embedJpg(buffer);\r\n }\r\n\r\n const { width, height } = embeddedImage.scale(1);\r\n const page = pdfDoc.addPage([width, height]);\r\n page.drawImage(embeddedImage, {\r\n x: 0,\r\n y: 0,\r\n width,\r\n height\r\n });\r\n\r\n return pdfDoc.save();\r\n};\r\n"],"mappings":"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","names":[]}