0.3.6 修复shitf选择问题

This commit is contained in:
liaibo
2026-01-24 13:14:24 +08:00
parent 3c3f407f4b
commit a4183d86d8
4 changed files with 174 additions and 12 deletions
@@ -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,
]);