Files
mnote/wolai-frontend/src/lib/server/sidebar-data.ts
T
lix-2026 d8de820d93 feat: 接入 mnote web tree shell 与主页链路整理
- 增加 mnote-web tree/command 支持与前端 MnoteWebTreeShell 集成
- 调整 sidebar、documents、runtime config 与 dev/prod server 配套逻辑
- 补充 homepage/tree shell smoke 脚本并更新 harness 进度文件
2026-04-17 23:36:24 +08:00

78 lines
2.7 KiB
TypeScript

import { randomUUID } from "crypto";
import type { ConvexHttpClient } from "convex/browser";
import type { FunctionReference } from "convex/server";
import type { SidebarInitialData } from "@/components/sidebar/types";
import type { DocumentRecord } from "@/lib/documents";
import { api } from "@/lib/convex/api";
import {
mapSidebarDatasetListQueryResultToInitialData,
type SidebarDatasetListQueryResult,
} from "@/lib/sidebar-data";
import type { WorkspaceSummary } from "@/lib/workspaces";
type LoadSidebarDataFromConvexInput = {
client: ConvexHttpClient;
fallbackName: string;
requestedWorkspaceId?: string | null;
};
type LoadSidebarDataFromConvexResult = {
workspaces: WorkspaceSummary[];
activeWorkspaceId: string;
targetWorkspaceId: string | null;
sidebarDataset: SidebarDatasetListQueryResult | null;
sidebarInitialData: SidebarInitialData | null;
documents: DocumentRecord[];
};
const sidebarDatasetListQuery = ((api as unknown as Record<string, unknown>).sidebar as
| Record<string, unknown>
| undefined)?.datasetList as FunctionReference<
"query",
"public",
{ workspaceId: string },
SidebarDatasetListQueryResult
>;
export async function loadSidebarDataFromConvex(
input: LoadSidebarDataFromConvexInput,
): Promise<LoadSidebarDataFromConvexResult> {
const bootstrap = await input.client.mutation(api.workspaces.ensureDefaultWorkspace, {
fallbackName: input.fallbackName,
workspaceIdIfCreate: randomUUID(),
});
const workspaces = bootstrap.workspaces;
const activeWorkspaceId = bootstrap.activeWorkspaceId;
const targetWorkspaceId = input.requestedWorkspaceId?.trim() || activeWorkspaceId || null;
if (!targetWorkspaceId) {
return {
workspaces,
activeWorkspaceId,
targetWorkspaceId: null,
sidebarDataset: null,
sidebarInitialData: null,
documents: [],
};
}
// 说明:SSR 首屏阶段必须优先保证“可进入页面”。
// mnote-web compat sidebar 仍处于渐进接入期,若这里优先走远端/Rust 兼容接口,
// 一旦 actor/header 权限链不一致,就会把整个 (app) layout 阻塞住,表现为“登录后进不去页面”。
// 因此服务端首屏一律先走稳定的 Convex 直查;mnote-web 仅允许用于客户端树壳渐进增强。
const sidebarDataset = (await input.client.query(sidebarDatasetListQuery, {
workspaceId: targetWorkspaceId,
})) as SidebarDatasetListQueryResult;
const normalizedDocuments = (sidebarDataset.documents ?? []) as DocumentRecord[];
return {
workspaces: sidebarDataset.workspaces ?? workspaces,
activeWorkspaceId,
targetWorkspaceId,
sidebarDataset,
sidebarInitialData: mapSidebarDatasetListQueryResultToInitialData(sidebarDataset),
documents: normalizedDocuments,
};
}