0.3.6 修复shitf选择问题
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useEffect, useMemo, useRef, useState } from "react";
|
||||
import { useSearchParams } from "next/navigation";
|
||||
import { OnlyOfficeAiAgentPanel } from "@/components/onlyoffice/OnlyOfficeAiAgentPanel";
|
||||
import { rewriteToPublicOrigin } from "@/lib/url/rewritePublicOrigin";
|
||||
@@ -358,6 +358,7 @@ export default function OnlyOfficePage() {
|
||||
const [resolvedMode, setResolvedMode] = useState<EditorMode | null>(mode === "view" ? "view" : null);
|
||||
const [resolvedDisableDownload, setResolvedDisableDownload] = useState(false);
|
||||
const [resolvedDisableCopy, setResolvedDisableCopy] = useState(false);
|
||||
const [permissionResolved, setPermissionResolved] = useState(false);
|
||||
const [assetSignedUrl, setAssetSignedUrl] = useState<string>("");
|
||||
const [assetStorageId, setAssetStorageId] = useState<string>("");
|
||||
const [forceSaveState, setForceSaveState] = useState<{
|
||||
@@ -413,6 +414,7 @@ export default function OnlyOfficePage() {
|
||||
const storageHostOverride = runtimeConfig.onlyofficeStorageHostOverride;
|
||||
const proxyOrigin = runtimeConfig.onlyofficeProxyOrigin;
|
||||
const callbackOrigin = runtimeConfig.onlyofficeCallbackOrigin;
|
||||
const docEditorRef = useRef<any>(null);
|
||||
|
||||
useEffect(() => {
|
||||
// 说明:为了让 document.key 在同一附件的多次打开之间保持稳定(提升缓存命中与加载速度),
|
||||
@@ -472,12 +474,17 @@ export default function OnlyOfficePage() {
|
||||
setResolvedMode(mode === "view" ? "view" : mode);
|
||||
setResolvedDisableDownload(false);
|
||||
setResolvedDisableCopy(false);
|
||||
setPermissionResolved(true);
|
||||
return;
|
||||
}
|
||||
if (!authedUserId) {
|
||||
setPermissionResolved(false);
|
||||
return;
|
||||
}
|
||||
if (!authedUserId) return;
|
||||
|
||||
let canceled = false;
|
||||
void (async () => {
|
||||
setPermissionResolved(false);
|
||||
try {
|
||||
const perm = await convex.query(api.documents.getPermissionForUser, {
|
||||
userId: authedUserId,
|
||||
@@ -488,6 +495,7 @@ export default function OnlyOfficePage() {
|
||||
const disableCopy = Boolean((perm as any)?.disableCopy);
|
||||
setResolvedDisableDownload(disableDownload);
|
||||
setResolvedDisableCopy(disableCopy);
|
||||
setPermissionResolved(true);
|
||||
|
||||
if (mode === "view") {
|
||||
setResolvedMode("view");
|
||||
@@ -504,6 +512,7 @@ export default function OnlyOfficePage() {
|
||||
setResolvedMode(mode === "view" ? "view" : mode);
|
||||
setResolvedDisableDownload(false);
|
||||
setResolvedDisableCopy(false);
|
||||
setPermissionResolved(true);
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -731,7 +740,12 @@ export default function OnlyOfficePage() {
|
||||
fileName,
|
||||
fileType,
|
||||
mode,
|
||||
resolvedMode,
|
||||
resolvedDisableDownload,
|
||||
resolvedDisableCopy,
|
||||
permissionResolved,
|
||||
assetId,
|
||||
documentId,
|
||||
docKey,
|
||||
};
|
||||
} catch {
|
||||
@@ -747,11 +761,34 @@ export default function OnlyOfficePage() {
|
||||
fileName,
|
||||
fileType,
|
||||
resolvedMode,
|
||||
resolvedDisableCopy,
|
||||
resolvedDisableDownload,
|
||||
permissionResolved,
|
||||
documentId,
|
||||
proxyOrigin,
|
||||
resolvedFileUrl,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
let canceled = false;
|
||||
const destroyEditor = () => {
|
||||
try {
|
||||
const inst = docEditorRef.current;
|
||||
docEditorRef.current = null;
|
||||
if (inst && typeof inst.destroyEditor === "function") {
|
||||
inst.destroyEditor();
|
||||
}
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
const el = document.getElementById("onlyoffice-frame");
|
||||
if (el) el.innerHTML = "";
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
};
|
||||
|
||||
// 说明:如果是附件(assetId)编辑模式,则必须拿到真实 userId 才能让
|
||||
// /api/onlyoffice/callback 通过工作空间成员校验并把文件写回存储。
|
||||
// 否则会出现:编辑器里看似“已保存”,但下载/再次打开仍是旧文件。
|
||||
@@ -789,6 +826,7 @@ export default function OnlyOfficePage() {
|
||||
}
|
||||
|
||||
if (!resolvedMode) return;
|
||||
if (documentId && !permissionResolved) return;
|
||||
if (resolvedMode !== "view" && assetId && !authedUserId) return;
|
||||
|
||||
const scriptUrl = `${baseUrl.replace(/\/$/, "")}/web-apps/apps/api/documents/api.js`;
|
||||
@@ -909,6 +947,7 @@ export default function OnlyOfficePage() {
|
||||
documentToken: string | null;
|
||||
editorConfigToken: string | null;
|
||||
};
|
||||
if (canceled) return;
|
||||
|
||||
// 兼容不同 ONLYOFFICE 配置:有些版本/配置会校验 document.token/editorConfig.token。
|
||||
if (token) config.token = token;
|
||||
@@ -922,7 +961,8 @@ export default function OnlyOfficePage() {
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
new (window as any).DocsAPI.DocEditor("onlyoffice-frame", config);
|
||||
if (canceled) return;
|
||||
docEditorRef.current = new (window as any).DocsAPI.DocEditor("onlyoffice-frame", config);
|
||||
})
|
||||
.catch((err: Error) => {
|
||||
// 说明:如果服务端强制 JWT 且你未配置 ONLYOFFICE_JWT_SECRET,会在这里失败或在编辑器内报错。
|
||||
@@ -938,6 +978,11 @@ export default function OnlyOfficePage() {
|
||||
}
|
||||
setError(err.message);
|
||||
});
|
||||
|
||||
return () => {
|
||||
canceled = true;
|
||||
destroyEditor();
|
||||
};
|
||||
}, [
|
||||
assetId,
|
||||
authedUserId,
|
||||
@@ -952,6 +997,11 @@ export default function OnlyOfficePage() {
|
||||
mode,
|
||||
proxyOrigin,
|
||||
resolvedFileUrl,
|
||||
documentId,
|
||||
permissionResolved,
|
||||
resolvedDisableCopy,
|
||||
resolvedDisableDownload,
|
||||
resolvedMode,
|
||||
targetDocType,
|
||||
runtimeConfig.onlyofficeBaseUrlDesktop,
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user