()
| 132 | let isDisposed = false |
| 133 | |
| 134 | const flush = () => { |
| 135 | if (pendingUpdaters.length === 0) return |
| 136 | |
| 137 | // Capture and clear the queue atomically |
| 138 | const updaters = pendingUpdaters.splice(0, pendingUpdaters.length) |
| 139 | |
| 140 | // Compose all pending updaters into a single transform |
| 141 | const composedUpdater = (msg: ChatMessage): ChatMessage => { |
| 142 | return updaters.reduce((m, fn) => fn(m), msg) |
| 143 | } |
| 144 | |
| 145 | // Apply composed update to the target message |
| 146 | setMessages((prev) => |
| 147 | prev.map((msg) => (msg.id === aiMessageId ? composedUpdater(msg) : msg)), |
| 148 | ) |
| 149 | } |
| 150 | |
| 151 | const dispose = () => { |
| 152 | if (isDisposed) return |
no test coverage detected