mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-05-23 00:16:48 +00:00
fix(frontend): address static demo PR review comments
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import { isStaticWebsiteOnly } from "@/core/static-mode";
|
||||
import { DEMO_THREAD_IDS } from "@/core/threads/static-demo";
|
||||
|
||||
import { ChatProviders } from "./providers";
|
||||
|
||||
export function generateStaticParams() {
|
||||
if (!isStaticWebsiteOnly()) {
|
||||
return [];
|
||||
}
|
||||
return DEMO_THREAD_IDS.map((thread_id) => ({ thread_id }));
|
||||
}
|
||||
|
||||
|
||||
@@ -325,11 +325,7 @@ export function ArtifactFilePreview({
|
||||
<iframe
|
||||
className="size-full"
|
||||
title="Artifact preview"
|
||||
sandbox={
|
||||
isWriteFile
|
||||
? "allow-scripts allow-forms"
|
||||
: "allow-scripts allow-forms allow-same-origin"
|
||||
}
|
||||
sandbox="allow-scripts allow-forms"
|
||||
src={isWriteFile ? undefined : htmlPreviewUrl}
|
||||
srcDoc={isWriteFile ? content : undefined}
|
||||
/>
|
||||
|
||||
@@ -13,7 +13,10 @@ export function urlOfArtifact({
|
||||
download?: boolean;
|
||||
isMock?: boolean;
|
||||
}) {
|
||||
if (isMock || isStaticWebsiteOnly()) {
|
||||
if (isStaticWebsiteOnly()) {
|
||||
return staticDemoArtifactURL({ filepath, threadId, download });
|
||||
}
|
||||
if (isMock) {
|
||||
return `${getBackendBaseURL()}/mock/api/threads/${threadId}/artifacts${filepath}${download ? "?download=true" : ""}`;
|
||||
}
|
||||
return `${getBackendBaseURL()}/api/threads/${threadId}/artifacts${filepath}${download ? "?download=true" : ""}`;
|
||||
@@ -25,7 +28,20 @@ export function extractArtifactsFromThread(thread: AgentThread) {
|
||||
|
||||
export function resolveArtifactURL(absolutePath: string, threadId: string) {
|
||||
if (isStaticWebsiteOnly()) {
|
||||
return `${getBackendBaseURL()}/mock/api/threads/${threadId}/artifacts${absolutePath}`;
|
||||
return staticDemoArtifactURL({ filepath: absolutePath, threadId });
|
||||
}
|
||||
return `${getBackendBaseURL()}/api/threads/${threadId}/artifacts${absolutePath}`;
|
||||
}
|
||||
|
||||
function staticDemoArtifactURL({
|
||||
filepath,
|
||||
threadId,
|
||||
download = false,
|
||||
}: {
|
||||
filepath: string;
|
||||
threadId: string;
|
||||
download?: boolean;
|
||||
}) {
|
||||
const demoPath = filepath.replace(/^\/mnt\//, "/");
|
||||
return `${getBackendBaseURL()}/demo/threads/${threadId}${demoPath}${download ? "?download=true" : ""}`;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
||||
|
||||
const ENV_KEYS = [
|
||||
"NEXT_PUBLIC_BACKEND_BASE_URL",
|
||||
"NEXT_PUBLIC_STATIC_WEBSITE_ONLY",
|
||||
] as const;
|
||||
|
||||
type EnvSnapshot = Partial<
|
||||
Record<(typeof ENV_KEYS)[number], string | undefined>
|
||||
>;
|
||||
|
||||
function snapshotEnv(): EnvSnapshot {
|
||||
const snapshot: EnvSnapshot = {};
|
||||
for (const key of ENV_KEYS) {
|
||||
snapshot[key] = process.env[key];
|
||||
}
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
function setEnv(key: (typeof ENV_KEYS)[number], value: string | undefined) {
|
||||
const env = process.env as Record<string, string | undefined>;
|
||||
if (value === undefined) {
|
||||
delete env[key];
|
||||
} else {
|
||||
env[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
function restoreEnv(snapshot: EnvSnapshot) {
|
||||
for (const key of ENV_KEYS) {
|
||||
setEnv(key, snapshot[key]);
|
||||
}
|
||||
}
|
||||
|
||||
async function loadFreshArtifactUtils() {
|
||||
vi.resetModules();
|
||||
return await import("@/core/artifacts/utils");
|
||||
}
|
||||
|
||||
describe("artifact URL helpers", () => {
|
||||
let saved: EnvSnapshot;
|
||||
|
||||
beforeEach(() => {
|
||||
saved = snapshotEnv();
|
||||
setEnv("NEXT_PUBLIC_BACKEND_BASE_URL", undefined);
|
||||
setEnv("NEXT_PUBLIC_STATIC_WEBSITE_ONLY", undefined);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
restoreEnv(saved);
|
||||
});
|
||||
|
||||
test("maps static demo artifact paths to bundled public files", async () => {
|
||||
setEnv("NEXT_PUBLIC_STATIC_WEBSITE_ONLY", "true");
|
||||
|
||||
const { resolveArtifactURL, urlOfArtifact } =
|
||||
await loadFreshArtifactUtils();
|
||||
|
||||
expect(
|
||||
urlOfArtifact({
|
||||
filepath: "/mnt/user-data/outputs/index.html",
|
||||
threadId: "thread-1",
|
||||
}),
|
||||
).toBe("/demo/threads/thread-1/user-data/outputs/index.html");
|
||||
expect(
|
||||
resolveArtifactURL("/mnt/user-data/outputs/style.css", "thread-1"),
|
||||
).toBe("/demo/threads/thread-1/user-data/outputs/style.css");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user