Move composer cancel/queue/attachment/dispatch orchestration out of composer.tsx into a React-free actions module. The module takes its dependencies (send client, queue writer, stream writer, attachment persister, image picker) as injected ports, so the new composer-actions.test.ts can drive every action with inline fakes — zero vi.mock of internal modules, zero JSDOM, zero React. The old composer.test.tsx (heavy mocked component test) is removed and replaced with composer-actions.test.ts (31 unit tests). Also extract isWorkspaceAttachment / userAttachmentsOnly / workspaceAttachmentToSubmitAttachment from composer-workspace-attachments.tsx into a sibling .ts so the actions module (and composer-attachments.ts) can use them without dragging React/RN/lucide into a pure test graph.
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import type { AttachmentMetadata, ComposerAttachment } from "@/attachments/types";
|
|
import {
|
|
isWorkspaceAttachment,
|
|
workspaceAttachmentToSubmitAttachment,
|
|
} from "@/attachments/workspace-attachment-utils";
|
|
import type { AgentAttachment } from "@server/shared/messages";
|
|
import { buildGitHubAttachmentFromSearchItem } from "@/utils/review-attachments";
|
|
|
|
export type ImageAttachment = AttachmentMetadata;
|
|
|
|
export function splitComposerAttachmentsForSubmit(attachments: ComposerAttachment[]): {
|
|
images: ImageAttachment[];
|
|
attachments: AgentAttachment[];
|
|
} {
|
|
const images: ImageAttachment[] = [];
|
|
const reviewAttachments: AgentAttachment[] = [];
|
|
|
|
for (const attachment of attachments) {
|
|
if (attachment.kind === "image") {
|
|
images.push(attachment.metadata);
|
|
continue;
|
|
}
|
|
|
|
if (isWorkspaceAttachment(attachment)) {
|
|
const workspaceAttachment = workspaceAttachmentToSubmitAttachment(attachment);
|
|
if (workspaceAttachment) {
|
|
reviewAttachments.push(workspaceAttachment);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
const reviewAttachment = buildGitHubAttachmentFromSearchItem(attachment.item);
|
|
if (reviewAttachment) {
|
|
reviewAttachments.push(reviewAttachment);
|
|
}
|
|
}
|
|
|
|
return {
|
|
images,
|
|
attachments: reviewAttachments,
|
|
};
|
|
}
|