react-file-preview-engine 0.0.1 → 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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +17 -19
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -309,4 +309,4 @@ type Renderer<T extends object = {}> = {
309
309
 
310
310
  ## Author
311
311
 
312
- [Sahil Aggarwal](https://www.github.com/SahilAggarwal2004)
312
+ [Sahil Aggarwal](https://github.com/SahilAggarwal2004)
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, style: { width: "100%" }, "aria-label": fileName || "Audio preview" }, /* @__PURE__ */ React2.createElement("source", { src, type: mimeType }));
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: "", className: "rfpe-iframe" });
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, style: { width: "100%", height: "100%" } });
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", { src: data, className: "rfpe-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", { style: { width: "100%", height: "100%", overflow: "auto", whiteSpace: "pre-wrap" } }, data);
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, style: { width: "100%", height: "100%" }, "aria-label": fileName || "Video preview" }, /* @__PURE__ */ React2.createElement("source", { src, type: mimeType }));
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.1",
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>",