Your Name b3b49b4fe2
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: improve worldlabs admin controls and splat selection
2026-04-05 23:42:37 +08:00

92 lines
2.8 KiB
TypeScript

import { and, eq } from "drizzle-orm";
import { notFound } from "next/navigation";
import { WorldSharePage } from "@/components/canvas/world3d/WorldSharePage";
import { db } from "@/lib/db";
import { model3dAsset } from "@/lib/db/schema";
import { pickBestWorldLabsSplatUrl } from "@/lib/worldlabs/splat-utils";
export const dynamic = "force-dynamic";
function readAssetPayload(
value: unknown
): {
displayName?: string | null;
model?: string | null;
caption?: string | null;
worldUrl?: string | null;
thumbnailUrl?: string | null;
panoUrl?: string | null;
meshUrl?: string | null;
spzUrls?: Record<string, string> | null;
semanticsMetadata?: Record<string, unknown> | null;
} | null {
return value && typeof value === "object" && !Array.isArray(value)
? (value as {
displayName?: string | null;
model?: string | null;
caption?: string | null;
worldUrl?: string | null;
thumbnailUrl?: string | null;
panoUrl?: string | null;
meshUrl?: string | null;
spzUrls?: Record<string, string> | null;
semanticsMetadata?: Record<string, unknown> | null;
})
: null;
}
export default async function SharedWorldPage({
params,
}: {
params: Promise<{ token: string }>;
}) {
const { token } = await params;
const shareToken = String(token || "").trim();
if (!shareToken) {
notFound();
}
const [asset] = await db
.select({
taskId: model3dAsset.taskId,
prompt: model3dAsset.prompt,
modelVersion: model3dAsset.modelVersion,
previewImageUrl: model3dAsset.previewImageUrl,
modelUrl: model3dAsset.modelUrl,
assetPayload: model3dAsset.assetPayload,
})
.from(model3dAsset)
.where(
and(
eq(model3dAsset.shareEnabled, true),
eq(model3dAsset.shareToken, shareToken),
eq(model3dAsset.provider, "worldlabs-3d"),
eq(model3dAsset.status, "success")
)
)
.limit(1);
if (!asset) {
notFound();
}
const assetPayload = readAssetPayload(asset.assetPayload);
const sharePath = `/worlds/share/${shareToken}`;
return (
<WorldSharePage
caption={assetPayload?.caption || null}
imageUrl={assetPayload?.panoUrl || assetPayload?.thumbnailUrl || asset.previewImageUrl || null}
meshUrl={asset.modelUrl || assetPayload?.meshUrl || null}
model={assetPayload?.model || asset.modelVersion || null}
previewImageUrl={asset.previewImageUrl || assetPayload?.thumbnailUrl || null}
prompt={asset.prompt || null}
semanticsMetadata={assetPayload?.semanticsMetadata || null}
shareUrl={sharePath}
splatUrl={pickBestWorldLabsSplatUrl(assetPayload?.spzUrls)}
title={assetPayload?.displayName || asset.prompt || `World ${asset.taskId.slice(0, 8)}`}
worldUrl={assetPayload?.worldUrl || null}
/>
);
}