65 lines
1.8 KiB
TypeScript
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}
|
|
/>
|
|
);
|
|
}
|