271 lines
7.0 KiB
JavaScript
271 lines
7.0 KiB
JavaScript
import { reactive, nextTick, computed, h, inject } from 'vue'
|
|
// import { renderIcon } from '@/utils/util'
|
|
// import {
|
|
// ArrowUp,
|
|
// ArrowDown,
|
|
// Logout,
|
|
// Delete,
|
|
// Clear,
|
|
// Remind,
|
|
// CloseRemind,
|
|
// EditTwo,
|
|
// IdCard
|
|
// } from '@icon-park/vue-next'
|
|
import { ServeTopTalkList, ServeDeleteTalkList, ServeSetNotDisturb } from '@/api/chat'
|
|
import { useDialogueStore, useTalkStore, useDialogueListStore } from '@/store'
|
|
import { ServeSecedeGroup } from '@/api/group'
|
|
// import { ServeDeleteContact, ServeEditContactRemark } from '@/api/contact'
|
|
// import { NInput } from 'naive-ui'
|
|
|
|
export function useSessionMenu() {
|
|
const dropdown = reactive({
|
|
options: [],
|
|
show: false,
|
|
x: 0,
|
|
y: 0,
|
|
item: {}
|
|
})
|
|
|
|
const dialogueStore = useDialogueStore()
|
|
const talkStore = useTalkStore()
|
|
const dialogueListStore = useDialogueListStore()
|
|
|
|
const user = inject('$user')
|
|
|
|
// 当前会话索引
|
|
const indexName = computed(() => dialogueStore.index_name)
|
|
|
|
// const onContextMenu = (e: any, item: ISession) => {
|
|
// dropdown.show = false
|
|
// dropdown.item = Object.assign({}, item)
|
|
// dropdown.options = []
|
|
|
|
// const options: any[] = []
|
|
|
|
// if (item.talk_type == 1) {
|
|
// options.push({
|
|
// icon: renderIcon(IdCard),
|
|
// label: '好友信息',
|
|
// key: 'info'
|
|
// })
|
|
|
|
// options.push({
|
|
// icon: renderIcon(EditTwo),
|
|
// label: '修改备注',
|
|
// key: 'remark'
|
|
// })
|
|
// }
|
|
|
|
// options.push({
|
|
// icon: renderIcon(item.is_top ? ArrowDown : ArrowUp),
|
|
// label: item.is_top ? '取消置顶' : '会话置顶',
|
|
// key: 'top'
|
|
// })
|
|
|
|
// options.push({
|
|
// icon: renderIcon(item.is_disturb ? Remind : CloseRemind),
|
|
// label: item.is_disturb ? '关闭免打扰' : '开启免打扰',
|
|
// key: 'disturb'
|
|
// })
|
|
|
|
// options.push({
|
|
// icon: renderIcon(Clear),
|
|
// label: '移除会话',
|
|
// key: 'remove'
|
|
// })
|
|
|
|
// if (item.talk_type == 1) {
|
|
// options.push({
|
|
// icon: renderIcon(Delete),
|
|
// label: '删除好友',
|
|
// key: 'delete_contact'
|
|
// })
|
|
// } else {
|
|
// options.push({
|
|
// icon: renderIcon(Logout),
|
|
// label: '退出群聊',
|
|
// key: 'signout_group'
|
|
// })
|
|
// }
|
|
|
|
// dropdown.options = [...options]
|
|
|
|
// nextTick(() => {
|
|
// dropdown.show = true
|
|
// dropdown.x = e.clientX
|
|
// dropdown.y = e.clientY
|
|
// })
|
|
|
|
// e.preventDefault()
|
|
// }
|
|
|
|
const onCloseContextMenu = () => {
|
|
dropdown.show = false
|
|
dropdown.item = {}
|
|
}
|
|
|
|
const onDeleteTalk = (index_name = '') => {
|
|
talkStore.delItem(index_name)
|
|
dialogueListStore.delDialogueStorage(index_name)
|
|
|
|
index_name === indexName.value && dialogueStore.$reset()
|
|
}
|
|
|
|
const onUserInfo = (item) => {
|
|
user(item.receiver_id)
|
|
}
|
|
|
|
// 移除会话
|
|
const onRemoveTalk = (item) => {
|
|
ServeDeleteTalkList({
|
|
list_id: item.id
|
|
}).then(({ code }) => {
|
|
if (code == 200) {
|
|
onDeleteTalk(item.index_name)
|
|
}
|
|
})
|
|
}
|
|
|
|
// 设置消息免打扰
|
|
const onSetDisturb = (item) => {
|
|
ServeSetNotDisturb({
|
|
talk_type: item.talk_type,
|
|
receiver_id: item.receiver_id,
|
|
is_disturb: item.is_disturb == 0 ? 1 : 0
|
|
}).then(({ code, message }) => {
|
|
if (code == 200) {
|
|
message.success('设置成功!')
|
|
talkStore.updateItem({
|
|
index_name: item.index_name,
|
|
is_disturb: item.is_disturb == 0 ? 1 : 0
|
|
})
|
|
} else {
|
|
message.error(message)
|
|
}
|
|
})
|
|
}
|
|
|
|
// 置顶会话
|
|
const onToTopTalk = (item) => {
|
|
if (item.is_top == 0 && talkStore.topItems.length >= 18) {
|
|
return message.warning('置顶最多不能超过18个会话')
|
|
}
|
|
|
|
ServeTopTalkList({
|
|
list_id: item.id,
|
|
type: item.is_top == 0 ? 1 : 2
|
|
}).then(({ code, message }) => {
|
|
if (code == 200) {
|
|
talkStore.updateItem({
|
|
index_name: item.index_name,
|
|
is_top: item.is_top == 0 ? 1 : 0
|
|
})
|
|
} else {
|
|
message.error(message)
|
|
}
|
|
})
|
|
}
|
|
|
|
// // 移除联系人
|
|
// const onDeleteContact = (item) => {
|
|
// const name = item.remark || item.name
|
|
|
|
// window['$dialog'].create({
|
|
// showIcon: false,
|
|
// title: `删除 [${name}] 联系人?`,
|
|
// content: '删除后不再接收对方任何消息。',
|
|
// positiveText: '确定',
|
|
// negativeText: '取消',
|
|
// onPositiveClick: () => {
|
|
// ServeDeleteContact({
|
|
// friend_id: item.receiver_id
|
|
// }).then(({ code, message }) => {
|
|
// if (code == 200) {
|
|
// window['$message'].success('删除联系人成功')
|
|
// onDeleteTalk(item.index_name)
|
|
// } else {
|
|
// window['$message'].error(message)
|
|
// }
|
|
// })
|
|
// }
|
|
// })
|
|
// }
|
|
|
|
// 退出群聊
|
|
const onSignOutGroup = (item) => {
|
|
window['$dialog'].create({
|
|
showIcon: false,
|
|
title: `退出 [${item.name}] 群聊?`,
|
|
content: '退出后不再接收此群的任何消息。',
|
|
positiveText: '确定',
|
|
negativeText: '取消',
|
|
onPositiveClick: () => {
|
|
ServeSecedeGroup({
|
|
group_id: item.receiver_id
|
|
}).then(({ code, message }) => {
|
|
if (code == 200) {
|
|
message.success('已退出群聊')
|
|
onDeleteTalk(item.index_name)
|
|
} else {
|
|
message.error(message)
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
// const onChangeRemark = (item) => {
|
|
// let remark = ''
|
|
// window['$dialog'].create({
|
|
// showIcon: false,
|
|
// title: '修改备注',
|
|
// content: () => {
|
|
// return h(NInput, {
|
|
// defaultValue: item.remark,
|
|
// placeholder: '请输入备注信息',
|
|
// style: { marginTop: '20px' },
|
|
// onInput: (value) => (remark = value),
|
|
// autofocus: true
|
|
// })
|
|
// },
|
|
// negativeText: '取消',
|
|
// positiveText: '修改备注',
|
|
// onPositiveClick: () => {
|
|
// ServeEditContactRemark({
|
|
// friend_id: item.receiver_id,
|
|
// remark: remark
|
|
// }).then(({ code, message }) => {
|
|
// if (code == 200) {
|
|
// window['$message'].success('备注成功')
|
|
// talkStore.updateItem({
|
|
// index_name: item.index_name,
|
|
// remark: remark
|
|
// })
|
|
// } else {
|
|
// window['$message'].error(message)
|
|
// }
|
|
// })
|
|
// }
|
|
// })
|
|
// }
|
|
|
|
// 会话列表右键菜单回调事件
|
|
const onContextMenuTalkHandle = (key) => {
|
|
// 注册回调事件
|
|
const evnets = {
|
|
info: onUserInfo,
|
|
top: onToTopTalk,
|
|
remove: onRemoveTalk,
|
|
disturb: onSetDisturb,
|
|
signout_group: onSignOutGroup,
|
|
delete_contact: onDeleteContact,
|
|
remark: onChangeRemark
|
|
}
|
|
|
|
dropdown.show = false
|
|
evnets[key] && evnets[key](dropdown.item)
|
|
}
|
|
|
|
return { dropdown, onCloseContextMenu, onContextMenuTalkHandle, onToTopTalk, onRemoveTalk }
|
|
}
|