refactor(frontend): 四生成 hook 结束后额外返回产物(AC-3 留痕前置)
useRefine.refine/recommunicate→RefineVersion|null、useContinue.generate→string|null、 useChapterRewrite.send→RewriteVersion|null、useGenerator.generate→GeneratorArtifact|null。 向后兼容(既有调用忽略返回值不受影响);各 hook 成功用例补返回值断言。 面板据此 if(artifact) 才 append,空候选/错误路径不留痕。
This commit is contained in:
@@ -55,8 +55,9 @@ describe("useGenerator", () => {
|
||||
});
|
||||
|
||||
const { result } = renderHook(() => useGenerator());
|
||||
let returned: { outputKind: string; rawPreview: unknown } | null = null;
|
||||
await act(async () => {
|
||||
await result.current.generate("p1", "idea", { brief: "脑洞" });
|
||||
returned = await result.current.generate("p1", "idea", { brief: "脑洞" });
|
||||
});
|
||||
|
||||
expect(result.current.genStatus).toBe("preview");
|
||||
@@ -65,6 +66,9 @@ describe("useGenerator", () => {
|
||||
expect(result.current.preview?.kind).toBe("IdeaListResult");
|
||||
expect(result.current.preview?.items[0]?.heading).toBe("废柴逆袭");
|
||||
expect(toast).not.toHaveBeenCalled();
|
||||
// 追加断言:generate 返回本次产物(供 GeneratorRunner 结束后留痕)。
|
||||
expect(returned?.outputKind).toBe("IdeaListResult");
|
||||
expect(returned?.rawPreview).toEqual(preview);
|
||||
});
|
||||
|
||||
it("生成后端返回 error:genStatus=error 且弹错误 toast", async () => {
|
||||
|
||||
@@ -16,6 +16,13 @@ import type { ToolGenerateRequest } from "@/lib/api/types";
|
||||
export type GenStatus = "idle" | "generating" | "preview" | "error";
|
||||
export type IngestStatus = "idle" | "ingesting" | "conflict" | "done" | "error";
|
||||
|
||||
// 一次生成的产物(供调用方在结束后留痕;与 hook state 同源)。
|
||||
export interface GeneratorArtifact {
|
||||
preview: PreviewModel;
|
||||
rawPreview: Record<string, unknown> | undefined;
|
||||
outputKind: string;
|
||||
}
|
||||
|
||||
export interface UseGenerator {
|
||||
genStatus: GenStatus;
|
||||
preview: PreviewModel | null;
|
||||
@@ -30,7 +37,7 @@ export interface UseGenerator {
|
||||
projectId: string,
|
||||
toolKey: string,
|
||||
body: ToolGenerateRequest,
|
||||
) => Promise<void>;
|
||||
) => Promise<GeneratorArtifact | null>;
|
||||
// 入库选中行;acknowledge 用于过 409(已查看冲突后重发)。
|
||||
ingest: (
|
||||
projectId: string,
|
||||
@@ -74,15 +81,22 @@ export function useGenerator(): UseGenerator {
|
||||
if (error || !data) {
|
||||
setGenStatus("error");
|
||||
toast(generationErrorMessage(error), "error");
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
setPreview(mapPreview(data.output_kind, data.preview));
|
||||
const mapped = mapPreview(data.output_kind, data.preview);
|
||||
setPreview(mapped);
|
||||
setRawPreview(data.preview);
|
||||
setOutputKind(data.output_kind);
|
||||
setGenStatus("preview");
|
||||
return {
|
||||
preview: mapped,
|
||||
rawPreview: data.preview,
|
||||
outputKind: data.output_kind,
|
||||
};
|
||||
} catch {
|
||||
setGenStatus("error");
|
||||
toast("生成请求异常,请检查网络。", "error");
|
||||
return null;
|
||||
}
|
||||
},
|
||||
[toast],
|
||||
|
||||
Reference in New Issue
Block a user