You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zhishifufei_php/public/kefu-assets/components/pc/chat-list/index.js

278 lines
9.8 KiB

10 months ago
define([
'kefu-assets/components/empty/index',
'kefu-assets/api/kefu',
'dayjs',
'text!./index.html',
'css!./index.css'
], function (empty, kefuApi, dayjs, template) {
return {
template,
name: "chat-list",
props: {
userOnline: {
type: Object,
default: function () {
return {}
}
},
newRecored: {
type: Object,
default: function () {
return {}
}
},
searchData: {
type: String,
default: ''
}
},
components: {
empty
},
watch: {
userOnline: {
handler(nVal, oVal) {
if (nVal.hasOwnProperty('to_uid')) {
this.userList.forEach((el, index) => {
if (el.to_uid == nVal.to_uid) {
el.online = nVal.online
if (nVal.online == 1) {
this.$Notice.info({
title: '上线通知',
desc: `${el.nickname}上线`
});
}
}
})
}
},
deep: true
},
searchData: {
handler(nVal, oVal) {
if (nVal != oVal) {
this.nickname = nVal
this.page = 1
this.isScroll = true
this.userList = []
this.isSearch = true
this.getList()
}
},
deep: true
}
},
data() {
return {
hdTabCur: 0,
hdTab: [
{
key: 0,
title: '用户列表'
},
{
key: 1,
title: '游客列表'
}
],
userList: [],
curId: '',
page: 1,
limit: 15,
isScroll: true,
nickname: '',
isSearch: false,
ops: {
vuescroll: {
mode: 'native',
enable: false,
tips: {
deactive: 'Push to Load',
active: 'Release to Load',
start: 'Loading...',
beforeDeactive: 'Load Successfully!'
},
auto: false,
autoLoadDistance: 0,
pullRefresh: {
enable: false
},
pushLoad: {
enable: true,
auto: true,
autoLoadDistance: 10
}
},
bar: {
background: '#393232',
opacity: '.5',
size: '5px'
}
},
}
},
filters: {
toDay: function (value) {
if (!value) return ''
return dayjs.unix(value).format('M月D日 HH:mm')
}
},
mounted() {
let that = this
this.$socket.then(ws => {
//用户转接
ws.$on('transfer', data => {
let status = false
that.userList.forEach((el, index, arr) => {
if (data.recored.id == el.id) {
status = true
if (data.recored.is_tourist == that.hdTabCur) {
let oldVal = data.recored
arr.splice(index, 1)
if (index == 0) {
this.$emit('set-data-id', oldVal)
oldVal.mssage_num = 0
}
arr.unshift(oldVal)
}
this.$Notice.info({
title: '您有一条转接消息!',
});
}
})
if (!status) {
if (data.recored.is_tourist == this.hdTabCur)
this.userList.unshift(data.recored)
}
})
ws.$on('mssage_num', data => {
if (data.recored.id) {
let status = false
that.userList.forEach((el, index, arr) => {
if (data.recored.id == el.id) {
status = true
if (data.recored.is_tourist == that.hdTabCur) {
let oldVal = data.recored
arr.splice(index, 1)
arr.unshift(oldVal)
}
}
})
if (!status) {
if (data.recored.is_tourist == this.hdTabCur)
this.userList.unshift(data.recored)
}
}
if (data.recored.is_tourist != this.hdTabCur && data.recored.id) {
this.$Notice.info({
title: this.hdTabCur ? '用户发来消息啦!' : '游客发来消息啦!',
});
}
});
ws.$on('chat', (data) => {
const targetId = data.is_kefu_send ? data.to_uid : data.uid;
const userRecord = this.userList.find(i => i.to_uid == targetId);
if (userRecord) {
userRecord.online = 1;
const isActiveUser = this.curId == userRecord.id;
Object.assign(userRecord, {
message: data.msn,
message_type: data.msn_type,
update_time: data.add_time,
mssage_num: isActiveUser ? 0 : userRecord.mssage_num + 1
});
if (document.hidden || !isActiveUser) {
mp3.play();
}
} else {
this.isScroll = true;
this.page = 1;
this.getList(true);
}
});
ws.$on('offline', (data) => {
if (data.self) return;
const userRecord = this.userList.find(i => i.to_uid == data.uid);
if (userRecord) {
userRecord.online = 0;
}
});
});
this.bus.$on('change', data => {
this.nickname = data
})
this.getList();
},
methods: {
//切换
changeTab(item) {
if (this.hdTabCur == item.key) return
this.hdTabCur = item.key
this.isScroll = true
this.page = 1
this.userList = []
this.$emit('change-type', item.key)
this.getList()
},
getList(forceUpdate = false) {
if (!this.isScroll) return
return kefuApi.record({
nickname: this.nickname,
page: this.page,
limit: this.limit,
is_tourist: this.hdTabCur
}).then(res => {
if (res.data.length > 0) {
res.data[0].mssage_num = 0
this.isScroll = res.data.length >= this.limit
if (forceUpdate) {
this.userList = res.data;
if (!this.curId && this.page == 1 && res.data.length > 0 && !this.isSearch) {
this.curId = res.data[0].id
this.$emit('set-data-id', res.data[0])
}
} else {
this.userList = this.userList.concat(res.data);
if (this.page == 1 && res.data.length > 0 && !this.isSearch) {
this.curId = res.data[0].id
this.$emit('set-data-id', res.data[0])
}
}
this.page++
} else {
this.$emit('set-data-id', 0)
}
})
},
chartReachBottom() {
this.getList()
},
// 选择用户
selectUser(item) {
if (this.curId == item.id) return
item.mssage_num = 0
this.curId = item.id
this.$emit('set-data-id', item)
},
handleScroll(vertical, horizontal, nativeEvent) {
if (vertical.process == 1) {
this.getList()
}
}
}
};
});