@flyfish-group/file-viewer-react 1.0.20 → 1.0.21
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/README.md +4 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.js +48 -6
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
React 文件预览组件。只提供私有化部署路线: 依赖的 `@flyfish-group/file-viewer-web` 会随包携带 Vue 基线 viewer 产物;使用 `npm install` 或已允许 pnpm 安装脚本后,会复制到宿主项目 `public/file-viewer`。React 组件默认加载 `/file-viewer/index.html`,不依赖任何外部服务。
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install @flyfish-group/file-viewer-react@1.0.
|
|
6
|
+
npm install @flyfish-group/file-viewer-react@1.0.21
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
pnpm 10 默认会拦截依赖包的 `postinstall`。如果安装后提示 `Ignored build scripts: @flyfish-group/file-viewer-web`,请执行 `pnpm approve-builds` 允许该包,或运行 `pnpm exec file-viewer-copy-assets ./public/file-viewer
|
|
9
|
+
pnpm 10 默认会拦截依赖包的 `postinstall`。如果安装后提示 `Ignored build scripts: @flyfish-group/file-viewer-web`,请执行 `pnpm approve-builds` 允许该包,或运行 `pnpm exec file-viewer-copy-assets ./public/file-viewer`。复制脚本会先清空目标目录再复制,避免 `index.html` 和 `assets/*` hash 不同版本导致动态 import 404。
|
|
10
10
|
|
|
11
11
|
```tsx
|
|
12
12
|
import FileViewer from '@flyfish-group/file-viewer-react'
|
|
@@ -45,4 +45,6 @@ export function Preview() {
|
|
|
45
45
|
<FileViewer viewerUrl="/vendor/file-viewer/index.html" url={url} />
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
React 组件内部复用 `mountViewerFrame` 的地址协议,会默认追加 `__flyfish_viewer_version` 来绕开旧 iframe 入口页缓存;静态服务已经保证 HTML 不缓存时,可传 `cacheKey={false}` 关闭。
|
|
49
|
+
|
|
48
50
|
`options` 会透传给 Vue 基线预览器,可配置下载/打印/导出 HTML 操作栏、文字或图片水印,以及压缩包预览的 `libarchive.js` Worker、IndexedDB 缓存和体积上限。打印按钮会按当前格式和渲染链路动态显隐;Word / PDF 打印和导出会生成完整页面,不依赖当前 iframe 视口或已渲染 canvas。生命周期、操作能力变化和内置操作事件会通过 `onViewerEvent` 回传给宿主,适合记录加载耗时、审计下载/打印尝试和同步外部状态。
|
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,10 @@ export interface FileViewerProps extends Omit<IframeHTMLAttributes<HTMLIFrameEle
|
|
|
37
37
|
* 预留给 Vue 基线页面的查询参数。
|
|
38
38
|
*/
|
|
39
39
|
params?: ViewerFrameOptions['params'];
|
|
40
|
+
/**
|
|
41
|
+
* iframe 入口页的缓存标识。默认使用 web 包版本;传 false 可关闭。
|
|
42
|
+
*/
|
|
43
|
+
cacheKey?: ViewerFrameOptions['cacheKey'];
|
|
40
44
|
/**
|
|
41
45
|
* 透传给 Vue 基线预览器的运行时选项,例如水印、工具栏和压缩包缓存限制。
|
|
42
46
|
*/
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ const defaultStyle = {
|
|
|
8
8
|
display: 'block'
|
|
9
9
|
};
|
|
10
10
|
export const FileViewer = forwardRef((props, forwardedRef) => {
|
|
11
|
-
const { viewerUrl, url, file, name, from, targetOrigin, params, options, onViewerEvent, onLoad, style, title = 'Flyfish Viewer 文件预览', ...iframeProps } = props;
|
|
11
|
+
const { viewerUrl, url, file, name, from, targetOrigin, params, cacheKey, options, onViewerEvent, onLoad, style, title = 'Flyfish Viewer 文件预览', ...iframeProps } = props;
|
|
12
12
|
const iframeRef = useRef(null);
|
|
13
13
|
const [frameReady, setFrameReady] = useState(false);
|
|
14
14
|
const frameOptions = useMemo(() => ({
|
|
@@ -19,12 +19,45 @@ export const FileViewer = forwardRef((props, forwardedRef) => {
|
|
|
19
19
|
from,
|
|
20
20
|
targetOrigin,
|
|
21
21
|
params,
|
|
22
|
+
cacheKey,
|
|
22
23
|
options
|
|
23
|
-
}), [viewerUrl, url, file, name, from, targetOrigin, params, options]);
|
|
24
|
+
}), [viewerUrl, url, file, name, from, targetOrigin, params, cacheKey, options]);
|
|
24
25
|
const src = useMemo(() => buildViewerSrc(frameOptions), [frameOptions]);
|
|
26
|
+
const retryTimerRef = useRef(undefined);
|
|
27
|
+
const retryCountRef = useRef(0);
|
|
28
|
+
const lifecycleAcknowledgedRef = useRef(false);
|
|
25
29
|
const postFile = useCallback(() => {
|
|
26
30
|
return postFileToViewer(iframeRef.current, frameOptions);
|
|
27
31
|
}, [frameOptions]);
|
|
32
|
+
const clearFilePostRetry = useCallback(() => {
|
|
33
|
+
if (retryTimerRef.current) {
|
|
34
|
+
window.clearTimeout(retryTimerRef.current);
|
|
35
|
+
retryTimerRef.current = undefined;
|
|
36
|
+
}
|
|
37
|
+
}, []);
|
|
38
|
+
const scheduleFilePost = useCallback(() => {
|
|
39
|
+
clearFilePostRetry();
|
|
40
|
+
retryCountRef.current = 0;
|
|
41
|
+
lifecycleAcknowledgedRef.current = false;
|
|
42
|
+
if (!frameOptions.file) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const post = () => {
|
|
46
|
+
if (lifecycleAcknowledgedRef.current) {
|
|
47
|
+
clearFilePostRetry();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
postFile();
|
|
51
|
+
retryCountRef.current += 1;
|
|
52
|
+
if (retryCountRef.current < 8) {
|
|
53
|
+
retryTimerRef.current = window.setTimeout(post, 120);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
retryTimerRef.current = undefined;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
post();
|
|
60
|
+
}, [clearFilePostRetry, frameOptions.file, postFile]);
|
|
28
61
|
const reload = useCallback(() => {
|
|
29
62
|
if (iframeRef.current) {
|
|
30
63
|
iframeRef.current.src = src;
|
|
@@ -38,13 +71,15 @@ export const FileViewer = forwardRef((props, forwardedRef) => {
|
|
|
38
71
|
reload
|
|
39
72
|
}), [postFile, reload]);
|
|
40
73
|
useEffect(() => {
|
|
74
|
+
clearFilePostRetry();
|
|
75
|
+
lifecycleAcknowledgedRef.current = false;
|
|
41
76
|
setFrameReady(false);
|
|
42
|
-
}, [src]);
|
|
77
|
+
}, [clearFilePostRetry, src]);
|
|
43
78
|
useEffect(() => {
|
|
44
79
|
if (frameReady) {
|
|
45
|
-
|
|
80
|
+
scheduleFilePost();
|
|
46
81
|
}
|
|
47
|
-
}, [frameReady,
|
|
82
|
+
}, [frameReady, scheduleFilePost]);
|
|
48
83
|
useEffect(() => {
|
|
49
84
|
const handleMessage = (event) => {
|
|
50
85
|
var _a, _b, _c;
|
|
@@ -55,11 +90,18 @@ export const FileViewer = forwardRef((props, forwardedRef) => {
|
|
|
55
90
|
((_c = event.data) === null || _c === void 0 ? void 0 : _c.type) !== 'flyfish-viewer:operation') {
|
|
56
91
|
return;
|
|
57
92
|
}
|
|
93
|
+
if (event.data.type === 'flyfish-viewer:lifecycle') {
|
|
94
|
+
lifecycleAcknowledgedRef.current = true;
|
|
95
|
+
clearFilePostRetry();
|
|
96
|
+
}
|
|
58
97
|
onViewerEvent === null || onViewerEvent === void 0 ? void 0 : onViewerEvent(event.data, event);
|
|
59
98
|
};
|
|
60
99
|
window.addEventListener('message', handleMessage);
|
|
61
100
|
return () => window.removeEventListener('message', handleMessage);
|
|
62
|
-
}, [onViewerEvent]);
|
|
101
|
+
}, [clearFilePostRetry, onViewerEvent]);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
return () => clearFilePostRetry();
|
|
104
|
+
}, [clearFilePostRetry]);
|
|
63
105
|
const handleLoad = useCallback((event) => {
|
|
64
106
|
setFrameReady(true);
|
|
65
107
|
onLoad === null || onLoad === void 0 ? void 0 : onLoad(event);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyfish-group/file-viewer-react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.21",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Private-deploy React component for Flyfish Viewer",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"react": ">=17 <20"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@flyfish-group/file-viewer-web": "^1.0.
|
|
50
|
+
"@flyfish-group/file-viewer-web": "^1.0.21"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/react": "^19.2.14",
|