feat: 接入 mnote web tree shell 与主页链路整理

- 增加 mnote-web tree/command 支持与前端 MnoteWebTreeShell 集成
- 调整 sidebar、documents、runtime config 与 dev/prod server 配套逻辑
- 补充 homepage/tree shell smoke 脚本并更新 harness 进度文件
This commit is contained in:
lix-2026
2026-04-17 23:36:24 +08:00
parent cfc3af8984
commit d8de820d93
40 changed files with 4668 additions and 4143 deletions
+55 -3
View File
@@ -1,5 +1,15 @@
import { useQuery, type UseQueryResult } from "@tanstack/react-query";
import { useMemo } from "react";
import { useQuery } from "@tanstack/react-query";
import type { SidebarInitialData } from "@/components/sidebar/types";
import { useConvexSidebarData } from "@/hooks/use-convex-sidebar-data";
export interface SidebarDataResult {
data: SidebarInitialData;
isLoading: boolean;
error: Error | null;
refetch: () => Promise<unknown>;
source: "convex-live" | "http-fallback" | "initial";
}
async function requestSidebarData(workspaceId: string): Promise<SidebarInitialData> {
const response = await fetch(`/api/sidebar?workspaceId=${workspaceId}`, {
@@ -16,13 +26,55 @@ async function requestSidebarData(workspaceId: string): Promise<SidebarInitialDa
return response.json();
}
export function useSidebarData(initialData: SidebarInitialData): UseQueryResult<SidebarInitialData> {
export function useSidebarData(initialData: SidebarInitialData): SidebarDataResult {
const workspaceId = initialData.activeWorkspaceId;
const convexSidebar = useConvexSidebarData(workspaceId);
const shouldUseHttpFallback =
!convexSidebar.hasLiveSubscription && convexSidebar.canUseHttpFallback;
return useQuery({
const httpQuery = useQuery({
queryKey: ["sidebar", workspaceId],
queryFn: () => requestSidebarData(workspaceId),
initialData,
staleTime: 1000 * 60,
enabled: shouldUseHttpFallback,
});
return useMemo<SidebarDataResult>(() => {
const liveData = convexSidebar.data ?? httpQuery.data ?? initialData;
const isLoading =
convexSidebar.hasLiveSubscription
? convexSidebar.isLoading
: shouldUseHttpFallback
? httpQuery.isLoading
: false;
const source: SidebarDataResult["source"] = convexSidebar.data
? "convex-live"
: shouldUseHttpFallback && httpQuery.data
? "http-fallback"
: "initial";
const refetch = async () => {
if (convexSidebar.hasLiveSubscription) {
await convexSidebar.refetch();
return liveData;
}
if (shouldUseHttpFallback) {
return httpQuery.refetch();
}
return liveData;
};
return {
data: liveData,
isLoading,
error: convexSidebar.error ?? httpQuery.error ?? null,
refetch,
source,
};
}, [
convexSidebar,
httpQuery,
initialData,
shouldUseHttpFallback,
]);
}