@eternalheart/react-file-preview 1.3.7 → 1.3.9
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 +1 -1
- package/lib/FilePreviewContent.d.ts +12 -1
- package/lib/FilePreviewContent.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.d.ts +9 -1
- package/lib/FilePreviewEmbed.d.ts.map +1 -1
- package/lib/FilePreviewModal.d.ts +9 -1
- package/lib/FilePreviewModal.d.ts.map +1 -1
- package/lib/RequestContext.d.ts +24 -0
- package/lib/RequestContext.d.ts.map +1 -0
- package/lib/chunks/{index-BIg3vHQf.mjs → index-B-H9HQiI.mjs} +35 -35
- package/lib/chunks/index-B-H9HQiI.mjs.map +1 -0
- package/lib/chunks/{index-DOMMMe9f.mjs → index-BGeyzo6u.mjs} +2 -2
- package/lib/chunks/{index-DOMMMe9f.mjs.map → index-BGeyzo6u.mjs.map} +1 -1
- package/lib/chunks/{index-zDEwNk3h.mjs → index-BNUiNUWa.mjs} +35 -35
- package/lib/chunks/index-BNUiNUWa.mjs.map +1 -0
- package/lib/chunks/{index-DTH1IvOG.mjs → index-BSD3w5eG.mjs} +72 -72
- package/lib/chunks/index-BSD3w5eG.mjs.map +1 -0
- package/lib/chunks/{index-D_8IHm6o.mjs → index-BcBe6KW7.mjs} +11 -10
- package/lib/chunks/index-BcBe6KW7.mjs.map +1 -0
- package/lib/chunks/index-BdYkTSTt.mjs +51 -0
- package/lib/chunks/index-BdYkTSTt.mjs.map +1 -0
- package/lib/chunks/{index-BWbuffRN.mjs → index-BqEuP_8r.mjs} +8 -8
- package/lib/chunks/index-BqEuP_8r.mjs.map +1 -0
- package/lib/chunks/{index-LNXbKjrI.mjs → index-Bv93wiEK.mjs} +812 -681
- package/lib/chunks/index-Bv93wiEK.mjs.map +1 -0
- package/lib/chunks/{index-xTq9b3vw.mjs → index-CKirCT35.mjs} +13 -13
- package/lib/chunks/index-CKirCT35.mjs.map +1 -0
- package/lib/chunks/{index-BOEtlHD3.mjs → index-CgV8T0G5.mjs} +53 -53
- package/lib/chunks/index-CgV8T0G5.mjs.map +1 -0
- package/lib/chunks/{index-DinKO2op.mjs → index-D8GtNeDn.mjs} +2 -2
- package/lib/chunks/{index-DinKO2op.mjs.map → index-D8GtNeDn.mjs.map} +1 -1
- package/lib/chunks/{index-CQABwGVP.mjs → index-DGuiWJr7.mjs} +18 -18
- package/lib/chunks/index-DGuiWJr7.mjs.map +1 -0
- package/lib/chunks/{index-Yp36heK8.mjs → index-DV5Jd7Qe.mjs} +31 -31
- package/lib/chunks/index-DV5Jd7Qe.mjs.map +1 -0
- package/lib/chunks/{index-qxvk-6P6.mjs → index-DdOEWhrk.mjs} +33 -33
- package/lib/chunks/index-DdOEWhrk.mjs.map +1 -0
- package/lib/chunks/{index-w0tt7Myw.mjs → index-DmepcY31.mjs} +2 -2
- package/lib/chunks/{index-w0tt7Myw.mjs.map → index-DmepcY31.mjs.map} +1 -1
- package/lib/chunks/index-U3w45GW8.mjs +299 -0
- package/lib/chunks/index-U3w45GW8.mjs.map +1 -0
- package/lib/chunks/{index-BsSx9pGx.mjs → index-r3q2xCCI.mjs} +37 -36
- package/lib/chunks/index-r3q2xCCI.mjs.map +1 -0
- package/lib/chunks/{index-BEolw_uv.mjs → index-zEVVgWCH.mjs} +2 -2
- package/lib/chunks/{index-BEolw_uv.mjs.map → index-zEVVgWCH.mjs.map} +1 -1
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs → useShikiHighlight-DzEAK0S7.mjs} +7 -7
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs.map → useShikiHighlight-DzEAK0S7.mjs.map} +1 -1
- package/lib/index.cjs +20 -33
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +7 -7
- package/lib/renderers/Csv/index.d.ts.map +1 -1
- package/lib/renderers/Docx/index.d.ts.map +1 -1
- package/lib/renderers/Epub/index.d.ts.map +1 -1
- package/lib/renderers/Json/index.d.ts.map +1 -1
- package/lib/renderers/Markdown/index.d.ts.map +1 -1
- package/lib/renderers/Mobi/index.d.ts.map +1 -1
- package/lib/renderers/Msg/index.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.d.ts.map +1 -1
- package/lib/renderers/Subtitle/index.d.ts.map +1 -1
- package/lib/renderers/Text/index.d.ts.map +1 -1
- package/lib/renderers/Xlsx/index.d.ts.map +1 -1
- package/lib/renderers/Xml/index.d.ts.map +1 -1
- package/lib/renderers/Zip/index.d.ts.map +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/lib/chunks/index--zZy1XpK.mjs +0 -299
- package/lib/chunks/index--zZy1XpK.mjs.map +0 -1
- package/lib/chunks/index-B5tBeF0g.mjs +0 -51
- package/lib/chunks/index-B5tBeF0g.mjs.map +0 -1
- package/lib/chunks/index-BIg3vHQf.mjs.map +0 -1
- package/lib/chunks/index-BOEtlHD3.mjs.map +0 -1
- package/lib/chunks/index-BWbuffRN.mjs.map +0 -1
- package/lib/chunks/index-BsSx9pGx.mjs.map +0 -1
- package/lib/chunks/index-CQABwGVP.mjs.map +0 -1
- package/lib/chunks/index-DTH1IvOG.mjs.map +0 -1
- package/lib/chunks/index-D_8IHm6o.mjs.map +0 -1
- package/lib/chunks/index-LNXbKjrI.mjs.map +0 -1
- package/lib/chunks/index-Yp36heK8.mjs.map +0 -1
- package/lib/chunks/index-qxvk-6P6.mjs.map +0 -1
- package/lib/chunks/index-xTq9b3vw.mjs.map +0 -1
- package/lib/chunks/index-zDEwNk3h.mjs.map +0 -1
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs +0 -5215
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs.map +0 -1
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { jsxs as M, jsx as e, Fragment as O } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as _, useState as a, useEffect as z, useCallback as D, useMemo as J, Suspense as Q, lazy as V } from "react";
|
|
3
|
+
import { createPortal as K } from "react-dom";
|
|
4
|
+
import { ChevronRight as ee, FolderOpen as re, Folder as te, FileImage as ne, FileText as fe, FileCode as se, File as le } from "lucide-react";
|
|
5
|
+
import { u as ie, a as pe, k as Z, M as ae, C as oe, d as ce, S as de, m as ue, e as me } from "./index-Bv93wiEK.mjs";
|
|
6
|
+
const he = ({
|
|
7
|
+
left: t,
|
|
8
|
+
right: l,
|
|
9
|
+
initialLeftWidth: w = 280,
|
|
10
|
+
minLeftWidth: v = 160,
|
|
11
|
+
maxLeftWidth: b = 640,
|
|
12
|
+
minRightWidth: d = 200,
|
|
13
|
+
storageKey: o,
|
|
14
|
+
desktopMedia: p = "(min-width: 768px)",
|
|
15
|
+
className: y = ""
|
|
16
|
+
}) => {
|
|
17
|
+
const g = _(null), [u, N] = a(() => {
|
|
18
|
+
if (o && typeof window < "u") {
|
|
19
|
+
const s = Number(window.localStorage.getItem(o));
|
|
20
|
+
if (!isNaN(s) && s > 0) return s;
|
|
21
|
+
}
|
|
22
|
+
return w;
|
|
23
|
+
}), [c, k] = a(!1), [m, n] = a(!1);
|
|
24
|
+
z(() => {
|
|
25
|
+
if (typeof window > "u") return;
|
|
26
|
+
const s = window.matchMedia(p), h = () => n(s.matches);
|
|
27
|
+
return h(), s.addEventListener("change", h), () => s.removeEventListener("change", h);
|
|
28
|
+
}, [p]), z(() => {
|
|
29
|
+
if (!c) return;
|
|
30
|
+
const s = (E) => {
|
|
31
|
+
if (!g.current) return;
|
|
32
|
+
const j = g.current.getBoundingClientRect(), x = E.clientX - j.left, R = j.width - d - 6, $ = Math.min(b, R), C = Math.max(v, Math.min($, x));
|
|
33
|
+
N(C);
|
|
34
|
+
}, h = () => k(!1);
|
|
35
|
+
window.addEventListener("mousemove", s), window.addEventListener("mouseup", h);
|
|
36
|
+
const U = document.body.style.cursor, F = document.body.style.userSelect;
|
|
37
|
+
return document.body.style.cursor = "col-resize", document.body.style.userSelect = "none", () => {
|
|
38
|
+
window.removeEventListener("mousemove", s), window.removeEventListener("mouseup", h), document.body.style.cursor = U, document.body.style.userSelect = F;
|
|
39
|
+
};
|
|
40
|
+
}, [c, v, b, d]), z(() => {
|
|
41
|
+
if (!(!o || c))
|
|
42
|
+
try {
|
|
43
|
+
window.localStorage.setItem(o, String(u));
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
}, [u, o, c]);
|
|
47
|
+
const T = D((s) => {
|
|
48
|
+
s.preventDefault(), k(!0);
|
|
49
|
+
}, []);
|
|
50
|
+
return /* @__PURE__ */ M(
|
|
51
|
+
"div",
|
|
52
|
+
{
|
|
53
|
+
ref: g,
|
|
54
|
+
className: `rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${y}`,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ e(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
className: "rfp-min-h-0 rfp-min-w-0 rfp-flex-shrink-0 rfp-w-full rfp-max-h-60 md:rfp-h-full md:rfp-max-h-none",
|
|
60
|
+
style: m ? { width: `${u}px` } : void 0,
|
|
61
|
+
children: t
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
/* @__PURE__ */ e(
|
|
65
|
+
"div",
|
|
66
|
+
{
|
|
67
|
+
role: "separator",
|
|
68
|
+
"aria-orientation": "vertical",
|
|
69
|
+
onMouseDown: T,
|
|
70
|
+
className: `rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${c ? "rfp-bg-surface-toolbar" : "rfp-bg-surface-2 hover:rfp-bg-surface-3"}`,
|
|
71
|
+
children: /* @__PURE__ */ e("span", { className: "rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1" })
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
/* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden", children: l })
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}, xe = V(
|
|
79
|
+
() => import("./index-Bv93wiEK.mjs").then((t) => t.o).then((t) => ({ default: t.FilePreviewContent }))
|
|
80
|
+
), we = (t) => {
|
|
81
|
+
const l = me({ name: t, type: "" });
|
|
82
|
+
return l === "image" ? ne : l === "text" || l === "markdown" || l === "json" || l === "csv" || l === "xml" || l === "subtitle" ? t.endsWith(".md") || t.endsWith(".markdown") ? fe : se : le;
|
|
83
|
+
}, q = ({
|
|
84
|
+
node: t,
|
|
85
|
+
depth: l,
|
|
86
|
+
selectedPath: w,
|
|
87
|
+
expanded: v,
|
|
88
|
+
onToggle: b,
|
|
89
|
+
onSelect: d,
|
|
90
|
+
onHover: o,
|
|
91
|
+
onLeave: p
|
|
92
|
+
}) => {
|
|
93
|
+
var k;
|
|
94
|
+
const y = v.has(t.path), g = w === t.path, u = { paddingLeft: `${l * 14 + 10}px` }, N = (m) => {
|
|
95
|
+
const n = m.currentTarget.getBoundingClientRect();
|
|
96
|
+
o(t.name || "/", n);
|
|
97
|
+
};
|
|
98
|
+
if (t.isDir)
|
|
99
|
+
return /* @__PURE__ */ M(O, { children: [
|
|
100
|
+
/* @__PURE__ */ M(
|
|
101
|
+
"button",
|
|
102
|
+
{
|
|
103
|
+
type: "button",
|
|
104
|
+
onClick: () => b(t.path),
|
|
105
|
+
onMouseEnter: N,
|
|
106
|
+
onMouseLeave: p,
|
|
107
|
+
className: "rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-fg-secondary hover:rfp-bg-surface-1 rfp-text-sm",
|
|
108
|
+
style: u,
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ e(
|
|
111
|
+
ee,
|
|
112
|
+
{
|
|
113
|
+
className: `rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${y ? "rfp-rotate-90" : ""}`
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
y ? /* @__PURE__ */ e(re, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }) : /* @__PURE__ */ e(te, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80" }),
|
|
117
|
+
/* @__PURE__ */ e("span", { className: "rfp-truncate rfp-flex-1 rfp-min-w-0", children: t.name || "/" })
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
y && ((k = t.children) == null ? void 0 : k.map((m) => /* @__PURE__ */ e(
|
|
122
|
+
q,
|
|
123
|
+
{
|
|
124
|
+
node: m,
|
|
125
|
+
depth: l + 1,
|
|
126
|
+
selectedPath: w,
|
|
127
|
+
expanded: v,
|
|
128
|
+
onToggle: b,
|
|
129
|
+
onSelect: d,
|
|
130
|
+
onHover: o,
|
|
131
|
+
onLeave: p
|
|
132
|
+
},
|
|
133
|
+
m.path
|
|
134
|
+
)))
|
|
135
|
+
] });
|
|
136
|
+
const c = we(t.name);
|
|
137
|
+
return /* @__PURE__ */ M(
|
|
138
|
+
"button",
|
|
139
|
+
{
|
|
140
|
+
type: "button",
|
|
141
|
+
onClick: () => d(t),
|
|
142
|
+
onMouseEnter: N,
|
|
143
|
+
onMouseLeave: p,
|
|
144
|
+
className: `rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${g ? "rfp-bg-surface-2 rfp-text-fg-primary" : "rfp-text-fg-secondary hover:rfp-bg-surface-1"}`,
|
|
145
|
+
style: u,
|
|
146
|
+
children: [
|
|
147
|
+
/* @__PURE__ */ e("span", { className: "rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0" }),
|
|
148
|
+
/* @__PURE__ */ e(c, { className: "rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary" }),
|
|
149
|
+
/* @__PURE__ */ e("span", { className: "rfp-flex-1 rfp-truncate rfp-min-w-0", children: t.name }),
|
|
150
|
+
/* @__PURE__ */ e("span", { className: "rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2", children: ue(t.size) })
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}, ke = ({ url: t, nestingDepth: l = 0, onStatsChange: w }) => {
|
|
155
|
+
var W;
|
|
156
|
+
const v = ie(), b = pe(), [d, o] = a(null), [p, y] = a(null), [g, u] = a(!0), [N, c] = a(null), [k, m] = a(/* @__PURE__ */ new Set([""])), [n, T] = a(null), [s, h] = a(!1), [U, F] = a(null), [E, j] = a(null), x = _(w);
|
|
157
|
+
z(() => {
|
|
158
|
+
x.current = w;
|
|
159
|
+
}, [w]), z(() => {
|
|
160
|
+
let r = !1;
|
|
161
|
+
return (async () => {
|
|
162
|
+
try {
|
|
163
|
+
u(!0), c(null);
|
|
164
|
+
const i = await b(t);
|
|
165
|
+
if (!i.ok) throw new Error("加载失败");
|
|
166
|
+
const S = await i.arrayBuffer(), L = await oe(S);
|
|
167
|
+
if (r) return;
|
|
168
|
+
const I = ce(L), P = de(I);
|
|
169
|
+
o(L), y(P);
|
|
170
|
+
const B = /* @__PURE__ */ new Set([""]);
|
|
171
|
+
if (P.children)
|
|
172
|
+
for (const H of P.children) H.isDir && B.add(H.path);
|
|
173
|
+
m(B);
|
|
174
|
+
} catch (i) {
|
|
175
|
+
console.error(i), r || c(v("zip.load_failed"));
|
|
176
|
+
} finally {
|
|
177
|
+
r || u(!1);
|
|
178
|
+
}
|
|
179
|
+
})(), () => {
|
|
180
|
+
r = !0;
|
|
181
|
+
};
|
|
182
|
+
}, [t]), z(() => () => {
|
|
183
|
+
n != null && n.blobUrl && URL.revokeObjectURL(n.blobUrl);
|
|
184
|
+
}, [n]);
|
|
185
|
+
const R = J(() => {
|
|
186
|
+
if (!p) return null;
|
|
187
|
+
let r = 0, f = 0, i = 0;
|
|
188
|
+
const S = (L) => {
|
|
189
|
+
var I;
|
|
190
|
+
L.isDir ? (L.path && f++, (I = L.children) == null || I.forEach(S)) : (r++, i += L.size);
|
|
191
|
+
};
|
|
192
|
+
return S(p), { files: r, dirs: f, size: i };
|
|
193
|
+
}, [p]);
|
|
194
|
+
z(() => {
|
|
195
|
+
var r;
|
|
196
|
+
return (r = x.current) == null || r.call(x, R), () => {
|
|
197
|
+
var f;
|
|
198
|
+
(f = x.current) == null || f.call(x, null);
|
|
199
|
+
};
|
|
200
|
+
}, [R]);
|
|
201
|
+
const $ = D((r) => {
|
|
202
|
+
m((f) => {
|
|
203
|
+
const i = new Set(f);
|
|
204
|
+
return i.has(r) ? i.delete(r) : i.add(r), i;
|
|
205
|
+
});
|
|
206
|
+
}, []), C = D((r, f) => {
|
|
207
|
+
j({
|
|
208
|
+
text: r,
|
|
209
|
+
x: f.right + 8,
|
|
210
|
+
y: f.top + f.height / 2
|
|
211
|
+
});
|
|
212
|
+
}, []), X = D(() => {
|
|
213
|
+
j(null);
|
|
214
|
+
}, []), Y = D(
|
|
215
|
+
async (r) => {
|
|
216
|
+
if (!(!d || r.isDir)) {
|
|
217
|
+
n != null && n.blobUrl && URL.revokeObjectURL(n.blobUrl), h(!0), F(null);
|
|
218
|
+
try {
|
|
219
|
+
const f = Z(r.name), i = await ae(d, r.path, f !== "application/octet-stream" ? f : void 0), S = URL.createObjectURL(i);
|
|
220
|
+
T({ path: r.path, name: r.name, size: r.size, blobUrl: S });
|
|
221
|
+
} catch (f) {
|
|
222
|
+
console.error(f), F("条目读取失败");
|
|
223
|
+
} finally {
|
|
224
|
+
h(!1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
[d, n]
|
|
229
|
+
);
|
|
230
|
+
if (g)
|
|
231
|
+
return /* @__PURE__ */ e("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full", children: /* @__PURE__ */ e("div", { className: "rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) });
|
|
232
|
+
if (N || !p)
|
|
233
|
+
return /* @__PURE__ */ e("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full", children: /* @__PURE__ */ e("div", { className: "rfp-text-fg-secondary rfp-text-center", children: /* @__PURE__ */ e("p", { className: "rfp-text-lg", children: N || v("zip.parse_failed") }) }) });
|
|
234
|
+
const A = /* @__PURE__ */ e("div", { className: "rfp-w-full rfp-h-full rfp-overflow-auto", children: (W = p.children) == null ? void 0 : W.map((r) => /* @__PURE__ */ e(
|
|
235
|
+
q,
|
|
236
|
+
{
|
|
237
|
+
node: r,
|
|
238
|
+
depth: 0,
|
|
239
|
+
selectedPath: (n == null ? void 0 : n.path) ?? null,
|
|
240
|
+
expanded: k,
|
|
241
|
+
onToggle: $,
|
|
242
|
+
onSelect: Y,
|
|
243
|
+
onHover: C,
|
|
244
|
+
onLeave: X
|
|
245
|
+
},
|
|
246
|
+
r.path
|
|
247
|
+
)) }), G = /* @__PURE__ */ M("div", { className: "rfp-w-full rfp-h-full rfp-flex rfp-flex-col", children: [
|
|
248
|
+
!n && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6", children: "从左侧选择一个文件以预览" }),
|
|
249
|
+
n && s && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center", children: /* @__PURE__ */ e("div", { className: "rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
|
|
250
|
+
n && !s && U && /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary", children: U }),
|
|
251
|
+
n && !s && !U && /* @__PURE__ */ e(O, { children: /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0", children: /* @__PURE__ */ e(
|
|
252
|
+
Q,
|
|
253
|
+
{
|
|
254
|
+
fallback: /* @__PURE__ */ e("div", { className: "rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center", children: /* @__PURE__ */ e("div", { className: "rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }) }),
|
|
255
|
+
children: /* @__PURE__ */ e(
|
|
256
|
+
xe,
|
|
257
|
+
{
|
|
258
|
+
mode: "embed",
|
|
259
|
+
files: [{ name: n.name, url: n.blobUrl, type: Z(n.name) }],
|
|
260
|
+
currentIndex: 0,
|
|
261
|
+
zipNestingDepth: l + 1
|
|
262
|
+
}
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
) }) })
|
|
266
|
+
] });
|
|
267
|
+
return /* @__PURE__ */ M(O, { children: [
|
|
268
|
+
/* @__PURE__ */ e(
|
|
269
|
+
he,
|
|
270
|
+
{
|
|
271
|
+
left: A,
|
|
272
|
+
right: G,
|
|
273
|
+
initialLeftWidth: 280,
|
|
274
|
+
minLeftWidth: 180,
|
|
275
|
+
maxLeftWidth: 560,
|
|
276
|
+
storageKey: "rfp-zip-split-left"
|
|
277
|
+
}
|
|
278
|
+
),
|
|
279
|
+
E && typeof document < "u" && K(
|
|
280
|
+
/* @__PURE__ */ e(
|
|
281
|
+
"div",
|
|
282
|
+
{
|
|
283
|
+
className: "rfp-fixed rfp-z-[9999] rfp-pointer-events-none rfp-px-2 rfp-py-1 rfp-bg-[rgba(0,0,0,0.85)] rfp-text-fg-primary rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-shadow-lg",
|
|
284
|
+
style: {
|
|
285
|
+
left: `${E.x}px`,
|
|
286
|
+
top: `${E.y}px`,
|
|
287
|
+
transform: "translateY(-50%)"
|
|
288
|
+
},
|
|
289
|
+
children: E.text
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
document.body
|
|
293
|
+
)
|
|
294
|
+
] });
|
|
295
|
+
};
|
|
296
|
+
export {
|
|
297
|
+
ke as ZipRenderer
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=index-U3w45GW8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-U3w45GW8.mjs","sources":["../../src/components/ResizableSplit.tsx","../../src/renderers/Zip/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback } from 'react';\n\nexport interface ResizableSplitProps {\n /** 左侧内容 */\n left: React.ReactNode;\n /** 右侧内容 */\n right: React.ReactNode;\n /** 左侧初始宽度(px);传入 storageKey 时会从 localStorage 读取 */\n initialLeftWidth?: number;\n /** 左侧最小宽度(px) */\n minLeftWidth?: number;\n /** 左侧最大宽度(px),同时不超过 `容器宽 - minRightWidth - 分隔线宽` */\n maxLeftWidth?: number;\n /** 右侧至少保留的宽度(px) */\n minRightWidth?: number;\n /** localStorage 持久化 key;不传则不持久化 */\n storageKey?: string;\n /** 启用横向拖动的媒体查询,默认 `(min-width: 768px)` */\n desktopMedia?: string;\n /** 容器额外类名 */\n className?: string;\n}\n\n/**\n * 通用可拖动分隔布局:\n * - 桌面端(由 `desktopMedia` 判定)横向分两栏,中间分隔线可左右拖动调整左栏宽度\n * - 移动端退化为上下堆叠,不显示分隔线\n * - 可选 `storageKey` 将宽度持久化到 localStorage\n */\nexport const ResizableSplit: React.FC<ResizableSplitProps> = ({\n left,\n right,\n initialLeftWidth = 280,\n minLeftWidth = 160,\n maxLeftWidth = 640,\n minRightWidth = 200,\n storageKey,\n desktopMedia = '(min-width: 768px)',\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [leftWidth, setLeftWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = Number(window.localStorage.getItem(storageKey));\n if (!isNaN(saved) && saved > 0) return saved;\n }\n return initialLeftWidth;\n });\n const [dragging, setDragging] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n\n // 响应式:监听媒体查询\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(desktopMedia);\n const handler = () => setIsDesktop(mq.matches);\n handler();\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [desktopMedia]);\n\n // 拖动\n useEffect(() => {\n if (!dragging) return;\n const handleMove = (e: MouseEvent) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cap = rect.width - minRightWidth - 6;\n const effectiveMax = Math.min(maxLeftWidth, cap);\n const newW = Math.max(minLeftWidth, Math.min(effectiveMax, x));\n setLeftWidth(newW);\n };\n const handleUp = () => setDragging(false);\n window.addEventListener('mousemove', handleMove);\n window.addEventListener('mouseup', handleUp);\n const prevCursor = document.body.style.cursor;\n const prevSelect = document.body.style.userSelect;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('mousemove', handleMove);\n window.removeEventListener('mouseup', handleUp);\n document.body.style.cursor = prevCursor;\n document.body.style.userSelect = prevSelect;\n };\n }, [dragging, minLeftWidth, maxLeftWidth, minRightWidth]);\n\n // 持久化\n useEffect(() => {\n if (!storageKey || dragging) return;\n try {\n window.localStorage.setItem(storageKey, String(leftWidth));\n } catch {\n // ignore\n }\n }, [leftWidth, storageKey, dragging]);\n\n const handleDividerDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setDragging(true);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${className}`}\n >\n <div\n className=\"rfp-min-h-0 rfp-min-w-0 rfp-flex-shrink-0 rfp-w-full rfp-max-h-60 md:rfp-h-full md:rfp-max-h-none\"\n style={isDesktop ? { width: `${leftWidth}px` } : undefined}\n >\n {left}\n </div>\n {/* 分隔线:仅桌面显示 */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n onMouseDown={handleDividerDown}\n className={`rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${\n dragging ? 'rfp-bg-surface-toolbar' : 'rfp-bg-surface-2 hover:rfp-bg-surface-3'\n }`}\n >\n {/* 加宽命中区,改善拖动体验 */}\n <span className=\"rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1\" />\n </div>\n <div className=\"rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden\">{right}</div>\n </div>\n );\n};\n","import { useState, useEffect, useMemo, useCallback, useRef, lazy, Suspense } from 'react';\nimport React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n Folder,\n FolderOpen,\n FileText,\n FileImage,\n FileCode,\n File as FileIcon,\n ChevronRight,\n} from 'lucide-react';\nimport type JSZip from 'jszip';\nimport {\n loadZip,\n listZipEntries,\n buildZipTree,\n readZipEntryBlob,\n formatFileSize,\n getFileType,\n inferMimeType,\n type ZipTreeNode,\n} from '@eternalheart/file-preview-core';\nimport { ResizableSplit } from '../../components/ResizableSplit';\nimport type { ZipToolbarStats } from './toolbar';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\n// 懒加载 FilePreviewContent 以打破循环依赖\nconst LazyFilePreviewContent = lazy(() =>\n import('../../FilePreviewContent').then(m => ({ default: m.FilePreviewContent }))\n);\n\ninterface ZipRendererProps {\n url: string;\n /** ZIP 嵌套深度(由 FilePreviewContent 传入) */\n nestingDepth?: number;\n /** 解析完成后向外回报统计信息(files / dirs / size),供工具栏展示 */\n onStatsChange?: (stats: ZipToolbarStats | null) => void;\n}\n\ninterface SelectedPreview {\n path: string;\n name: string;\n size: number;\n blobUrl: string;\n}\n\n/** 根据文件类型返回树节点图标 */\nconst resolveIcon = (name: string) => {\n const ft = getFileType({ id: '', name, url: '', type: '' });\n if (ft === 'image') return FileImage;\n if (ft === 'text' || ft === 'markdown' || ft === 'json' || ft === 'csv' || ft === 'xml' || ft === 'subtitle') {\n return name.endsWith('.md') || name.endsWith('.markdown') ? FileText : FileCode;\n }\n return FileIcon;\n};\n\n// ---------- Tooltip via portal ----------\n\ninterface HoverTipState {\n text: string;\n x: number;\n y: number;\n}\n\n// ---------- Tree item ----------\n\ninterface TreeItemProps {\n node: ZipTreeNode;\n depth: number;\n selectedPath: string | null;\n expanded: Set<string>;\n onToggle: (path: string) => void;\n onSelect: (node: ZipTreeNode) => void;\n onHover: (text: string, rect: DOMRect) => void;\n onLeave: () => void;\n}\n\nconst TreeItem: React.FC<TreeItemProps> = ({\n node,\n depth,\n selectedPath,\n expanded,\n onToggle,\n onSelect,\n onHover,\n onLeave,\n}) => {\n const isOpen = expanded.has(node.path);\n const isSelected = selectedPath === node.path;\n const pad = { paddingLeft: `${depth * 14 + 10}px` };\n const handleEnter = (e: React.MouseEvent<HTMLElement>) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onHover(node.name || '/', rect);\n };\n\n if (node.isDir) {\n return (\n <>\n <button\n type=\"button\"\n onClick={() => onToggle(node.path)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className=\"rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-fg-secondary hover:rfp-bg-surface-1 rfp-text-sm\"\n style={pad}\n >\n <ChevronRight\n className={`rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${\n isOpen ? 'rfp-rotate-90' : ''\n }`}\n />\n {isOpen ? (\n <FolderOpen className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n ) : (\n <Folder className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n )}\n <span className=\"rfp-truncate rfp-flex-1 rfp-min-w-0\">{node.name || '/'}</span>\n </button>\n {isOpen &&\n node.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={depth + 1}\n selectedPath={selectedPath}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n onHover={onHover}\n onLeave={onLeave}\n />\n ))}\n </>\n );\n }\n\n const Icon = resolveIcon(node.name);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(node)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className={`rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${\n isSelected ? 'rfp-bg-surface-2 rfp-text-fg-primary' : 'rfp-text-fg-secondary hover:rfp-bg-surface-1'\n }`}\n style={pad}\n >\n <span className=\"rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0\" />\n <Icon className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary\" />\n <span className=\"rfp-flex-1 rfp-truncate rfp-min-w-0\">{node.name}</span>\n <span className=\"rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2\">\n {formatFileSize(node.size)}\n </span>\n </button>\n );\n};\n\n// ---------- Main Zip Renderer ----------\n\nexport const ZipRenderer: React.FC<ZipRendererProps> = ({ url, nestingDepth = 0, onStatsChange }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [zip, setZip] = useState<JSZip | null>(null);\n const [tree, setTree] = useState<ZipTreeNode | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['']));\n const [selected, setSelected] = useState<SelectedPreview | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [hoverTip, setHoverTip] = useState<HoverTipState | null>(null);\n const onStatsChangeRef = useRef(onStatsChange);\n\n useEffect(() => {\n onStatsChangeRef.current = onStatsChange;\n }, [onStatsChange]);\n\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const res = await fetcher(url);\n if (!res.ok) throw new Error('加载失败');\n const buf = await res.arrayBuffer();\n const z = await loadZip(buf);\n if (cancelled) return;\n const entries = listZipEntries(z);\n const root = buildZipTree(entries);\n setZip(z);\n setTree(root);\n const init = new Set<string>(['']);\n if (root.children) {\n for (const c of root.children) if (c.isDir) init.add(c.path);\n }\n setExpanded(init);\n } catch (err) {\n console.error(err);\n if (!cancelled) setError(t('zip.load_failed'));\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n load();\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n // 切换文件时回收 blob URL\n useEffect(() => {\n return () => {\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n };\n }, [selected]);\n\n const totalStats = useMemo<ZipToolbarStats | null>(() => {\n if (!tree) return null;\n let files = 0;\n let dirs = 0;\n let size = 0;\n const walk = (n: ZipTreeNode) => {\n if (n.isDir) {\n if (n.path) dirs++;\n n.children?.forEach(walk);\n } else {\n files++;\n size += n.size;\n }\n };\n walk(tree);\n return { files, dirs, size };\n }, [tree]);\n\n // 向外回报 stats\n useEffect(() => {\n onStatsChangeRef.current?.(totalStats);\n return () => {\n onStatsChangeRef.current?.(null);\n };\n }, [totalStats]);\n\n const handleToggle = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleHover = useCallback((text: string, rect: DOMRect) => {\n setHoverTip({\n text,\n x: rect.right + 8,\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleLeave = useCallback(() => {\n setHoverTip(null);\n }, []);\n\n const handleSelect = useCallback(\n async (node: ZipTreeNode) => {\n if (!zip || node.isDir) return;\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n setPreviewLoading(true);\n setPreviewError(null);\n\n try {\n const mime = inferMimeType(node.name);\n const blob = await readZipEntryBlob(zip, node.path, mime !== 'application/octet-stream' ? mime : undefined);\n const blobUrl = URL.createObjectURL(blob);\n setSelected({ path: node.path, name: node.name, size: node.size, blobUrl });\n } catch (err) {\n console.error(err);\n setPreviewError('条目读取失败');\n } finally {\n setPreviewLoading(false);\n }\n },\n [zip, selected]\n );\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !tree) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('zip.parse_failed')}</p>\n </div>\n </div>\n );\n }\n\n // 左侧:文件树\n const leftPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto\">\n {tree.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={0}\n selectedPath={selected?.path ?? null}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={handleSelect}\n onHover={handleHover}\n onLeave={handleLeave}\n />\n ))}\n </div>\n );\n\n // 右侧:预览区\n const rightPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-flex rfp-flex-col\">\n {!selected && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n )}\n {selected && previewLoading && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n {selected && !previewLoading && previewError && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary\">\n {previewError}\n </div>\n )}\n {selected && !previewLoading && !previewError && (\n <>\n <div className=\"rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0\">\n <Suspense\n fallback={\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <LazyFilePreviewContent\n mode=\"embed\"\n files={[{ name: selected.name, url: selected.blobUrl, type: inferMimeType(selected.name) }]}\n currentIndex={0}\n zipNestingDepth={nestingDepth + 1}\n />\n </Suspense>\n </div>\n </>\n )}\n </div>\n );\n\n return (\n <>\n <ResizableSplit\n left={leftPane}\n right={rightPane}\n initialLeftWidth={280}\n minLeftWidth={180}\n maxLeftWidth={560}\n storageKey=\"rfp-zip-split-left\"\n />\n {/* 文件名 hover tooltip(portal 到 body,避免被滚动区裁剪) */}\n {hoverTip &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"rfp-fixed rfp-z-[9999] rfp-pointer-events-none rfp-px-2 rfp-py-1 rfp-bg-[rgba(0,0,0,0.85)] rfp-text-fg-primary rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-shadow-lg\"\n style={{\n left: `${hoverTip.x}px`,\n top: `${hoverTip.y}px`,\n transform: 'translateY(-50%)',\n }}\n >\n {hoverTip.text}\n </div>,\n document.body\n )}\n </>\n );\n};\n"],"names":["ResizableSplit","left","right","initialLeftWidth","minLeftWidth","maxLeftWidth","minRightWidth","storageKey","desktopMedia","className","containerRef","useRef","leftWidth","setLeftWidth","useState","saved","dragging","setDragging","isDesktop","setIsDesktop","useEffect","mq","handler","handleMove","e","rect","cap","effectiveMax","newW","handleUp","prevCursor","prevSelect","handleDividerDown","useCallback","jsxs","jsx","LazyFilePreviewContent","lazy","n","m","resolveIcon","name","ft","getFileType","FileImage","FileText","FileCode","FileIcon","TreeItem","node","depth","selectedPath","expanded","onToggle","onSelect","onHover","onLeave","isOpen","isSelected","pad","handleEnter","Fragment","ChevronRight","FolderOpen","Folder","_a","child","Icon","formatFileSize","ZipRenderer","url","nestingDepth","onStatsChange","t","useTranslator","fetcher","useFetcher","zip","setZip","tree","setTree","loading","setLoading","error","setError","setExpanded","selected","setSelected","previewLoading","setPreviewLoading","previewError","setPreviewError","hoverTip","setHoverTip","onStatsChangeRef","cancelled","res","buf","z","loadZip","entries","listZipEntries","root","buildZipTree","init","c","err","totalStats","useMemo","files","dirs","size","walk","handleToggle","path","prev","next","handleHover","text","handleLeave","handleSelect","mime","inferMimeType","blob","readZipEntryBlob","blobUrl","leftPane","rightPane","Suspense","createPortal"],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { jsxs as h, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { useState as k, useRef as i, useCallback as E, useEffect as D } from "react";
|
|
3
|
-
import { FileSpreadsheet as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { FileSpreadsheet as M } from "lucide-react";
|
|
4
|
+
import z from "exceljs";
|
|
5
|
+
import W from "x-data-spreadsheet";
|
|
6
|
+
/* empty css */
|
|
7
|
+
import { u as j, a as L, z as S } from "./index-Bv93wiEK.mjs";
|
|
8
|
+
const A = ({ url: x }) => {
|
|
9
|
+
const a = j(), R = L(), [w, g] = k(!0), [b, N] = k(null), e = i(null), v = i(null), l = i(null), d = i(null), p = i(null), y = i({ width: 0, height: 0 }), c = E(() => {
|
|
9
10
|
if (!e.current) return { width: 800, height: 600 };
|
|
10
|
-
const t = e.current.clientWidth,
|
|
11
|
-
return { width:
|
|
11
|
+
const t = e.current.clientWidth, f = e.current.clientHeight, s = t > 100 ? t : 800, r = f > 100 ? f : 600;
|
|
12
|
+
return { width: s, height: r };
|
|
12
13
|
}, []), m = E(() => {
|
|
13
|
-
if (!e.current || !
|
|
14
|
+
if (!e.current || !l.current) return;
|
|
14
15
|
e.current.innerHTML = "", v.current = null;
|
|
15
|
-
const { width: t, height:
|
|
16
|
+
const { width: t, height: f } = c(), s = t < 640, r = new W(e.current, {
|
|
16
17
|
mode: "read",
|
|
17
18
|
showToolbar: !1,
|
|
18
19
|
showContextmenu: !1,
|
|
@@ -23,80 +24,80 @@ const F = ({ url: x }) => {
|
|
|
23
24
|
},
|
|
24
25
|
col: {
|
|
25
26
|
len: 26,
|
|
26
|
-
width:
|
|
27
|
-
indexWidth:
|
|
28
|
-
minWidth:
|
|
27
|
+
width: s ? 80 : 100,
|
|
28
|
+
indexWidth: s ? 40 : 60,
|
|
29
|
+
minWidth: s ? 40 : 60
|
|
29
30
|
},
|
|
30
31
|
view: {
|
|
31
|
-
height: () =>
|
|
32
|
+
height: () => f,
|
|
32
33
|
width: () => t
|
|
33
34
|
}
|
|
34
35
|
});
|
|
35
|
-
r.loadData(
|
|
36
|
+
r.loadData(l.current), v.current = r;
|
|
36
37
|
}, [c]);
|
|
37
38
|
return D(() => {
|
|
38
39
|
if (!e.current) return;
|
|
39
40
|
let t = !0;
|
|
40
|
-
const
|
|
41
|
+
const f = () => {
|
|
41
42
|
if (t) {
|
|
42
43
|
t = !1, y.current = c();
|
|
43
44
|
return;
|
|
44
45
|
}
|
|
45
|
-
const
|
|
46
|
-
o < 10 && u < 10 || (y.current =
|
|
47
|
-
|
|
46
|
+
const s = c(), r = y.current, o = Math.abs(r.width - s.width), u = Math.abs(r.height - s.height);
|
|
47
|
+
o < 10 && u < 10 || (y.current = s, p.current && clearTimeout(p.current), p.current = window.setTimeout(() => {
|
|
48
|
+
l.current && m();
|
|
48
49
|
}, 500));
|
|
49
50
|
};
|
|
50
51
|
return d.current = new ResizeObserver(() => {
|
|
51
|
-
|
|
52
|
+
f();
|
|
52
53
|
}), d.current.observe(e.current), () => {
|
|
53
54
|
d.current && d.current.disconnect(), p.current && clearTimeout(p.current);
|
|
54
55
|
};
|
|
55
56
|
}, [c, m]), D(() => {
|
|
56
57
|
let t = !0;
|
|
57
|
-
const
|
|
58
|
+
const f = async () => {
|
|
58
59
|
if (e.current) {
|
|
59
60
|
g(!0), N(null);
|
|
60
61
|
try {
|
|
61
|
-
const r = await
|
|
62
|
+
const r = await R(x, {
|
|
62
63
|
mode: "cors",
|
|
63
64
|
credentials: "omit",
|
|
64
65
|
redirect: "follow"
|
|
65
66
|
});
|
|
66
67
|
if (!r.ok)
|
|
67
|
-
throw r.status === 404 ? new Error(
|
|
68
|
+
throw r.status === 404 ? new Error(a("xlsx.not_found")) : r.status === 403 ? new Error("无权限访问此文件") : new Error(`文件加载失败 (${r.status})`);
|
|
68
69
|
const o = await r.arrayBuffer();
|
|
69
70
|
if (o.byteLength === 0)
|
|
70
71
|
throw new Error("文件为空");
|
|
71
|
-
const u = new
|
|
72
|
+
const u = new z.Workbook();
|
|
72
73
|
await u.xlsx.load(o);
|
|
73
|
-
const
|
|
74
|
+
const T = S(u);
|
|
74
75
|
if (!t) return;
|
|
75
|
-
|
|
76
|
+
l.current = T, m(), g(!1);
|
|
76
77
|
} catch (r) {
|
|
77
78
|
if (t) {
|
|
78
79
|
console.error("Excel 解析错误:", r);
|
|
79
|
-
let o =
|
|
80
|
+
let o = a("xlsx.parse_failed");
|
|
80
81
|
r instanceof Error && (o = r.message), N(o), g(!1);
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
|
-
},
|
|
85
|
+
}, s = setTimeout(() => {
|
|
85
86
|
requestAnimationFrame(() => {
|
|
86
|
-
|
|
87
|
+
f();
|
|
87
88
|
});
|
|
88
89
|
}, 100);
|
|
89
90
|
return () => {
|
|
90
|
-
t = !1, clearTimeout(
|
|
91
|
+
t = !1, clearTimeout(s), l.current = null, e.current && (e.current.innerHTML = ""), v.current = null;
|
|
91
92
|
};
|
|
92
93
|
}, [x, m]), /* @__PURE__ */ h("div", { className: "rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full", children: [
|
|
93
94
|
w && /* @__PURE__ */ n("div", { className: "rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10", children: /* @__PURE__ */ h("div", { className: "rfp-text-center", children: [
|
|
94
95
|
/* @__PURE__ */ n("div", { className: "rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin" }),
|
|
95
|
-
/* @__PURE__ */ n("p", { className: "rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium", children:
|
|
96
|
+
/* @__PURE__ */ n("p", { className: "rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium", children: a("xlsx.loading") })
|
|
96
97
|
] }) }),
|
|
97
98
|
b && !w && /* @__PURE__ */ n("div", { className: "rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10", children: /* @__PURE__ */ h("div", { className: "rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4", children: [
|
|
98
|
-
/* @__PURE__ */ n("div", { className: "rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl", children: /* @__PURE__ */ n(
|
|
99
|
-
/* @__PURE__ */ n("p", { className: "rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium", children:
|
|
99
|
+
/* @__PURE__ */ n("div", { className: "rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl", children: /* @__PURE__ */ n(M, { className: "rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary" }) }),
|
|
100
|
+
/* @__PURE__ */ n("p", { className: "rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium", children: a("xlsx.load_failed") }),
|
|
100
101
|
/* @__PURE__ */ n("p", { className: "rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6", children: b }),
|
|
101
102
|
/* @__PURE__ */ h(
|
|
102
103
|
"a",
|
|
@@ -106,7 +107,7 @@ const F = ({ url: x }) => {
|
|
|
106
107
|
className: "rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg",
|
|
107
108
|
children: [
|
|
108
109
|
/* @__PURE__ */ n("svg", { className: "rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" }) }),
|
|
109
|
-
|
|
110
|
+
a("common.download")
|
|
110
111
|
]
|
|
111
112
|
}
|
|
112
113
|
),
|
|
@@ -123,6 +124,6 @@ const F = ({ url: x }) => {
|
|
|
123
124
|
] });
|
|
124
125
|
};
|
|
125
126
|
export {
|
|
126
|
-
|
|
127
|
+
A as XlsxRenderer
|
|
127
128
|
};
|
|
128
|
-
//# sourceMappingURL=index-
|
|
129
|
+
//# sourceMappingURL=index-r3q2xCCI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-r3q2xCCI.mjs","sources":["../../src/renderers/Xlsx/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport { FileSpreadsheet } from 'lucide-react';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '../../utils/excelDataConverter';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface XlsxRendererProps {\n url: string;\n}\n\nexport const XlsxRenderer: React.FC<XlsxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n // 清空容器\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadExcel = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetcher(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('xlsx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n // 使用 exceljs 解析\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n\n // 转换为 x-data-spreadsheet 数据格式\n const sheetData = convertWorkbookToSpreadsheetData(workbook);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n\n // 挂载 x-data-spreadsheet\n mountSpreadsheet();\n\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t('xlsx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadExcel();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('xlsx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <FileSpreadsheet className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('xlsx.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">\n {error}\n </p>\n <a\n href={url}\n download\n className=\"rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg\"\n >\n <svg className=\"rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {t('common.download')}\n </a>\n <p className=\"rfp-text-xs rfp-text-fg-muted rfp-mt-3 md:rfp-mt-4\">\n 提示:可以使用 Microsoft Excel 或 WPS 打开\n </p>\n </div>\n </div>\n )}\n\n {/* Spreadsheet 容器 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n"],"names":["XlsxRenderer","url","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","s","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","loadExcel","response","arrayBuffer","workbook","ExcelJS","sheetData","convertWorkbookToSpreadsheetData","err","errorMsg","timer","jsxs","jsx","FileSpreadsheet"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
|
2
2
|
import { useRef as S, useState as d, useEffect as R, useCallback as y } from "react";
|
|
3
3
|
import { motion as h, AnimatePresence as A } from "framer-motion";
|
|
4
4
|
import { Repeat as _, SkipBack as z, Pause as B, Play as q, SkipForward as U, VolumeX as X, Volume1 as J, Volume2 as K } from "lucide-react";
|
|
5
|
-
import { u as Q } from "./index-
|
|
5
|
+
import { u as Q } from "./index-Bv93wiEK.mjs";
|
|
6
6
|
function Y({
|
|
7
7
|
url: l
|
|
8
8
|
}) {
|
|
@@ -525,4 +525,4 @@ const Z = ({ text: l, className: o = "", style: i }) => {
|
|
|
525
525
|
export {
|
|
526
526
|
se as AudioRenderer
|
|
527
527
|
};
|
|
528
|
-
//# sourceMappingURL=index-
|
|
528
|
+
//# sourceMappingURL=index-zEVVgWCH.mjs.map
|