1
1
<template >
2
2
<div class =" kefu" >
3
3
<div
4
- v-for =" ( item, index) in conversationList"
4
+ v-for =" item in conversationList"
5
5
:key =" item.id"
6
- :class =" { active: index === activeConversationIndex , pinned: item.adminPinned }"
6
+ :class =" { active: item.id === activeConversationId , pinned: item.adminPinned }"
7
7
class =" kefu-conversation flex items-center"
8
- @click =" openRightMessage(item, index )"
8
+ @click =" openRightMessage(item)"
9
9
@contextmenu.prevent =" rightClick($event as PointerEvent, item)"
10
10
>
11
11
<div class =" flex justify-center items-center w-100%" >
12
- <!-- TODO style 换成 unocss -->
13
- <div class =" flex justify-center items-center" style =" width : 50px ; height : 50px " >
12
+ <div class =" flex justify-center items-center w-50px h-50px" >
14
13
<!-- 头像 + 未读 -->
15
14
<el-badge
16
15
:hidden =" item.adminUnreadMessageCount === 0"
27
26
{{ formatDate(item.lastMessageTime) }}
28
27
</span >
29
28
</div >
30
- <!-- 文本消息 -->
31
- <template v-if =" KeFuMessageContentTypeEnum .TEXT === item .lastMessageContentType " >
32
- <div
33
- v-dompurify-html =" replaceEmoji(item.lastMessageContent)"
34
- class =" last-message flex items-center color-[#989EA6]"
35
- ></div >
36
- </template >
37
- <!-- 图片消息 -->
38
- <template v-else >
39
- <div class =" last-message flex items-center color-[#989EA6]" >
40
- {{ getContentType(item.lastMessageContentType) }}
41
- </div >
42
- </template >
29
+ <!-- 最后聊天内容 -->
30
+ <div
31
+ v-dompurify-html ="
32
+ getConversationDisplayText(item.lastMessageContentType, item.lastMessageContent)
33
+ "
34
+ class =" last-message flex items-center color-[#989EA6]"
35
+ ></div >
43
36
</div >
44
37
</div >
45
38
</div >
46
39
47
40
<!-- 右键,进行操作(类似微信) -->
48
41
<ul v-show =" showRightMenu" :style =" rightMenuStyle" class =" right-menu-ul" >
49
42
<li
50
- v-show =" !selectedConversation .adminPinned"
43
+ v-show =" !rightClickConversation .adminPinned"
51
44
class =" flex items-center"
52
45
@click.stop =" updateConversationPinned(true)"
53
46
>
54
47
<Icon class =" mr-5px" icon =" ep:top" />
55
48
置顶会话
56
49
</li >
57
50
<li
58
- v-show =" selectedConversation .adminPinned"
51
+ v-show =" rightClickConversation .adminPinned"
59
52
class =" flex items-center"
60
53
@click.stop =" updateConversationPinned(false)"
61
54
>
@@ -86,7 +79,7 @@ const message = useMessage() // 消息弹窗
86
79
87
80
const { replaceEmoji } = useEmoji ()
88
81
const conversationList = ref <KeFuConversationRespVO []>([]) // 会话列表
89
- const activeConversationIndex = ref (- 1 ) // 选中的会话 index 位置 TODO @puhui999:这个可以改成 activeConversationId 么?因为一般是选中的对话编号
82
+ const activeConversationId = ref (- 1 ) // 选中的会话
90
83
91
84
/** 加载会话列表 */
92
85
const getConversationList = async () => {
@@ -98,40 +91,43 @@ defineExpose({ getConversationList })
98
91
const emits = defineEmits <{
99
92
(e : ' change' , v : KeFuConversationRespVO ): void
100
93
}>()
101
- const openRightMessage = (item : KeFuConversationRespVO , index : number ) => {
102
- activeConversationIndex .value = index
94
+ const openRightMessage = (item : KeFuConversationRespVO ) => {
95
+ activeConversationId .value = item . id
103
96
emits (' change' , item )
104
97
}
105
98
106
- // TODO @puhui999:这个,是不是改成 getConversationDisplayText,获取会话的展示文本。然后,把文本消息类型,也统一处理(包括上面的 replaceEmoji)。这样,更统一。
107
99
/** 获得消息类型 */
108
- const getContentType = computed (() => (lastMessageContentType : number ) => {
109
- switch (lastMessageContentType ) {
110
- case KeFuMessageContentTypeEnum .SYSTEM :
111
- return ' [系统消息]'
112
- case KeFuMessageContentTypeEnum .VIDEO :
113
- return ' [视频消息]'
114
- case KeFuMessageContentTypeEnum .IMAGE :
115
- return ' [图片消息]'
116
- case KeFuMessageContentTypeEnum .PRODUCT :
117
- return ' [商品消息]'
118
- case KeFuMessageContentTypeEnum .ORDER :
119
- return ' [订单消息]'
120
- case KeFuMessageContentTypeEnum .VOICE :
121
- return ' [语音消息]'
122
- default :
123
- return ' '
100
+ const getConversationDisplayText = computed (
101
+ () => (lastMessageContentType : number , lastMessageContent : string ) => {
102
+ switch (lastMessageContentType ) {
103
+ case KeFuMessageContentTypeEnum .SYSTEM :
104
+ return ' [系统消息]'
105
+ case KeFuMessageContentTypeEnum .VIDEO :
106
+ return ' [视频消息]'
107
+ case KeFuMessageContentTypeEnum .IMAGE :
108
+ return ' [图片消息]'
109
+ case KeFuMessageContentTypeEnum .PRODUCT :
110
+ return ' [商品消息]'
111
+ case KeFuMessageContentTypeEnum .ORDER :
112
+ return ' [订单消息]'
113
+ case KeFuMessageContentTypeEnum .VOICE :
114
+ return ' [语音消息]'
115
+ case KeFuMessageContentTypeEnum .TEXT :
116
+ return replaceEmoji (lastMessageContent )
117
+ default :
118
+ return ' '
119
+ }
124
120
}
125
- } )
121
+ )
126
122
127
123
// ======================= 右键菜单 =======================
128
124
const showRightMenu = ref (false ) // 显示右键菜单
129
125
const rightMenuStyle = ref <any >({}) // 右键菜单 Style
130
- const selectedConversation = ref <KeFuConversationRespVO >({} as KeFuConversationRespVO ) // 右键选中的会话对象 TODO puhui999:这个是不是叫 rightClickConversation 会好点。因为 selected 容易和选中的对话,定义上有点重叠
126
+ const rightClickConversation = ref <KeFuConversationRespVO >({} as KeFuConversationRespVO ) // 右键选中的会话对象
131
127
132
128
/** 打开右键菜单 */
133
129
const rightClick = (mouseEvent : PointerEvent , item : KeFuConversationRespVO ) => {
134
- selectedConversation .value = item
130
+ rightClickConversation .value = item
135
131
// 显示右键菜单
136
132
showRightMenu .value = true
137
133
rightMenuStyle .value = {
@@ -148,7 +144,7 @@ const closeRightMenu = () => {
148
144
const updateConversationPinned = async (adminPinned : boolean ) => {
149
145
// 1. 会话置顶/取消置顶
150
146
await KeFuConversationApi .updateConversationPinned ({
151
- id: selectedConversation .value .id ,
147
+ id: rightClickConversation .value .id ,
152
148
adminPinned
153
149
})
154
150
message .notifySuccess (adminPinned ? ' 置顶成功' : ' 取消置顶成功' )
@@ -161,7 +157,7 @@ const updateConversationPinned = async (adminPinned: boolean) => {
161
157
const deleteConversation = async () => {
162
158
// 1. 删除会话
163
159
await message .confirm (' 您确定要删除该会话吗?' )
164
- await KeFuConversationApi .deleteConversation (selectedConversation .value .id )
160
+ await KeFuConversationApi .deleteConversation (rightClickConversation .value .id )
165
161
// 2. 关闭右键菜单,更新会话列表
166
162
closeRightMenu ()
167
163
await getConversationList ()
0 commit comments