From 8abe505d174cff8015292784eb32d26b1d734d32 Mon Sep 17 00:00:00 2001
From: "tao.chen" <93983997+taochen-ct@users.noreply.github.com>
Date: Wed, 12 Aug 2026 18:58:18 +0800
Subject: [PATCH] fix: multi owner
---
.../components/platform/ScriptExplorer.tsx | 42 ++++++++++---------
.../app/features/platform/WorkspaceTree.tsx | 21 +++++++---
.../platform/state/scriptWorkspaceStore.ts | 3 +-
3 files changed, 40 insertions(+), 26 deletions(-)
diff --git a/frontend/app/components/platform/ScriptExplorer.tsx b/frontend/app/components/platform/ScriptExplorer.tsx
index c65f477..1556ca0 100644
--- a/frontend/app/components/platform/ScriptExplorer.tsx
+++ b/frontend/app/components/platform/ScriptExplorer.tsx
@@ -178,25 +178,29 @@ export function ScriptExplorer({
) : (
<>
- {memberScriptGroups.map((group) => (
-
- ))}
+ {memberScriptGroups.map((group) => {
+ const ownerKey = group.user?.user_id ?? "anon";
+ return (
+
+ );
+ })}
{filteredScripts.length === 0 && (
diff --git a/frontend/app/features/platform/WorkspaceTree.tsx b/frontend/app/features/platform/WorkspaceTree.tsx
index b52cda2..34e0a42 100644
--- a/frontend/app/features/platform/WorkspaceTree.tsx
+++ b/frontend/app/features/platform/WorkspaceTree.tsx
@@ -1,4 +1,4 @@
-import { type MouseEvent as ReactMouseEvent } from "react";
+import { type MouseEvent as ReactMouseEvent, useEffect } from "react";
import Icon from "../../components/common/Icon";
import type {
@@ -23,12 +23,14 @@ type WorkspaceTreeProps = {
target: WorkspaceTreeTarget,
) => void;
readOnly?: boolean;
+ // 唯一标识此 group(通常 `__group__`),让多个 owner 的 group 各自独立展开。
+ groupKey: string;
expandedPaths: Set;
onToggle: (path: string) => void;
loadingChildrenPaths: Set;
};
-type WorkspaceTreeItemsProps = Omit & {
+type WorkspaceTreeItemsProps = Omit & {
path: string;
depth: number;
};
@@ -65,19 +67,27 @@ export function WorkspaceTreeGroup({
onSelect,
onContextMenu,
readOnly = false,
+ groupKey,
expandedPaths,
onToggle,
loadingChildrenPaths,
}: WorkspaceTreeProps) {
- const open = expandedPaths.has("");
- const childrenLoading = loadingChildrenPaths.has("");
+ const open = expandedPaths.has(groupKey);
+ // 首次挂载自动展开(保留原本 useState(true) 的默认展开行为)。
+ // toggleExpanded 内识别 `__group__` 前缀,不会触发 loadChildren。
+ useEffect(() => {
+ if (!expandedPaths.has(groupKey)) {
+ void onToggle(groupKey);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [groupKey]);
return (
{open && (
diff --git a/frontend/app/features/platform/state/scriptWorkspaceStore.ts b/frontend/app/features/platform/state/scriptWorkspaceStore.ts
index c367b7b..6520189 100644
--- a/frontend/app/features/platform/state/scriptWorkspaceStore.ts
+++ b/frontend/app/features/platform/state/scriptWorkspaceStore.ts
@@ -293,7 +293,8 @@ export const useScriptWorkspaceStore = create((set, get) => {
next.delete(path);
} else {
next.add(path);
- if (!state.loadedChildPaths.has(path)) {
+ // group key (`__group__`) 不是 workspace 路径,不调 loadChildren
+ if (!path.startsWith("__group__") && !state.loadedChildPaths.has(path)) {
void get().loadChildren(path);
}
}