Images and GitHub issues/PRs now live in one draft-store list (ComposerAttachment union) with cwd persisted on the draft. Paperclip becomes a + drop-up menu; queue button removed. Each pill uses a shared AttachmentPill wrapper with a corner-X that mirrors the auto-update toast spec. Pill body opens the attachment: GitHub via openExternalUrl, images via a new fullscreen AttachmentLightbox. GitHub picker auto-closes on select.
74 lines
1.9 KiB
TypeScript
74 lines
1.9 KiB
TypeScript
import "@/test/window-local-storage";
|
|
import { describe, expect, it } from "vitest";
|
|
import { __draftStoreTestUtils } from "./draft-store";
|
|
|
|
describe("draft-store lifecycle", () => {
|
|
it("prunes finalized tombstones after TTL", () => {
|
|
const nowMs = 1_000_000;
|
|
const drafts = {
|
|
oldSent: {
|
|
input: { text: "", attachments: [], cwd: "" },
|
|
lifecycle: "sent" as const,
|
|
updatedAt: 0,
|
|
version: 2,
|
|
},
|
|
recentAbandoned: {
|
|
input: { text: "", attachments: [], cwd: "" },
|
|
lifecycle: "abandoned" as const,
|
|
updatedAt: nowMs + 2 * 60 * 1000,
|
|
version: 2,
|
|
},
|
|
active: {
|
|
input: { text: "a", attachments: [], cwd: "/repo" },
|
|
lifecycle: "active" as const,
|
|
updatedAt: 0,
|
|
version: 1,
|
|
},
|
|
};
|
|
|
|
const pruned = __draftStoreTestUtils.pruneFinalizedDraftRecords({
|
|
drafts,
|
|
nowMs: nowMs + 6 * 60 * 1000,
|
|
});
|
|
|
|
expect(pruned.oldSent).toBeUndefined();
|
|
expect(pruned.recentAbandoned).toBeDefined();
|
|
expect(pruned.active).toBeDefined();
|
|
});
|
|
|
|
it("normalizes clear-with-lifecycle into a tombstone without attachments", () => {
|
|
const cleared = __draftStoreTestUtils.applyClearDraftRecord({
|
|
record: {
|
|
input: {
|
|
text: "hello",
|
|
attachments: [
|
|
{
|
|
kind: "image",
|
|
metadata: {
|
|
id: "att-1",
|
|
mimeType: "image/jpeg",
|
|
storageType: "web-indexeddb",
|
|
storageKey: "att-1",
|
|
createdAt: 1,
|
|
},
|
|
},
|
|
],
|
|
cwd: "/repo",
|
|
},
|
|
lifecycle: "active",
|
|
updatedAt: 1,
|
|
version: 1,
|
|
},
|
|
lifecycle: "sent",
|
|
nowMs: 2,
|
|
});
|
|
|
|
expect(cleared).toEqual({
|
|
input: { text: "", attachments: [], cwd: "" },
|
|
lifecycle: "sent",
|
|
updatedAt: 2,
|
|
version: 2,
|
|
});
|
|
});
|
|
});
|