( messages: ChatMessage[], collapsed: boolean, )
| 212 | * @returns Updated messages array with all collapsible blocks set to the specified state |
| 213 | */ |
| 214 | export function setAllBlocksCollapsedState( |
| 215 | messages: ChatMessage[], |
| 216 | collapsed: boolean, |
| 217 | ): ChatMessage[] { |
| 218 | return messages.map((message) => { |
| 219 | let updatedMessage = message |
| 220 | let messageChanged = false |
| 221 | |
| 222 | // Handle agent variant messages (message-level isCollapsed) |
| 223 | if (message.variant === 'agent') { |
| 224 | // Treat undefined as collapsed (true) to match hasAnyExpandedBlocks semantics |
| 225 | const currentCollapsed = message.metadata?.isCollapsed ?? true |
| 226 | if (currentCollapsed !== collapsed) { |
| 227 | messageChanged = true |
| 228 | updatedMessage = { |
| 229 | ...updatedMessage, |
| 230 | metadata: { |
| 231 | ...updatedMessage.metadata, |
| 232 | isCollapsed: collapsed, |
| 233 | userOpened: !collapsed ? true : updatedMessage.metadata?.userOpened, |
| 234 | }, |
| 235 | } |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | // Handle blocks within messages (applies to all message variants) |
| 240 | if (message.blocks) { |
| 241 | const { blocks: updatedBlocks, changed } = updateBlocksRecursively( |
| 242 | message.blocks, |
| 243 | collapsed, |
| 244 | ) |
| 245 | if (changed) { |
| 246 | messageChanged = true |
| 247 | updatedMessage = { |
| 248 | ...updatedMessage, |
| 249 | blocks: updatedBlocks, |
| 250 | } |
| 251 | } |
| 252 | } |
| 253 | |
| 254 | return messageChanged ? updatedMessage : message |
| 255 | }) |
| 256 | } |
no test coverage detected