@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/AudioViewer.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, IconButton, Tooltip, Stack } 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 AudioViewer = ({
13
15
  file,
@@ -20,21 +22,26 @@ var AudioViewer = ({
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 audioRef = useRef(null);
@@ -84,35 +91,6 @@ var AudioViewer = ({
84
91
  () => getFileExtension(resolvedFileName || ""),
85
92
  [resolvedFileName]
86
93
  );
87
- const handleDownload = useCallback(async () => {
88
- if (!file && !url) return;
89
- try {
90
- let blob;
91
- let filename = resolvedFileName || "audio.mp3";
92
- if (file) {
93
- blob = file;
94
- filename = file.name;
95
- } else if (url) {
96
- const response = await fetch(url);
97
- if (!response.ok) {
98
- throw new Error(`Failed to fetch audio (${response.status})`);
99
- }
100
- blob = await response.blob();
101
- } else {
102
- return;
103
- }
104
- const downloadUrl = URL.createObjectURL(blob);
105
- const link = document.createElement("a");
106
- link.href = downloadUrl;
107
- link.download = filename;
108
- document.body.appendChild(link);
109
- link.click();
110
- document.body.removeChild(link);
111
- URL.revokeObjectURL(downloadUrl);
112
- } catch (err) {
113
- onError?.(err instanceof Error ? err : new Error("Download failed"));
114
- }
115
- }, [file, url, resolvedFileName, onError]);
116
94
  return /* @__PURE__ */ jsx(
117
95
  Box,
118
96
  {
@@ -125,14 +103,35 @@ var AudioViewer = ({
125
103
  {
126
104
  avatar: /* @__PURE__ */ jsx(FileIcon_default, { ext: fileExtension, size: 32 }),
127
105
  title: /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
128
- action: /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
129
- IconButton,
130
- {
131
- size: "small",
132
- onClick: onDownloadClick,
133
- children: /* @__PURE__ */ jsx(DownloadIcon, {})
134
- }
135
- ) }),
106
+ action: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
107
+ /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
108
+ IconButton,
109
+ {
110
+ size: "small",
111
+ onClick: onDownloadClick,
112
+ "aria-label": "Download audio",
113
+ children: /* @__PURE__ */ jsx(DownloadIcon, {})
114
+ }
115
+ ) }),
116
+ showMetadata && /* @__PURE__ */ jsx(Tooltip, { title: "Document Metadata", children: /* @__PURE__ */ jsx(
117
+ IconButton,
118
+ {
119
+ size: "small",
120
+ onClick: onMetadataClick,
121
+ "aria-label": "View document metadata",
122
+ children: /* @__PURE__ */ jsx(InfoIcon, {})
123
+ }
124
+ ) }),
125
+ showProperties && /* @__PURE__ */ jsx(Tooltip, { title: "Document Properties", children: /* @__PURE__ */ jsx(
126
+ IconButton,
127
+ {
128
+ size: "small",
129
+ onClick: onPropertiesClick,
130
+ "aria-label": "View document properties",
131
+ children: /* @__PURE__ */ jsx(DescriptionIcon, {})
132
+ }
133
+ ) })
134
+ ] }),
136
135
  sx: { pb: 1.5 }
137
136
  }
138
137
  ),
@@ -156,4 +155,4 @@ var AudioViewer = ({
156
155
  export {
157
156
  AudioViewer
158
157
  };
159
- //# sourceMappingURL=chunk-FZYMVHF6.mjs.map
158
+ //# sourceMappingURL=chunk-4DJJINTB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/AudioViewer.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Card, CardContent, CardHeader, LinearProgress, Typography, IconButton, Tooltip, Stack } 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 AudioViewer: 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 audioRef = useRef<HTMLAudioElement | null>(null);\r\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let urlValue: string | null = null;\r\n\r\n if (file) {\r\n setIsLoading(true);\r\n urlValue = URL.createObjectURL(file);\r\n } else if (url) {\r\n urlValue = url;\r\n }\r\n\r\n setObjectUrl(urlValue);\r\n setError(null);\r\n\r\n return () => {\r\n if (urlValue && file) {\r\n URL.revokeObjectURL(urlValue);\r\n }\r\n };\r\n }, [file, url]);\r\n\r\n useEffect(() => {\r\n if (!audioRef.current) {\r\n return;\r\n }\r\n\r\n const handleLoadedMetadata = () => {\r\n setIsLoading(false);\r\n onLoad?.();\r\n };\r\n\r\n const handleError = () => {\r\n const message = 'Failed to load audio resource';\r\n setIsLoading(false);\r\n setError(message);\r\n onError?.(new Error(message));\r\n };\r\n\r\n const element = audioRef.current;\r\n element.addEventListener('loadedmetadata', handleLoadedMetadata);\r\n element.addEventListener('error', handleError);\r\n\r\n return () => {\r\n element.removeEventListener('loadedmetadata', handleLoadedMetadata);\r\n element.removeEventListener('error', handleError);\r\n };\r\n }, [onLoad, onError, objectUrl]);\r\n\r\n const resolvedFileName = useMemo(() => fileName || file?.name || (url ? url.split('/').pop() : 'audio'), [fileName, file, url]);\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={`audio-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 audio\"\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 && (\r\n <LinearProgress sx={{ mx: 3, mb: 2 }} />\r\n )}\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={{ flexGrow: 1, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\r\n {objectUrl ? (\r\n <audio\r\n ref={audioRef}\r\n controls\r\n controlsList=\"nodownload\"\r\n style={{ width: '100%' }}\r\n src={objectUrl}\r\n />\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n No audio source provided.\r\n </Typography>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n );\r\n};\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,133 @@
1
+ "use client";
2
+ import {
3
+ FileIcon_default,
4
+ getFileExtension
5
+ } from "./chunk-QQDQJ7TS.mjs";
6
+
7
+ // src/components/viewers/DefaultViewer.tsx
8
+ import { useMemo } from "react";
9
+ import { Box, Card, CardContent, CardHeader, Typography, IconButton, Tooltip, Stack } from "@mui/material";
10
+ import DownloadIcon from "@mui/icons-material/Download";
11
+ import InfoIcon from "@mui/icons-material/Info";
12
+ import DescriptionIcon from "@mui/icons-material/Description";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ var DefaultViewer = ({
15
+ file,
16
+ url,
17
+ fileName,
18
+ className = "",
19
+ style = {},
20
+ width = "100%",
21
+ height = "100%",
22
+ onLoad,
23
+ onError,
24
+ // Extract props that shouldn't be passed to DOM elements
25
+ mimeType,
26
+ fileSize,
27
+ showPageCount,
28
+ showPageNavigation,
29
+ showZoomControls,
30
+ showDownload,
31
+ showPrint,
32
+ showSearch,
33
+ showMetadata,
34
+ showProperties,
35
+ onMetadataClick,
36
+ onPropertiesClick,
37
+ onPrintClick,
38
+ onDownloadClick,
39
+ customRegistry,
40
+ ...props
41
+ }) => {
42
+ const resolvedFileName = useMemo(
43
+ () => fileName || file?.name || (url ? url.split("/").pop() : "unknown-file"),
44
+ [fileName, file, url]
45
+ );
46
+ const fileExtension = useMemo(
47
+ () => getFileExtension(resolvedFileName || ""),
48
+ [resolvedFileName]
49
+ );
50
+ return /* @__PURE__ */ jsx(
51
+ Box,
52
+ {
53
+ className: `default-viewer ${className}`,
54
+ sx: { width, height, ...style },
55
+ ...props,
56
+ children: /* @__PURE__ */ jsxs(Card, { sx: { height: "100%", display: "flex", flexDirection: "column" }, elevation: 1, children: [
57
+ /* @__PURE__ */ jsx(
58
+ CardHeader,
59
+ {
60
+ avatar: /* @__PURE__ */ jsx(FileIcon_default, { ext: fileExtension, size: 32 }),
61
+ title: /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
62
+ action: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
63
+ /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
64
+ IconButton,
65
+ {
66
+ size: "small",
67
+ onClick: onDownloadClick,
68
+ "aria-label": "Download file",
69
+ children: /* @__PURE__ */ jsx(DownloadIcon, {})
70
+ }
71
+ ) }),
72
+ showMetadata && /* @__PURE__ */ jsx(Tooltip, { title: "Document Metadata", children: /* @__PURE__ */ jsx(
73
+ IconButton,
74
+ {
75
+ size: "small",
76
+ onClick: onMetadataClick,
77
+ "aria-label": "View document metadata",
78
+ children: /* @__PURE__ */ jsx(InfoIcon, {})
79
+ }
80
+ ) }),
81
+ showProperties && /* @__PURE__ */ jsx(Tooltip, { title: "Document Properties", children: /* @__PURE__ */ jsx(
82
+ IconButton,
83
+ {
84
+ size: "small",
85
+ onClick: onPropertiesClick,
86
+ "aria-label": "View document properties",
87
+ children: /* @__PURE__ */ jsx(DescriptionIcon, {})
88
+ }
89
+ ) })
90
+ ] }),
91
+ sx: { pb: 1 }
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsxs(CardContent, { sx: {
95
+ flexGrow: 1,
96
+ display: "flex",
97
+ alignItems: "center",
98
+ justifyContent: "center",
99
+ flexDirection: "column",
100
+ textAlign: "center",
101
+ color: "#666"
102
+ }, children: [
103
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", gutterBottom: true, color: "text.primary", children: "File Preview Not Available" }),
104
+ /* @__PURE__ */ jsxs(Box, { sx: { mt: 2 }, children: [
105
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
106
+ /* @__PURE__ */ jsx("strong", { children: "File:" }),
107
+ " ",
108
+ resolvedFileName
109
+ ] }),
110
+ mimeType && /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
111
+ /* @__PURE__ */ jsx("strong", { children: "Type:" }),
112
+ " ",
113
+ mimeType
114
+ ] }),
115
+ fileSize && /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
116
+ /* @__PURE__ */ jsx("strong", { children: "Size:" }),
117
+ " ",
118
+ Math.round(fileSize / 1024),
119
+ " KB"
120
+ ] }),
121
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", sx: { mt: 2 }, children: "This file type is not supported for preview." }),
122
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "You can download the file using the button above." })
123
+ ] })
124
+ ] })
125
+ ] })
126
+ }
127
+ );
128
+ };
129
+
130
+ export {
131
+ DefaultViewer
132
+ };
133
+ //# sourceMappingURL=chunk-677DWENS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/DefaultViewer.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { Box, Card, CardContent, CardHeader, Typography, IconButton, Tooltip, Stack } 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 DefaultViewer: 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 // 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 showMetadata,\r\n showProperties,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n onPrintClick,\r\n onDownloadClick,\r\n customRegistry,\r\n ...props\r\n}) => {\r\n const resolvedFileName = useMemo(\r\n () => fileName || file?.name || (url ? url.split('/').pop() : 'unknown-file'),\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={`default-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 file\"\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 }}\r\n />\r\n <CardContent sx={{\r\n flexGrow: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n textAlign: 'center',\r\n color: '#666'\r\n }}>\r\n <Typography variant=\"h6\" gutterBottom color=\"text.primary\">\r\n File Preview Not Available\r\n </Typography>\r\n <Box sx={{ mt: 2 }}>\r\n <Typography variant=\"body2\"><strong>File:</strong> {resolvedFileName}</Typography>\r\n {mimeType && <Typography variant=\"body2\"><strong>Type:</strong> {mimeType}</Typography>}\r\n {fileSize && <Typography variant=\"body2\"><strong>Size:</strong> {Math.round(fileSize / 1024)} KB</Typography>}\r\n <Typography variant=\"body2\" sx={{ mt: 2 }}>\r\n This file type is not supported for preview.\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n You can download the file using the button above.\r\n </Typography>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n );\r\n};\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,133 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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
+
3
+
4
+
5
+ var _chunkRE4XRGSVjs = require('./chunk-RE4XRGSV.js');
6
+
7
+ // src/components/viewers/DefaultViewer.tsx
8
+ var _react = require('react');
9
+ var _material = require('@mui/material');
10
+ var _Download = require('@mui/icons-material/Download'); var _Download2 = _interopRequireDefault(_Download);
11
+ var _Info = require('@mui/icons-material/Info'); var _Info2 = _interopRequireDefault(_Info);
12
+ var _Description = require('@mui/icons-material/Description'); var _Description2 = _interopRequireDefault(_Description);
13
+ var _jsxruntime = require('react/jsx-runtime');
14
+ var DefaultViewer = ({
15
+ file,
16
+ url,
17
+ fileName,
18
+ className = "",
19
+ style = {},
20
+ width = "100%",
21
+ height = "100%",
22
+ onLoad,
23
+ onError,
24
+ // Extract props that shouldn't be passed to DOM elements
25
+ mimeType,
26
+ fileSize,
27
+ showPageCount,
28
+ showPageNavigation,
29
+ showZoomControls,
30
+ showDownload,
31
+ showPrint,
32
+ showSearch,
33
+ showMetadata,
34
+ showProperties,
35
+ onMetadataClick,
36
+ onPropertiesClick,
37
+ onPrintClick,
38
+ onDownloadClick,
39
+ customRegistry,
40
+ ...props
41
+ }) => {
42
+ const resolvedFileName = _react.useMemo.call(void 0,
43
+ () => fileName || _optionalChain([file, 'optionalAccess', _ => _.name]) || (url ? url.split("/").pop() : "unknown-file"),
44
+ [fileName, file, url]
45
+ );
46
+ const fileExtension = _react.useMemo.call(void 0,
47
+ () => _chunkRE4XRGSVjs.getFileExtension.call(void 0, resolvedFileName || ""),
48
+ [resolvedFileName]
49
+ );
50
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
51
+ _material.Box,
52
+ {
53
+ className: `default-viewer ${className}`,
54
+ sx: { width, height, ...style },
55
+ ...props,
56
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Card, { sx: { height: "100%", display: "flex", flexDirection: "column" }, elevation: 1, children: [
57
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
58
+ _material.CardHeader,
59
+ {
60
+ avatar: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRE4XRGSVjs.FileIcon_default, { ext: fileExtension, size: 32 }),
61
+ title: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
62
+ action: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Stack, { direction: "row", spacing: 1, children: [
63
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: "Download", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
64
+ _material.IconButton,
65
+ {
66
+ size: "small",
67
+ onClick: onDownloadClick,
68
+ "aria-label": "Download file",
69
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Download2.default, {})
70
+ }
71
+ ) }),
72
+ showMetadata && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: "Document Metadata", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
73
+ _material.IconButton,
74
+ {
75
+ size: "small",
76
+ onClick: onMetadataClick,
77
+ "aria-label": "View document metadata",
78
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Info2.default, {})
79
+ }
80
+ ) }),
81
+ showProperties && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: "Document Properties", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
82
+ _material.IconButton,
83
+ {
84
+ size: "small",
85
+ onClick: onPropertiesClick,
86
+ "aria-label": "View document properties",
87
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Description2.default, {})
88
+ }
89
+ ) })
90
+ ] }),
91
+ sx: { pb: 1 }
92
+ }
93
+ ),
94
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.CardContent, { sx: {
95
+ flexGrow: 1,
96
+ display: "flex",
97
+ alignItems: "center",
98
+ justifyContent: "center",
99
+ flexDirection: "column",
100
+ textAlign: "center",
101
+ color: "#666"
102
+ }, children: [
103
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "h6", gutterBottom: true, color: "text.primary", children: "File Preview Not Available" }),
104
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Box, { sx: { mt: 2 }, children: [
105
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Typography, { variant: "body2", children: [
106
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "strong", { children: "File:" }),
107
+ " ",
108
+ resolvedFileName
109
+ ] }),
110
+ mimeType && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Typography, { variant: "body2", children: [
111
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "strong", { children: "Type:" }),
112
+ " ",
113
+ mimeType
114
+ ] }),
115
+ fileSize && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Typography, { variant: "body2", children: [
116
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "strong", { children: "Size:" }),
117
+ " ",
118
+ Math.round(fileSize / 1024),
119
+ " KB"
120
+ ] }),
121
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", sx: { mt: 2 }, children: "This file type is not supported for preview." }),
122
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", color: "text.secondary", children: "You can download the file using the button above." })
123
+ ] })
124
+ ] })
125
+ ] })
126
+ }
127
+ );
128
+ };
129
+
130
+
131
+
132
+ exports.DefaultViewer = DefaultViewer;
133
+ //# sourceMappingURL=chunk-77UARJVQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\chunk-77UARJVQ.js"],"names":[],"mappings":"AAAA,yrBAAY;AACZ;AACE;AACA;AACF,sDAA4B;AAC5B;AACA;AACA,8BAA+B;AAC/B,yCAA0G;AAC1G,4GAAuD;AACvD,4FAA+C;AAC/C,wHAA6D;AAC7D,+CAA6C;AAC7C,IAAI,cAAc,EAAE,CAAC;AACrB,EAAE,IAAI;AACN,EAAE,GAAG;AACL,EAAE,QAAQ;AACV,EAAE,UAAU,EAAE,EAAE;AAChB,EAAE,MAAM,EAAE,CAAC,CAAC;AACZ,EAAE,MAAM,EAAE,MAAM;AAChB,EAAE,OAAO,EAAE,MAAM;AACjB,EAAE,MAAM;AACR,EAAE,OAAO;AACT;AACA,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,aAAa;AACf,EAAE,kBAAkB;AACpB,EAAE,gBAAgB;AAClB,EAAE,YAAY;AACd,EAAE,SAAS;AACX,EAAE,UAAU;AACZ,EAAE,YAAY;AACd,EAAE,cAAc;AAChB,EAAE,eAAe;AACjB,EAAE,iBAAiB;AACnB,EAAE,YAAY;AACd,EAAE,eAAe;AACjB,EAAE,cAAc;AAChB,EAAE,GAAG;AACL,CAAC,EAAE,GAAG;AACN,EAAE,MAAM,iBAAiB,EAAE,4BAAO;AAClC,IAAI,CAAC,EAAE,GAAG,SAAS,mBAAG,IAAI,2BAAE,OAAK,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC;AACjF,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG;AACxB,EAAE,CAAC;AACH,EAAE,MAAM,cAAc,EAAE,4BAAO;AAC/B,IAAI,CAAC,EAAE,GAAG,+CAAgB,iBAAkB,GAAG,EAAE,CAAC;AAClD,IAAI,CAAC,gBAAgB;AACrB,EAAE,CAAC;AACH,EAAE,uBAAuB,6BAAG;AAC5B,IAAI,aAAG;AACP,IAAI;AACJ,MAAM,SAAS,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,8BAAA;AACA,gBAAA;AACA,gBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,0BAAA;AACA,0BAAA;AACA,4BAAA;AACA,8BAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,8BAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,8BAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,4BAAA;AACA,4BAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\chunk-77UARJVQ.js","sourcesContent":[null]}
@@ -24,7 +24,8 @@ import {
24
24
  Tooltip
25
25
  } from "@mui/material";
26
26
  import DownloadIcon from "@mui/icons-material/Download";
27
- import { FixedSizeList as List } from "react-window";
27
+ import InfoIcon from "@mui/icons-material/Info";
28
+ import DescriptionIcon from "@mui/icons-material/Description";
28
29
  import { jsx, jsxs } from "react/jsx-runtime";
29
30
  var LINE_HEIGHT = 24;
30
31
  var TextViewer = ({
@@ -38,21 +39,26 @@ var TextViewer = ({
38
39
  onLoad,
39
40
  onError,
40
41
  onDownloadClick,
41
- // Filter out props that shouldn't be passed to DOM
42
- mimeType: _mimeType,
43
- fileSize: _fileSize,
44
- showPageCount: _showPageCount,
45
- showPageNavigation: _showPageNavigation,
46
- showZoomControls: _showZoomControls,
47
- showDownload: _showDownload,
48
- showPrint: _showPrint,
49
- showSearch: _showSearch,
50
- showMetadata: _showMetadata,
51
- showProperties: _showProperties,
52
- onMetadataClick: _onMetadataClick,
53
- onPropertiesClick: _onPropertiesClick,
54
- onPrintClick: _onPrintClick,
55
- customRegistry: _customRegistry,
42
+ onMetadataClick,
43
+ onPropertiesClick,
44
+ showMetadata = true,
45
+ showProperties = true,
46
+ // Extract props that shouldn't be passed to DOM elements
47
+ mimeType,
48
+ fileSize,
49
+ showPageCount,
50
+ showPageNavigation,
51
+ showZoomControls,
52
+ showDownload,
53
+ showPrint,
54
+ showSearch,
55
+ onPrintClick,
56
+ customRegistry,
57
+ initialSearchText,
58
+ initialSearchPages,
59
+ autoOpenSearch,
60
+ autoExecuteSearch,
61
+ onSearchComplete,
56
62
  ...props
57
63
  }) => {
58
64
  const [content, setContent] = useState("");
@@ -103,33 +109,6 @@ var TextViewer = ({
103
109
  useEffect(() => {
104
110
  void loadText();
105
111
  }, [loadText]);
106
- const handleDownload = useCallback(() => {
107
- if (!content) return;
108
- const blob = new Blob([content], { type: "text/plain" });
109
- const url2 = URL.createObjectURL(blob);
110
- const link = document.createElement("a");
111
- link.href = url2;
112
- link.download = resolvedFileName || "document.txt";
113
- document.body.appendChild(link);
114
- link.click();
115
- document.body.removeChild(link);
116
- URL.revokeObjectURL(url2);
117
- }, [content, resolvedFileName]);
118
- const Row = useCallback(({ index, style: rowStyle }) => /* @__PURE__ */ jsx(
119
- Box,
120
- {
121
- style: rowStyle,
122
- sx: {
123
- px: 2,
124
- display: "flex",
125
- alignItems: "center",
126
- whiteSpace: "pre",
127
- fontFamily: "monospace",
128
- fontSize: "0.85rem"
129
- },
130
- children: lines[index] || "\xA0"
131
- }
132
- ), [lines]);
133
112
  return /* @__PURE__ */ jsx(
134
113
  Box,
135
114
  {
@@ -142,30 +121,57 @@ var TextViewer = ({
142
121
  {
143
122
  avatar: /* @__PURE__ */ jsx(FileIcon_default, { ext: fileExtension, size: 32 }),
144
123
  title: /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
145
- action: /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
146
- IconButton,
147
- {
148
- size: "small",
149
- onClick: onDownloadClick,
150
- children: /* @__PURE__ */ jsx(DownloadIcon, {})
151
- }
152
- ) }),
124
+ action: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
125
+ /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
126
+ IconButton,
127
+ {
128
+ size: "small",
129
+ onClick: onDownloadClick,
130
+ "aria-label": "Download text file",
131
+ children: /* @__PURE__ */ jsx(DownloadIcon, {})
132
+ }
133
+ ) }),
134
+ showMetadata && /* @__PURE__ */ jsx(Tooltip, { title: "Document Metadata", children: /* @__PURE__ */ jsx(
135
+ IconButton,
136
+ {
137
+ size: "small",
138
+ onClick: onMetadataClick,
139
+ "aria-label": "View document metadata",
140
+ children: /* @__PURE__ */ jsx(InfoIcon, {})
141
+ }
142
+ ) }),
143
+ showProperties && /* @__PURE__ */ jsx(Tooltip, { title: "Document Properties", children: /* @__PURE__ */ jsx(
144
+ IconButton,
145
+ {
146
+ size: "small",
147
+ onClick: onPropertiesClick,
148
+ "aria-label": "View document properties",
149
+ children: /* @__PURE__ */ jsx(DescriptionIcon, {})
150
+ }
151
+ ) })
152
+ ] }),
153
153
  sx: { pb: 1 }
154
154
  }
155
155
  ),
156
156
  isLoading && /* @__PURE__ */ jsx(LinearProgress, { sx: { mx: 3, mb: 1 } }),
157
157
  error && /* @__PURE__ */ jsx(Typography, { color: "error", variant: "body2", sx: { px: 3, pb: 1 }, children: error }),
158
158
  /* @__PURE__ */ jsx(Divider, {}),
159
- /* @__PURE__ */ jsx(CardContent, { sx: { flexGrow: 1, minHeight: 0, display: "flex", flexDirection: "column", p: 0 }, children: content ? /* @__PURE__ */ jsx(Stack, { sx: { flex: 1, position: "relative" }, children: /* @__PURE__ */ jsx(
160
- List,
159
+ /* @__PURE__ */ jsx(CardContent, { sx: { flexGrow: 1, minHeight: 0, p: 0, overflow: "auto" }, children: content ? /* @__PURE__ */ jsx(Box, { sx: {
160
+ fontFamily: "monospace",
161
+ fontSize: "0.85rem",
162
+ p: 2,
163
+ whiteSpace: "pre"
164
+ }, children: lines.map((line, index) => /* @__PURE__ */ jsx(
165
+ Box,
161
166
  {
162
- height: typeof height === "number" ? height - 140 : 520,
163
- itemCount: lines.length,
164
- itemSize: LINE_HEIGHT,
165
- width: "100%",
166
- children: Row
167
- }
168
- ) }) : /* @__PURE__ */ jsx(Box, { sx: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", p: 4 }, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "No text content available." }) }) })
167
+ sx: {
168
+ minHeight: LINE_HEIGHT,
169
+ lineHeight: `${LINE_HEIGHT}px`
170
+ },
171
+ children: line || "\xA0"
172
+ },
173
+ index
174
+ )) }) : /* @__PURE__ */ jsx(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "center", p: 4, minHeight: 200 }, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "No text content available." }) }) })
169
175
  ] })
170
176
  }
171
177
  );
@@ -174,4 +180,4 @@ var TextViewer = ({
174
180
  export {
175
181
  TextViewer
176
182
  };
177
- //# sourceMappingURL=chunk-LKBM4O47.mjs.map
183
+ //# sourceMappingURL=chunk-7BLEPGZ4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/TextViewer.tsx"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useState\r\n} from 'react';\r\nimport {\r\n Box,\r\n Button,\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n Divider,\r\n LinearProgress,\r\n Stack,\r\n Typography,\r\n IconButton,\r\n Tooltip\r\n} 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\nconst LINE_HEIGHT = 24;\r\n\r\nexport const TextViewer: 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 [content, setContent] = useState<string>('');\r\n const [lines, setLines] = useState<string[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const resolvedFileName = useMemo(\r\n () => fileName || file?.name || (url ? url.split('/').pop() : 'text-document'),\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 const loadText = useCallback(async () => {\r\n if (!file && !url) {\r\n setContent('');\r\n setLines([]);\r\n setError(null);\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let textContent: string;\r\n if (file) {\r\n textContent = await file.text();\r\n } else {\r\n const response = await fetch(url!);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch text (${response.status})`);\r\n }\r\n textContent = await response.text();\r\n }\r\n\r\n setContent(textContent);\r\n setLines(textContent.split(/\\r?\\n/));\r\n onLoad?.();\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Unable to load text file';\r\n setError(message);\r\n setContent('');\r\n setLines([]);\r\n onError?.(new Error(message));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [file, url, onLoad, onError]);\r\n\r\n useEffect(() => {\r\n void loadText();\r\n }, [loadText]);\r\n\r\n return (\r\n <Box\r\n className={`text-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 text file\"\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 }}\r\n />\r\n {isLoading && <LinearProgress sx={{ mx: 3, mb: 1 }} />}\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 <Divider />\r\n <CardContent sx={{ flexGrow: 1, minHeight: 0, p: 0, overflow: 'auto' }}>\r\n {content ? (\r\n <Box sx={{ \r\n fontFamily: 'monospace', \r\n fontSize: '0.85rem',\r\n p: 2,\r\n whiteSpace: 'pre'\r\n }}>\r\n {lines.map((line, index) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n minHeight: LINE_HEIGHT,\r\n lineHeight: `${LINE_HEIGHT}px`\r\n }}\r\n >\r\n {line || '\\u00A0'}\r\n </Box>\r\n ))}\r\n </Box>\r\n ) : (\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', p: 4, minHeight: 200 }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n No text content available.\r\n </Typography>\r\n </Box>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n );\r\n};"],"mappings":"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","names":[]}