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
+17 -7
View File
@@ -31,14 +31,22 @@ export default function AuthPage() {
const currentUser = useQuery(api.users.currentUser, isAuthenticated ? {} : "skip");
const navigateToHome = useCallback(() => {
if (typeof window !== "undefined") {
window.location.assign("/");
return;
}
router.replace("/");
}, [router]);
useEffect(() => {
if (isLoading) return;
if (!isAuthenticated) return;
if (currentUser === undefined) return;
if (currentUser && currentUser.name) {
router.replace("/");
navigateToHome();
}
}, [currentUser, isAuthenticated, isLoading, router]);
}, [currentUser, isAuthenticated, isLoading, navigateToHome]);
const [flow, setFlow] = useState<AuthStep>("signIn");
const [email, setEmail] = useState("");
@@ -70,7 +78,7 @@ export default function AuthPage() {
if (cancelled) return;
setPendingUsernameToSave(null);
setMessage({ type: "success", text: "注册成功!" });
router.replace("/");
navigateToHome();
} catch (err: unknown) {
if (cancelled) return;
setPendingUsernameToSave(null);
@@ -83,7 +91,7 @@ export default function AuthPage() {
return () => {
cancelled = true;
};
}, [currentUser, isAuthenticated, pendingUsernameToSave, router, setMyUsername]);
}, [currentUser, isAuthenticated, navigateToHome, pendingUsernameToSave, setMyUsername]);
// 执行登录的核心逻辑
const performSignIn = useCallback(async (email: string, password: string, flow: AuthStep) => {
@@ -110,8 +118,10 @@ export default function AuthPage() {
setPendingUsernameToSave(username.trim());
return;
}
setMessage({ type: "success", text: flow === "signIn" ? "登录成功!" : "注册成功!" });
setTimeout(() => router.push("/"), 500);
// 说明:登录成功后不要立刻强推 `/`。
// Convex Auth cookie 与 currentUser 查询存在短暂同步窗口,过早跳转会把页面推进到根路由空白态。
// 这里仅提示“正在同步”,真正跳转交给上面的 useEffect 在登录态稳定后执行。
setMessage({ type: "info", text: "登录成功,正在同步登录状态..." });
return;
}
@@ -187,7 +197,7 @@ export default function AuthPage() {
setIsSavingUsername(true);
await setMyUsername({ username: username.trim() });
setMessage({ type: "success", text: "用户名已保存!" });
router.replace("/");
navigateToHome();
} catch (error: any) {
setMessage({ type: "error", text: getUserFacingErrorMessage(error, "保存失败,请重试") });
} finally {
+3 -24
View File
@@ -13,14 +13,9 @@ import {
resolveRustBridgeQueryPlan,
} from "@/lib/documents/rust-runtime";
import {
buildSidebarDatasetListQueryPayload,
mapSidebarDatasetListQueryResultToInitialData,
type SidebarDatasetListQueryResult,
} from "@/lib/sidebar-data";
import {
fetchSidebarDatasetFromMnoteWeb,
getMnoteWebBaseUrl,
} from "@/lib/server/mnote-web";
export const dynamic = "force-dynamic";
@@ -41,31 +36,15 @@ export async function GET(request: Request) {
}
try {
if (getMnoteWebBaseUrl()) {
const proxied = await fetchSidebarDatasetFromMnoteWeb({
workspaceId: targetWorkspaceId,
request,
});
const result = mapSidebarDatasetListQueryResultToInitialData(proxied.dataset);
return NextResponse.json({
...result,
meta: {
requestId: proxied.meta.requestId,
traceId: proxied.meta.traceId,
queryName: "compat.next.sidebar",
workspaceId: proxied.meta.workspaceId,
},
});
}
const bridgeContext = await buildDocumentBridgeContext({
request,
workspaceId: targetWorkspaceId,
});
const envelope = buildDocumentQueryEnvelope({
name: "sidebar.dataset.list",
payload: buildSidebarDatasetListQueryPayload(targetWorkspaceId),
payload: {
workspaceId: targetWorkspaceId,
},
});
const plan = await resolveRustBridgeQueryPlan({
context: bridgeContext,