fix: reconcile untouched drafts during discovery refresh

This commit is contained in:
Neil
2026-09-05 15:09:29 -07:00
parent 4624b2a62e
commit 9cbbbc2b6c
2 changed files with 34 additions and 1 deletions
@@ -125,3 +125,28 @@ it('discovers other-window drafts on refresh without replacing local edits', asy
expect(useCreationDraftSession.getState().entries['create-1'].buffer.text).toBe('local text')
expect(useCreationDraftSession.getState().entries['create-2'].buffer.text).toBe('new draft')
})
it('reconciles external draft replacement without accumulating removed records', async () => {
for (let generation = 0; generation < 3; generation++) {
database.listDrafts.mockResolvedValue(
Array.from({ length: 64 }, (_, index) => ({
...draft('external', `${generation}-${index}`),
revision: 1
}))
)
await loadCreationDrafts(true)
expect(Object.keys(useCreationDraftSession.getState().entries)).toHaveLength(64)
}
})
it('preserves the open recovered draft when another writer deletes it', async () => {
database.listDrafts.mockResolvedValue([{ ...draft('keep open'), revision: 1 }])
await loadCreationDrafts()
useCreationDraftSession.setState({ viewedDraftId: 'create-1' })
database.listDrafts.mockResolvedValue([])
await loadCreationDrafts(true)
expect(useCreationDraftSession.getState().entries['create-1'].buffer.text).toBe('keep open')
useCreationDraftSession.setState({ viewedDraftId: null })
await loadCreationDrafts(true)
expect(useCreationDraftSession.getState().entries).toEqual({})
})
@@ -54,8 +54,16 @@ export function loadCreationDrafts(refresh = false): Promise<void> {
.then((drafts) => {
useCreationDraftSession.setState((state) => {
const entries = { ...state.entries }
const storedIds = new Set(drafts.map((draft) => draft.id))
const isUntouched = (id: string): boolean =>
entries[id]?.editVersion === 0 && state.viewedDraftId !== id
for (const id of Object.keys(entries)) {
if (!storedIds.has(id) && isUntouched(id)) {
delete entries[id]
}
}
for (const draft of drafts) {
if (!entries[draft.id]) {
if (!entries[draft.id] || isUntouched(draft.id)) {
entries[draft.id] = fromStored(draft)
}
}