2026-04-14 13:22:29 +08:00
|
|
|
import { randomUUID } from "crypto";
|
|
|
|
|
import type { ConvexHttpClient } from "convex/browser";
|
2026-04-15 03:06:29 +08:00
|
|
|
import type { FunctionReference } from "convex/server";
|
2026-04-14 13:22:29 +08:00
|
|
|
import type { SidebarInitialData } from "@/components/sidebar/types";
|
|
|
|
|
import type { DocumentRecord } from "@/lib/documents";
|
|
|
|
|
import { api } from "@/lib/convex/api";
|
2026-04-15 03:06:29 +08:00
|
|
|
import {
|
|
|
|
|
mapSidebarDatasetListQueryResultToInitialData,
|
|
|
|
|
type SidebarDatasetListQueryResult,
|
|
|
|
|
} from "@/lib/sidebar-data";
|
2026-04-14 13:22:29 +08:00
|
|
|
import type { WorkspaceSummary } from "@/lib/workspaces";
|
|
|
|
|
|
|
|
|
|
type LoadSidebarDataFromConvexInput = {
|
|
|
|
|
client: ConvexHttpClient;
|
|
|
|
|
fallbackName: string;
|
|
|
|
|
requestedWorkspaceId?: string | null;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
type LoadSidebarDataFromConvexResult = {
|
|
|
|
|
workspaces: WorkspaceSummary[];
|
|
|
|
|
activeWorkspaceId: string;
|
|
|
|
|
targetWorkspaceId: string | null;
|
2026-04-15 03:06:29 +08:00
|
|
|
sidebarDataset: SidebarDatasetListQueryResult | null;
|
2026-04-14 13:22:29 +08:00
|
|
|
sidebarInitialData: SidebarInitialData | null;
|
|
|
|
|
documents: DocumentRecord[];
|
|
|
|
|
};
|
|
|
|
|
|
2026-04-15 03:06:29 +08:00
|
|
|
const sidebarDatasetListQuery = ((api as unknown as Record<string, unknown>).sidebar as
|
|
|
|
|
| Record<string, unknown>
|
|
|
|
|
| undefined)?.datasetList as FunctionReference<
|
|
|
|
|
"query",
|
|
|
|
|
"public",
|
|
|
|
|
{ workspaceId: string },
|
|
|
|
|
SidebarDatasetListQueryResult
|
|
|
|
|
>;
|
|
|
|
|
|
2026-04-14 13:22:29 +08:00
|
|
|
export async function loadSidebarDataFromConvex(
|
|
|
|
|
input: LoadSidebarDataFromConvexInput,
|
|
|
|
|
): Promise<LoadSidebarDataFromConvexResult> {
|
|
|
|
|
const bootstrap = await input.client.mutation(api.workspaces.ensureDefaultWorkspace, {
|
|
|
|
|
fallbackName: input.fallbackName,
|
|
|
|
|
workspaceIdIfCreate: randomUUID(),
|
|
|
|
|
});
|
|
|
|
|
|
2026-04-15 03:06:29 +08:00
|
|
|
const workspaces = bootstrap.workspaces;
|
|
|
|
|
const activeWorkspaceId = bootstrap.activeWorkspaceId;
|
2026-04-14 13:22:29 +08:00
|
|
|
const targetWorkspaceId = input.requestedWorkspaceId?.trim() || activeWorkspaceId || null;
|
|
|
|
|
|
|
|
|
|
if (!targetWorkspaceId) {
|
|
|
|
|
return {
|
|
|
|
|
workspaces,
|
|
|
|
|
activeWorkspaceId,
|
|
|
|
|
targetWorkspaceId: null,
|
2026-04-15 03:06:29 +08:00
|
|
|
sidebarDataset: null,
|
2026-04-14 13:22:29 +08:00
|
|
|
sidebarInitialData: null,
|
|
|
|
|
documents: [],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 03:06:29 +08:00
|
|
|
const sidebarDataset = (await input.client.query(sidebarDatasetListQuery, {
|
|
|
|
|
workspaceId: targetWorkspaceId,
|
|
|
|
|
})) as SidebarDatasetListQueryResult;
|
|
|
|
|
const normalizedDocuments = (sidebarDataset.documents ?? []) as DocumentRecord[];
|
2026-04-14 13:22:29 +08:00
|
|
|
|
|
|
|
|
return {
|
2026-04-15 03:06:29 +08:00
|
|
|
workspaces: sidebarDataset.workspaces ?? workspaces,
|
2026-04-14 13:22:29 +08:00
|
|
|
activeWorkspaceId,
|
|
|
|
|
targetWorkspaceId,
|
2026-04-15 03:06:29 +08:00
|
|
|
sidebarDataset,
|
|
|
|
|
sidebarInitialData: mapSidebarDatasetListQueryResultToInitialData(sidebarDataset),
|
2026-04-14 13:22:29 +08:00
|
|
|
documents: normalizedDocuments,
|
|
|
|
|
};
|
|
|
|
|
}
|