diff --git a/frontend/app/features/admin/SystemAdminRoute.tsx b/frontend/app/features/admin/SystemAdminRoute.tsx index e70ea5b..4fb9cd6 100644 --- a/frontend/app/features/admin/SystemAdminRoute.tsx +++ b/frontend/app/features/admin/SystemAdminRoute.tsx @@ -1,13 +1,17 @@ +import { useAuth } from "../../context/AuthContext"; import { useScriptWorkspaceStore } from "../platform/state/scriptWorkspaceStore"; import { useUiStore } from "../platform/state/uiStore"; import { SystemAdminPage } from "./SystemAdminPage"; export default function SystemAdminRoute() { + const { currentWorkspace, user } = useAuth(); const setApiOnline = useScriptWorkspaceStore((s) => s.setApiOnline); const pushToast = useUiStore((s) => s.pushToast); return ( diff --git a/frontend/app/features/schedules/SchedulesPageRoute.tsx b/frontend/app/features/schedules/SchedulesPageRoute.tsx index 854819c..dcd6129 100644 --- a/frontend/app/features/schedules/SchedulesPageRoute.tsx +++ b/frontend/app/features/schedules/SchedulesPageRoute.tsx @@ -1,13 +1,17 @@ +import { useAuth } from "../../context/AuthContext"; import { useScriptWorkspaceStore } from "../platform/state/scriptWorkspaceStore"; import { useUiStore } from "../platform/state/uiStore"; import SchedulePage from "./SchedulePage"; export default function SchedulesPageRoute() { + const { currentWorkspace, user } = useAuth(); const setApiOnline = useScriptWorkspaceStore((s) => s.setApiOnline); const pushToast = useUiStore((s) => s.pushToast); return ( diff --git a/frontend/app/routes/platform.tsx b/frontend/app/routes/platform.tsx index ac20865..6ba81f5 100644 --- a/frontend/app/routes/platform.tsx +++ b/frontend/app/routes/platform.tsx @@ -78,13 +78,16 @@ function AuthenticatedLayout() { const [sidebarCollapsed, setSidebarCollapsed] = useState(false); - // 绑定 api 到 script workspace store + // 绑定 api 到 script workspace store。 + // 必须放在 render body(同步),不能用 useEffect([api]) + cleanup — + // 后者会在 deps 变化时先 cleanup(null),再让 ScriptsPage 的 useEffect 跑, + // 此时 _api 为 null,load() 抛 "script workspace API 未绑定"。 + bindScriptWorkspaceApi(api); useEffect(() => { - bindScriptWorkspaceApi(api); return () => { bindScriptWorkspaceApi(null); }; - }, [api]); + }, []); // 心跳 / cleanup / 切页结束编辑 / 卸载前释放 useEditSessionLifecycle({ activePage });