gaoluyang
2026-06-29 27cd042df9aca0383a49f3514bc21958dd890912
src/views/im/home/composables/useMessageMultiSelect.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
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 }
}