返回 DeepSeek-Reasonix
trashLifecycleBrowser.tsx
根目录 / desktop / frontend / src / test-support / trashLifecycleBrowser.tsx
1 import { createRoot } from "react-dom/client";
2 import { TrashPage } from "../components/TrashPage";
3 import { LocaleProvider } from "../lib/i18n";
4 import type { SessionLifecycleRequest } from "../generated/desktopContract.generated";
5 import { installDesktopHostStub } from "../__tests__/desktopHostStub";
6 import "../styles.css";
7
8 let generation = 7, targetGeneration = 7;
9 let unknown = false, preview = true;
10 let finishPreview: (() => void) | undefined;
11 const requests: SessionLifecycleRequest[] = [];
12 const ref = { hostId: "local", sessionId: "fixture-session" };
13 const host = installDesktopHostStub({
14 ListTrashEntries: async () => ({ generation, items: [{ id: ref.sessionId, ref, title: "Fixture conversation", workspaceTitle: "Global", archivedAt: 0, canPurge: true, canRestore: preview, canPreview: preview, health: "ready" }] }),
15 ReadSessionHistory: async () => new Promise(resolve => { finishPreview = () => resolve({ messages: [{ role: "user", content: "late fixture history" }] }); }),
16 ApplySessionLifecycle: async (request: SessionLifecycleRequest) => {
17 requests.push(structuredClone(request));
18 if (unknown) { unknown = false; throw new Error("network outcome unknown"); }
19 const committed = request.expectedGeneration >= targetGeneration;
20 return { operationId: request.operationId, generation, committed, items: request.targets.map(target => ({ target, committed, retryable: false, errorCode: committed ? "" : "state_conflict" })) };
21 },
22 });
23 Object.assign(window, { trashFixture: {
24 requests,
25 changeTarget() { targetGeneration = ++generation; host.emit("project-tree:changed"); },
26 changeOther() { generation++; host.emit("project-tree:changed"); },
27 loseResult() { unknown = true; },
28 invalidatePreview() { preview = false; host.emit("project-tree:changed"); },
29 finishPreview() { finishPreview?.(); },
30 } });
31 createRoot(document.getElementById("root")!).render(<LocaleProvider><TrashPage active onBack={() => {}}
32 onOpenSession={async () => {}} list={async () => []} restore={async () => {}} purge={async () => {}} /></LocaleProvider>);
33
33 lines Plain Text