@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.
- package/dist/{chunk-FZYMVHF6.mjs → chunk-4DJJINTB.mjs} +54 -55
- package/dist/chunk-4DJJINTB.mjs.map +1 -0
- package/dist/chunk-677DWENS.mjs +133 -0
- package/dist/chunk-677DWENS.mjs.map +1 -0
- package/dist/chunk-77UARJVQ.js +133 -0
- package/dist/chunk-77UARJVQ.js.map +1 -0
- package/dist/{chunk-LKBM4O47.mjs → chunk-7BLEPGZ4.mjs} +67 -61
- package/dist/chunk-7BLEPGZ4.mjs.map +1 -0
- package/dist/{chunk-QRYIHDRT.mjs → chunk-BHMFZTZ7.mjs} +54 -55
- package/dist/chunk-BHMFZTZ7.mjs.map +1 -0
- package/dist/{chunk-XQBXRMB7.mjs → chunk-BONT4K3R.mjs} +14 -8
- package/dist/chunk-BONT4K3R.mjs.map +1 -0
- package/dist/{chunk-3STHCDAC.js → chunk-DDT3GC3C.js} +425 -164
- package/dist/chunk-DDT3GC3C.js.map +1 -0
- package/dist/{chunk-EMP7RZM2.js → chunk-DOOYIHGW.js} +52 -53
- package/dist/chunk-DOOYIHGW.js.map +1 -0
- package/dist/{chunk-73ZIFR3P.mjs → chunk-J2YW5DHC.mjs} +457 -196
- package/dist/chunk-J2YW5DHC.mjs.map +1 -0
- package/dist/{chunk-BNHQYEZ7.js → chunk-SBEFC7HP.js} +203 -158
- package/dist/chunk-SBEFC7HP.js.map +1 -0
- package/dist/{chunk-4RL77HKO.js → chunk-SNEIVT4R.js} +52 -53
- package/dist/chunk-SNEIVT4R.js.map +1 -0
- package/dist/{chunk-7JTIG6OU.js → chunk-WP55NYFS.js} +67 -61
- package/dist/chunk-WP55NYFS.js.map +1 -0
- package/dist/{chunk-NOLXOOIP.mjs → chunk-YHMHDPLQ.mjs} +200 -155
- package/dist/chunk-YHMHDPLQ.mjs.map +1 -0
- package/dist/{chunk-GNWU6XHH.js → chunk-Z3IUTTJQ.js} +15 -9
- package/dist/{chunk-GNWU6XHH.js.map → chunk-Z3IUTTJQ.js.map} +1 -1
- package/dist/components/viewers/AudioViewer.d.mts +1 -1
- package/dist/components/viewers/AudioViewer.d.ts +1 -1
- package/dist/components/viewers/AudioViewer.js +2 -2
- package/dist/components/viewers/AudioViewer.mjs +1 -1
- package/dist/components/viewers/DefaultViewer.d.mts +1 -1
- package/dist/components/viewers/DefaultViewer.d.ts +1 -1
- package/dist/components/viewers/DefaultViewer.js +3 -2
- package/dist/components/viewers/DefaultViewer.js.map +1 -1
- package/dist/components/viewers/DefaultViewer.mjs +2 -1
- package/dist/components/viewers/ImageViewer.d.mts +1 -1
- package/dist/components/viewers/ImageViewer.d.ts +1 -1
- package/dist/components/viewers/ImageViewer.js +3 -3
- package/dist/components/viewers/ImageViewer.mjs +2 -2
- package/dist/components/viewers/PDFViewer.d.mts +1 -1
- package/dist/components/viewers/PDFViewer.d.ts +1 -1
- package/dist/components/viewers/PDFViewer.js +2 -2
- package/dist/components/viewers/PDFViewer.mjs +1 -1
- package/dist/components/viewers/TIFFViewer.d.mts +1 -1
- package/dist/components/viewers/TIFFViewer.d.ts +1 -1
- package/dist/components/viewers/TIFFViewer.js +2 -2
- package/dist/components/viewers/TIFFViewer.mjs +1 -1
- package/dist/components/viewers/TextViewer.d.mts +1 -1
- package/dist/components/viewers/TextViewer.d.ts +1 -1
- package/dist/components/viewers/TextViewer.js +2 -2
- package/dist/components/viewers/TextViewer.mjs +1 -1
- package/dist/components/viewers/VideoViewer.d.mts +1 -1
- package/dist/components/viewers/VideoViewer.d.ts +1 -1
- package/dist/components/viewers/VideoViewer.js +2 -2
- package/dist/components/viewers/VideoViewer.mjs +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +30 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -18
- package/dist/index.mjs.map +1 -1
- package/dist/{types-CquKzJLE.d.mts → types-C6IEfcTM.d.mts} +13 -1
- package/dist/{types-CquKzJLE.d.ts → types-C6IEfcTM.d.ts} +13 -1
- package/package.json +1 -1
- package/dist/chunk-3STHCDAC.js.map +0 -1
- package/dist/chunk-4RL77HKO.js.map +0 -1
- package/dist/chunk-73ZIFR3P.mjs.map +0 -1
- package/dist/chunk-7JTIG6OU.js.map +0 -1
- package/dist/chunk-BNHQYEZ7.js.map +0 -1
- package/dist/chunk-EMP7RZM2.js.map +0 -1
- package/dist/chunk-FZYMVHF6.mjs.map +0 -1
- package/dist/chunk-LKBM4O47.mjs.map +0 -1
- package/dist/chunk-NOLXOOIP.mjs.map +0 -1
- package/dist/chunk-QLJKOQTP.mjs +0 -78
- package/dist/chunk-QLJKOQTP.mjs.map +0 -1
- package/dist/chunk-QRYIHDRT.mjs.map +0 -1
- package/dist/chunk-XQBXRMB7.mjs.map +0 -1
- package/dist/chunk-Z7FUO5RX.js +0 -78
- 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 {
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
onPrintClick
|
|
37
|
-
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__ */
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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-
|
|
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-
|
|
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 =
|
|
135
|
-
showProperties =
|
|
133
|
+
showMetadata = true,
|
|
134
|
+
showProperties = true,
|
|
136
135
|
onMetadataClick,
|
|
137
136
|
onPropertiesClick,
|
|
138
137
|
onDownloadClick,
|
|
139
138
|
onPrintClick,
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
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-
|
|
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":[]}
|