65 lines
1.8 KiB
TypeScript

import { Suspense } from "react";
import { CanvasLogoLoadingView } from "@/components/canvas/canvas-logo-loading";
import { getSiteSettings } from "@/lib/db/queries";
import { CanvasPageClientRouter } from "./CanvasPageClientRouter";
type CanvasEditorPageProps = {
params: Promise<{ id: string }>;
searchParams?: Promise<{
mode?: string | string[];
workspaceType?: string | string[];
}>;
};
function getFirstParamValue(value: string | string[] | undefined) {
return Array.isArray(value) ? value[0] || "" : value || "";
}
export default async function CanvasEditorPage({
params,
searchParams,
}: CanvasEditorPageProps) {
const { id } = await params;
const resolvedSearchParams = searchParams ? await searchParams : {};
const siteSettings = await getSiteSettings().catch(() => null);
const loadingBrand = {
siteLogo: siteSettings?.siteLogo,
siteLogoDark: siteSettings?.siteLogoDark,
siteName: siteSettings?.siteName,
};
return (
<Suspense fallback={<CanvasPageLoader {...loadingBrand} />}>
<CanvasPageClientRouter
initialId={id}
initialMode={getFirstParamValue(resolvedSearchParams.mode)}
initialSiteLogo={loadingBrand.siteLogo}
initialSiteLogoDark={loadingBrand.siteLogoDark}
initialSiteName={loadingBrand.siteName}
initialWorkspaceType={getFirstParamValue(
resolvedSearchParams.workspaceType
)}
/>
</Suspense>
);
}
function CanvasPageLoader({
siteLogo,
siteLogoDark,
siteName,
}: {
siteLogo?: string | null;
siteLogoDark?: string | null;
siteName?: string | null;
}) {
return (
<CanvasLogoLoadingView
label="正在加载画布..."
siteLogo={siteLogo}
siteLogoDark={siteLogoDark}
siteName={siteName}
/>
);
}