1import { Atom } from "effect/reactivity";
2import { appAtomRegistry } from "./atom-registry";
3import 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.
7export const acknowledgedThreadMessagesAtom = Atom.make<ReadonlyArray<QueuedThreadMessage>>(
8 [],
9).pipe(Atom.keepAlive);
10
11export 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
21export 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}