mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-08-01 19:06:01 +00:00
* docs: design frontend performance remediation * docs: plan frontend performance remediation * test(frontend): add route asset performance budgets * perf(nginx): compress textual responses safely * perf(frontend): lazy load case study media * perf(frontend): bound static demo file tracing * perf(frontend): restore static locale boundaries * perf(frontend): defer closed workspace panels * perf(frontend): split editors and deduplicate highlighting * perf(frontend): index incremental message derivation * perf(frontend): stabilize paged history cache policy * perf(frontend): bound streaming markdown renders * perf(frontend): virtualize message history * perf(frontend): bound and virtualize chat lists * perf(frontend): suspend inactive decorative animation * perf(browser): stream latest frames as binary * perf(artifacts): stream bounded text previews * docs: finalize performance runtime boundaries * style(backend): apply test formatting * fix(frontend): keep translation functions client-side * perf(frontend): defer decorative animation bundles * test(frontend): lock optimized route budgets * fix: harden frontend performance boundaries * test(frontend): update i18n provider fixture * fix(frontend): preserve sidebar pagination position * style(backend): format artifact range test
58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import { redirect } from "next/navigation";
|
|
import { type ReactNode } from "react";
|
|
|
|
import { GatewayOfflineFallback } from "@/components/workspace/gateway-offline-fallback";
|
|
import { AuthProvider } from "@/core/auth/AuthProvider";
|
|
import { getServerSideUser } from "@/core/auth/server";
|
|
import { assertNever } from "@/core/auth/types";
|
|
import { I18nProvider } from "@/core/i18n/context";
|
|
import { detectLocaleServer } from "@/core/i18n/server";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export default async function AuthLayout({
|
|
children,
|
|
}: {
|
|
children: ReactNode;
|
|
}) {
|
|
const locale = await detectLocaleServer();
|
|
const result = await getServerSideUser();
|
|
|
|
let content: ReactNode;
|
|
|
|
switch (result.tag) {
|
|
case "authenticated":
|
|
redirect("/workspace");
|
|
case "needs_setup":
|
|
// Allow access to setup page
|
|
content = (
|
|
<AuthProvider initialUser={result.user}>{children}</AuthProvider>
|
|
);
|
|
break;
|
|
case "system_setup_required":
|
|
case "unauthenticated":
|
|
content = <AuthProvider initialUser={null}>{children}</AuthProvider>;
|
|
break;
|
|
case "gateway_unavailable":
|
|
// Auth pages have no banner of their own, so render one here. The
|
|
// fallback's AuthProvider replaces the bare-HTML branch that
|
|
// previously locked users out without any logout/retry capability.
|
|
content = (
|
|
<GatewayOfflineFallback renderBanner>
|
|
<div className="flex h-screen flex-col items-center justify-center gap-4">
|
|
<p className="text-muted-foreground">
|
|
Service temporarily unavailable.
|
|
</p>
|
|
</div>
|
|
</GatewayOfflineFallback>
|
|
);
|
|
break;
|
|
case "config_error":
|
|
throw new Error(result.message);
|
|
default:
|
|
assertNever(result);
|
|
}
|
|
|
|
return <I18nProvider initialLocale={locale}>{content}</I18nProvider>;
|
|
}
|