react-file-preview-engine 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +17 -19
- package/package.json +1 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import Mime from 'mime/lite';
|
|
2
1
|
import React2, { useMemo, useState, useRef, useEffect } from 'react';
|
|
3
2
|
import { FileIcon, defaultStyles } from 'react-file-icon';
|
|
3
|
+
import Mime from 'mime/lite';
|
|
4
4
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __defProps = Object.defineProperties;
|
|
@@ -47,6 +47,7 @@ function Loader({ children, text }) {
|
|
|
47
47
|
|
|
48
48
|
// src/constants.ts
|
|
49
49
|
var defaults = { additionalContext: {}, customRenderers: [], props: {} };
|
|
50
|
+
var fileExtensionRegex = /\.([^.]+)$/;
|
|
50
51
|
function useResolvedSrc(src) {
|
|
51
52
|
const objectUrlRef = useRef(null);
|
|
52
53
|
const revokeObjectURL = () => {
|
|
@@ -64,8 +65,6 @@ function useResolvedSrc(src) {
|
|
|
64
65
|
useEffect(() => revokeObjectURL, []);
|
|
65
66
|
return resolvedSrc;
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
// src/lib/utils.ts
|
|
69
68
|
var composeClass = (baseClass, props) => `${baseClass}${(props == null ? void 0 : props.className) ? " " + props.className : ""}`;
|
|
70
69
|
var composeProps = (baseClass, props, overrideProps) => {
|
|
71
70
|
const mergedProps = __spreadValues(__spreadValues({}, props), overrideProps);
|
|
@@ -81,20 +80,22 @@ function fetchResource(src, type, signal) {
|
|
|
81
80
|
return res[type]();
|
|
82
81
|
});
|
|
83
82
|
}
|
|
83
|
+
var getFileExtension = (mimeType, fileName) => {
|
|
84
|
+
var _a, _b, _c;
|
|
85
|
+
return (_c = (_b = Mime.getExtension(mimeType)) != null ? _b : (_a = fileName == null ? void 0 : fileName.match(fileExtensionRegex)) == null ? void 0 : _a[1]) != null ? _c : "";
|
|
86
|
+
};
|
|
87
|
+
var getFileType = (mimeType, fileName) => mimeType || fileName && Mime.getType(fileName) || "";
|
|
84
88
|
|
|
85
89
|
// src/lib/rendererRegistry.tsx
|
|
86
90
|
var audioRenderer = {
|
|
87
91
|
canRender: ({ mimeType }) => mimeType.startsWith("audio/"),
|
|
88
92
|
Component({ src, mimeType, fileName, autoPlay, onLoad, onError }) {
|
|
89
|
-
return /* @__PURE__ */ React2.createElement("audio", { controls: true, autoPlay, onCanPlay: onLoad, onError,
|
|
93
|
+
return /* @__PURE__ */ React2.createElement("audio", { className: "rfpe-audio", controls: true, autoPlay, onCanPlay: onLoad, onError, "aria-label": fileName || "Audio preview" }, /* @__PURE__ */ React2.createElement("source", { src, type: mimeType }));
|
|
90
94
|
}
|
|
91
95
|
};
|
|
92
96
|
var fallbackRenderer = {
|
|
93
|
-
Component({ mimeType, iconProps, onLoad }) {
|
|
94
|
-
const extension = useMemo(() =>
|
|
95
|
-
var _a;
|
|
96
|
-
return (_a = Mime.getExtension(mimeType)) != null ? _a : "";
|
|
97
|
-
}, [mimeType]);
|
|
97
|
+
Component({ mimeType, fileName, iconProps, onLoad }) {
|
|
98
|
+
const extension = useMemo(() => getFileExtension(mimeType, fileName), [mimeType, fileName]);
|
|
98
99
|
useEffect(() => {
|
|
99
100
|
onLoad();
|
|
100
101
|
}, []);
|
|
@@ -113,13 +114,13 @@ var htmlRenderer = {
|
|
|
113
114
|
}).catch(onError);
|
|
114
115
|
return () => controller.abort();
|
|
115
116
|
}, [src]);
|
|
116
|
-
return /* @__PURE__ */ React2.createElement("iframe", { src: `data:text/html; charset=utf-8,${encodeURIComponent(data)}`, sandbox: ""
|
|
117
|
+
return /* @__PURE__ */ React2.createElement("iframe", { className: "rfpe-iframe", src: `data:text/html; charset=utf-8,${encodeURIComponent(data)}`, sandbox: "" });
|
|
117
118
|
}
|
|
118
119
|
};
|
|
119
120
|
var imageRenderer = {
|
|
120
121
|
canRender: ({ mimeType }) => mimeType.startsWith("image/"),
|
|
121
122
|
Component({ src, fileName, onLoad, onError }) {
|
|
122
|
-
return /* @__PURE__ */ React2.createElement("img", { src, alt: fileName || "Image preview", onLoad, onError
|
|
123
|
+
return /* @__PURE__ */ React2.createElement("img", { className: "rfpe-image", src, alt: fileName || "Image preview", onLoad, onError });
|
|
123
124
|
}
|
|
124
125
|
};
|
|
125
126
|
var pdfRenderer = {
|
|
@@ -140,7 +141,7 @@ var pdfRenderer = {
|
|
|
140
141
|
if (objectUrl) URL.revokeObjectURL(objectUrl);
|
|
141
142
|
};
|
|
142
143
|
}, [src]);
|
|
143
|
-
return /* @__PURE__ */ React2.createElement("iframe", {
|
|
144
|
+
return /* @__PURE__ */ React2.createElement("iframe", { className: "rfpe-iframe", src: data });
|
|
144
145
|
}
|
|
145
146
|
};
|
|
146
147
|
var textRenderer = {
|
|
@@ -155,13 +156,13 @@ var textRenderer = {
|
|
|
155
156
|
}).catch(onError);
|
|
156
157
|
return () => controller.abort();
|
|
157
158
|
}, [src]);
|
|
158
|
-
return /* @__PURE__ */ React2.createElement("div", {
|
|
159
|
+
return /* @__PURE__ */ React2.createElement("div", { className: "rfpe-text" }, data);
|
|
159
160
|
}
|
|
160
161
|
};
|
|
161
162
|
var videoRenderer = {
|
|
162
163
|
canRender: ({ mimeType }) => mimeType.startsWith("video/"),
|
|
163
164
|
Component({ src, mimeType, fileName, autoPlay, onLoad, onError }) {
|
|
164
|
-
return /* @__PURE__ */ React2.createElement("video", { controls: true, autoPlay, onCanPlay: onLoad, onError,
|
|
165
|
+
return /* @__PURE__ */ React2.createElement("video", { className: "rfpe-video", controls: true, autoPlay, onCanPlay: onLoad, onError, "aria-label": fileName || "Video preview" }, /* @__PURE__ */ React2.createElement("source", { src, type: mimeType }));
|
|
165
166
|
}
|
|
166
167
|
};
|
|
167
168
|
var defaultRenderers = [textRenderer, pdfRenderer, htmlRenderer, imageRenderer, audioRenderer, videoRenderer];
|
|
@@ -190,7 +191,7 @@ function injectStyle(css) {
|
|
|
190
191
|
style.appendChild(document.createTextNode(css));
|
|
191
192
|
}
|
|
192
193
|
}
|
|
193
|
-
injectStyle(".rfpe-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n max-width: 100lvw;\n}\n.rfpe-icon {\n width: 50px;\n height: 50px;\n}\n.rfpe-iframe {\n width: 100%;\n height: 100%;\n background-color: white;\n}\n.rfpe-loader {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n.rfpe-loader-spinner {\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 2px solid transparent;\n border-top-color: black;\n border-bottom-color: black;\n animation: rfpe-spin-fast 0.6s ease infinite;\n}\n.rfpe-loader-text {\n font-size: 0.875rem;\n}\n@keyframes rfpe-spin-fast {\n to {\n transform: rotate(360deg);\n }\n}\n");
|
|
194
|
+
injectStyle(".rfpe-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n max-width: 100lvw;\n}\n.rfpe-icon {\n width: 50px;\n height: 50px;\n}\n.rfpe-audio {\n width: 100%;\n}\n.rfpe-iframe {\n width: 100%;\n height: 100%;\n background-color: white;\n}\n.rfpe-image {\n width: 100%;\n height: 100%;\n}\n.rfpe-text {\n width: 100%;\n height: 100%;\n overflow: auto;\n white-space: pre-wrap;\n}\n.rfpe-video {\n width: 100%;\n height: 100%;\n}\n.rfpe-loader {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n.rfpe-loader-spinner {\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 2px solid transparent;\n border-top-color: black;\n border-bottom-color: black;\n animation: rfpe-spin-fast 0.6s ease infinite;\n}\n.rfpe-loader-text {\n font-size: 0.875rem;\n}\n@keyframes rfpe-spin-fast {\n to {\n transform: rotate(360deg);\n }\n}\n");
|
|
194
195
|
|
|
195
196
|
// src/index.tsx
|
|
196
197
|
var { additionalContext: defaultContext, customRenderers: defaultRenderers2, props: defaultProps } = defaults;
|
|
@@ -209,10 +210,7 @@ function FilePreviewer({
|
|
|
209
210
|
onError
|
|
210
211
|
}) {
|
|
211
212
|
const resolvedSrc = useResolvedSrc(src);
|
|
212
|
-
const fileType = useMemo(() =>
|
|
213
|
-
var _a;
|
|
214
|
-
return (_a = mimeType != null ? mimeType : Mime.getType(fileName)) != null ? _a : "";
|
|
215
|
-
}, [mimeType, fileName]);
|
|
213
|
+
const fileType = useMemo(() => getFileType(mimeType, fileName), [mimeType, fileName]);
|
|
216
214
|
const fileKey = `${resolvedSrc}|${fileType}|${fileName}`;
|
|
217
215
|
const [state, setState] = useState({ key: fileKey, status: "loading" });
|
|
218
216
|
if (state.key !== fileKey) setState({ key: fileKey, status: "loading" });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-file-preview-engine",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "A renderer-driven React file preview engine with extensible architecture for images, video, audio, PDF, HTML, and custom formats.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Sahil Aggarwal <aggarwalsahil2004@gmail.com>",
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
"files": [
|
|
23
23
|
"dist"
|
|
24
24
|
],
|
|
25
|
-
"sideEffects": false,
|
|
26
25
|
"types": "dist/index.d.ts",
|
|
27
26
|
"dependencies": {
|
|
28
27
|
"mime": "^4.1.0",
|