| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { Message } from '../types' |
| | | |
| | | import { computed, reactive } from 'vue' |
| | | |
| | | /** |
| | | * æ¶æ¯å¤éæ¨¡å¼ |
| | | * |
| | | * 模å级åä¾ reactive stateï¼MessagePanel åæ å
å¤å¤å
±äº«ï¼ |
| | | * - MessageItem 渲æå¾é + 忢å¾é |
| | | * - MessageMultiSelectBar åºæ 读é䏿° |
| | | * - MessageForwardDialog 转åæåå exit |
| | | * - MessagePanel watch activeConversation åä¼è¯ exit |
| | | */ |
| | | const state = reactive({ |
| | | active: false, |
| | | /** å·²é clientMessageId åè¡¨ï¼æéä¸é¡ºåºä¿åº */ |
| | | selectedClientMessageIds: [] as string[] |
| | | }) |
| | | |
| | | /** å·²é clientMessageId éåï¼MessageItem 大é has æ¥è¯¢èµ°å®ï¼é¿å
array.includes O(N²) */ |
| | | const selectedIdSet = computed(() => new Set(state.selectedClientMessageIds)) |
| | | |
| | | /** è¿å
¥å¤é模å¼ï¼å¯é带åå§å¾é项 */ |
| | | function enter(initialMessage?: Message) { |
| | | state.active = true |
| | | state.selectedClientMessageIds = initialMessage ? [initialMessage.clientMessageId] : [] |
| | | } |
| | | |
| | | /** éåºå¤éæ¨¡å¼ */ |
| | | function exit() { |
| | | state.active = false |
| | | state.selectedClientMessageIds = [] |
| | | } |
| | | |
| | | /** åæ¢ææ¡æ¶æ¯çé䏿 */ |
| | | function toggle(message: Message) { |
| | | const ids = state.selectedClientMessageIds |
| | | const index = ids.indexOf(message.clientMessageId) |
| | | if (index === -1) { |
| | | ids.push(message.clientMessageId) |
| | | } else { |
| | | ids.splice(index, 1) |
| | | } |
| | | } |
| | | |
| | | export function useMessageMultiSelect() { |
| | | return { state, selectedIdSet, enter, exit, toggle } |
| | | } |