Files
yudao-ui-admin-vben/apps/web-antd/src/views/im/home/composables/useMessageMultiSelect.ts
2026-06-17 17:57:24 -07:00

49 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Message } from '../types'
import { computed, reactive } from 'vue'
/**
* 消息多选模式
*
* 模块级单例 reactive stateMessagePanel 子树内多处共享:
* - 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 }
}