286 lines
6.7 KiB
Vue
286 lines
6.7 KiB
Vue
<script setup lang="ts">
|
|
import { formatDate } from '@/utils/formatTime'
|
|
import { reactive } from 'vue'
|
|
import * as ConversationApi from '@/api/im/conversation'
|
|
/* route */
|
|
const route = useRoute()
|
|
/* router */
|
|
const router = useRouter()
|
|
|
|
//取好友列表(主要使用好友下的用户属性相关)
|
|
const friendList = reactive({
|
|
1: {
|
|
avatarurl: 'https://img.yzcdn.cn/vant/cat.jpeg'
|
|
}
|
|
})
|
|
//取会话数据
|
|
const conversationList = reactive([
|
|
{
|
|
conversationKey: 1,
|
|
conversationInfo: { avatarUrl: 'https://img.yzcdn.cn/vant/cat.jpeg' },
|
|
|
|
name: '好友1',
|
|
conversationType: 2,
|
|
latestMessage: {
|
|
msg: 'hello word!'
|
|
},
|
|
latestSendTime: new Date(),
|
|
unreadMessageNum: 5
|
|
}
|
|
])
|
|
// let conversationList = reactive({})
|
|
// // 获得用户的会话列表
|
|
// const getConversationList = async () => {
|
|
// const res = await ConversationApi.getConversationList()
|
|
// if (res.code === 200) {
|
|
// console.log('会话列表', res.data)
|
|
// conversationList = res.data
|
|
// }
|
|
// }
|
|
// // 初始化
|
|
// onMounted(() => {
|
|
// getConversationList()
|
|
// })
|
|
|
|
//处理会话name
|
|
const handleConversationName = computed(() => {
|
|
return ''
|
|
})
|
|
//处理lastmsg的from昵称
|
|
const handleLastMsgNickName = computed(() => {
|
|
return ''
|
|
})
|
|
const emit = defineEmits(['toChatMessage'])
|
|
//普通会话
|
|
const checkedConverItemIndex = ref(null)
|
|
const toChatMessage = (item, itemKey, index) => {
|
|
checkedConverItemIndex.value = index
|
|
console.log('选中的会话key', itemKey)
|
|
//跳转至对应的消息界面
|
|
emit('toChatMessage', itemKey, item.conversationType)
|
|
}
|
|
//删除某条会话
|
|
const deleteConversation = (itemKey) => {
|
|
console.log('选中的会话key', itemKey)
|
|
}
|
|
</script>
|
|
<template>
|
|
<el-scrollbar class="session_list" style="overflow: auto" tag="ul">
|
|
<!-- 普通会话 -->
|
|
<template v-if="Object.keys(conversationList).length > 0">
|
|
<li
|
|
v-for="(item, itemKey, index) in conversationList"
|
|
:key="itemKey"
|
|
@click="toChatMessage(item, itemKey, index)"
|
|
:style="{
|
|
background: checkedConverItemIndex === index ? '#E5E5E5' : ''
|
|
}"
|
|
>
|
|
<el-popover
|
|
popper-class="conversation_popover"
|
|
placement="right-end"
|
|
trigger="contextmenu"
|
|
:show-arrow="false"
|
|
:offset="-10"
|
|
>
|
|
<template #reference>
|
|
<div class="session_list_item">
|
|
<div class="item_body item_left">
|
|
<div class="session_other_avatar">
|
|
<el-avatar
|
|
:size="34"
|
|
:src="
|
|
friendList[item.conversationKey] && friendList[item.conversationKey].avatarurl
|
|
? friendList[item.conversationKey].avatarurl
|
|
: item.conversationInfo.avatarUrl
|
|
"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div class="item_body item_main">
|
|
<div class="name"> 好友 </div>
|
|
<div class="last_msg_body">
|
|
<span v-show="item.conversationType === 2">好友</span>
|
|
{{ item.latestMessage.msg }}
|
|
</div>
|
|
</div>
|
|
<div class="item_body item_right">
|
|
<span class="time">{{ formatDate(item.latestSendTime, 'MM/DD/HH:mm') }}</span>
|
|
<span class="unReadNum_box" v-if="item.unreadMessageNum >= 1">
|
|
<sup
|
|
class="unReadNum_count"
|
|
v-text="item.unreadMessageNum >= 99 ? '99+' : item.unreadMessageNum"
|
|
></sup>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<template #default>
|
|
<div class="session_list_delete" @click="deleteConversation(itemKey)"> 删除会话 </div>
|
|
</template>
|
|
</el-popover>
|
|
</li>
|
|
</template>
|
|
<template v-else>
|
|
<el-empty description="暂无最近会话" />
|
|
</template>
|
|
</el-scrollbar>
|
|
</template>
|
|
|
|
<style scoped lang="scss">
|
|
.session_list {
|
|
position: relative;
|
|
height: 100%;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.offline_hint {
|
|
width: 100%;
|
|
height: 30px;
|
|
text-align: center;
|
|
line-height: 30px;
|
|
color: #f35f81;
|
|
background: #fce7e8;
|
|
font-size: 7px;
|
|
|
|
.plaint_icon {
|
|
display: inline-block;
|
|
width: 15px;
|
|
height: 15px;
|
|
color: #e5e5e5;
|
|
text-align: center;
|
|
line-height: 15px;
|
|
font-size: 7px;
|
|
font-weight: bold;
|
|
background: #e6686e;
|
|
border-radius: 50%;
|
|
}
|
|
}
|
|
|
|
.session_list .session_list_item {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
height: 66px;
|
|
background: #f0f0f0;
|
|
color: var(--el-color-primary);
|
|
border-bottom: 1px solid var(--el-border-color);
|
|
cursor: pointer;
|
|
|
|
&:hover {
|
|
background: #e5e5e5;
|
|
}
|
|
|
|
.item_body {
|
|
display: flex;
|
|
height: 100%;
|
|
}
|
|
|
|
.item_left {
|
|
flex-direction: row;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin-left: 14px;
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.item_main {
|
|
width: 225px;
|
|
max-width: 225px;
|
|
height: 34px;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
align-items: flex-start;
|
|
|
|
.name {
|
|
min-width: 56px;
|
|
max-width: 180px;
|
|
height: 17px;
|
|
font-weight: 400;
|
|
font-size: 14px;
|
|
/* identical to box height */
|
|
color: #333333;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.last_msg_body {
|
|
max-width: 185px;
|
|
height: 17px;
|
|
font-weight: 400;
|
|
font-size: 12px;
|
|
line-height: 17px;
|
|
letter-spacing: 0.3px;
|
|
color: #a3a3a3;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
.last_msg_body_mention {
|
|
font-size: 12px;
|
|
line-height: 17px;
|
|
font-weight: bold;
|
|
color: red;
|
|
}
|
|
}
|
|
|
|
.item_right {
|
|
width: 25%;
|
|
height: 34px;
|
|
flex-direction: column;
|
|
align-items: flex-end;
|
|
margin-right: 10px;
|
|
|
|
.time {
|
|
font-size: 10px;
|
|
font-weight: 400;
|
|
font-size: 10px;
|
|
line-height: 14px;
|
|
letter-spacing: 0.25px;
|
|
color: #a3a3a3;
|
|
}
|
|
|
|
.unReadNum_box {
|
|
margin-top: 10px;
|
|
vertical-align: middle;
|
|
|
|
.unReadNum_count {
|
|
display: inline-block;
|
|
min-width: 20px;
|
|
height: 20px;
|
|
padding: 0 6px;
|
|
color: #fff;
|
|
font-weight: normal;
|
|
font-size: 12px;
|
|
line-height: 20px;
|
|
white-space: nowrap;
|
|
text-align: center;
|
|
background: #f5222d;
|
|
border-radius: 10px;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.session_list_item_active {
|
|
background: #d2d2d2;
|
|
}
|
|
|
|
.session_list .session_list_item + .list_item {
|
|
margin-top: 10px;
|
|
}
|
|
|
|
.session_list_delete {
|
|
cursor: pointer;
|
|
transition: all 0.5s;
|
|
|
|
&:hover {
|
|
background: #e1e1e1;
|
|
}
|
|
}
|
|
</style>
|