(pageId: string, messageId: string)
| 55 | } |
| 56 | |
| 57 | export async function deleteMessage(pageId: string, messageId: string): Promise<void> { |
| 58 | const record = stores.message.get(pageId) |
| 59 | if (!record) return |
| 60 | |
| 61 | const { messageMap, childrenMap } = buildMessageMaps(record.messages) |
| 62 | |
| 63 | // 获取要删除的消息及其所有子消息 - O(N) 而非 O(N²) |
| 64 | const idsToDelete = getDescendantIds(childrenMap, messageId) |
| 65 | idsToDelete.add(messageId) |
| 66 | |
| 67 | const deletedMsg = messageMap.get(messageId) |
| 68 | |
| 69 | // 计算新的 leafMessageId |
| 70 | let leafMessageId = record.leafMessageId |
| 71 | if (leafMessageId && idsToDelete.has(leafMessageId)) { |
| 72 | // 获取原始的 siblings(包含被删除的消息) |
| 73 | const allSiblings = childrenMap.get(deletedMsg?.parentMessageId) ?? [] |
| 74 | // 找到被删除消息在兄弟中的位置 |
| 75 | const deletedIndex = allSiblings.findIndex((m) => m.id === messageId) |
| 76 | // 过滤掉要删除的消息 |
| 77 | const remainingSiblings = allSiblings.filter((m) => !idsToDelete.has(m.id)) |
| 78 | |
| 79 | if (remainingSiblings.length > 0) { |
| 80 | // 优先选择上一个分支(index - 1),否则选择下一个 |
| 81 | const targetIndex = Math.min(Math.max(0, deletedIndex - 1), remainingSiblings.length - 1) |
| 82 | const targetSibling = remainingSiblings[targetIndex] |
| 83 | |
| 84 | const remainingMessages = record.messages.filter((m) => !idsToDelete.has(m.id)) |
| 85 | const { childrenMap: remainingChildrenMap } = buildMessageMaps(remainingMessages) |
| 86 | leafMessageId = findLeafFromMessage(remainingChildrenMap, targetSibling.id) |
| 87 | } else { |
| 88 | leafMessageId = deletedMsg?.parentMessageId |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | await stores.message.update(pageId, (r) => ({ |
| 93 | ...r, |
| 94 | messages: r.messages.filter((m) => !idsToDelete.has(m.id)), |
| 95 | leafMessageId |
| 96 | })) |
| 97 | } |
| 98 | |
| 99 | // ==================== 分支操作 ==================== |
| 100 |
nothing calls this directly
no test coverage detected