| 1 | import { Atom } from "effect/reactivity"; |
| 2 | import { appAtomRegistry } from "./atom-registry"; |
| 3 | import type { QueuedThreadMessage } from "./thread-outbox-model"; |
| 4 | |
| 5 | // A command acknowledgment can precede its message in the subscribed timeline. |
| 6 | // Keep the visible row until that projection arrives, independently of outbox cleanup. |
| 7 | export const acknowledgedThreadMessagesAtom = Atom.make<ReadonlyArray<QueuedThreadMessage>>( |
| 8 | [], |
| 9 | ).pipe(Atom.keepAlive); |
| 10 | |
| 11 | export function retainAcknowledgedThreadMessage(message: QueuedThreadMessage) { |
| 12 | const current = appAtomRegistry.get(acknowledgedThreadMessagesAtom); |
| 13 | appAtomRegistry.set( |
| 14 | acknowledgedThreadMessagesAtom, |
| 15 | current.some((entry) => entry.messageId === message.messageId) |
| 16 | ? current |
| 17 | : [...current, message], |
| 18 | ); |
| 19 | } |
| 20 | |
| 21 | export function forgetAcknowledgedThreadMessage(message: QueuedThreadMessage) { |
| 22 | const current = appAtomRegistry.get(acknowledgedThreadMessagesAtom); |
| 23 | appAtomRegistry.set( |
| 24 | acknowledgedThreadMessagesAtom, |
| 25 | current.filter((entry) => entry.messageId !== message.messageId), |
| 26 | ); |
| 27 | } |