mirror of
https://github.com/stablyai/orca.git
synced 2026-09-29 08:03:20 +00:00
fix: reconcile untouched drafts during discovery refresh
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user