479 lines
12 KiB
JavaScript
479 lines
12 KiB
JavaScript
// packageH/chitchat/chatList/chatList.js
|
|
const app = getApp();
|
|
|
|
let loopGetChatDataHandle = null;
|
|
let isLoopGetChatData = false;
|
|
let loopGetChatDataCount = 0;
|
|
let loopGetingChatData = false;
|
|
let socketInstance = null;
|
|
let websocketRequestUrl = null;
|
|
let websocketConfig = {};
|
|
let websocketReconnetCount = 0;
|
|
let websocketReconnectTimer = null;
|
|
let websocketMaxReconnetCount = 10;
|
|
let websocketConntectCheckTimer = null;
|
|
// let networkOffline = false;
|
|
// function arrayToObject(arr, arrValueKey) {
|
|
// let obj = {};
|
|
// for (let index = 0; index < arr.length; index++) {
|
|
// const element = arr[index];
|
|
// obj[element[arrValueKey]] = element;
|
|
// }
|
|
// return obj;
|
|
// }
|
|
Page({
|
|
|
|
/**
|
|
* 页面的初始数据
|
|
*/
|
|
data: {
|
|
activeTab: 0,
|
|
chatList: [],
|
|
employeeChatList: [],
|
|
listSetting: {},
|
|
|
|
isEmployee: false,
|
|
|
|
chatListPagination: {
|
|
pages: 1,
|
|
finished: false,
|
|
loading: false
|
|
},
|
|
employeeChatPagination: {
|
|
pages: 1,
|
|
finished: false,
|
|
loading: false
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
onLoad: async function (options) {
|
|
|
|
await this.getSetting();
|
|
this.getWebscoketConfig();
|
|
this.getEmployeeChatData();
|
|
await this.getChatData();
|
|
this.loopGetChatData();
|
|
wx.onNetworkStatusChange((res) => {
|
|
console.log("onNetworkStatusChange", res.isConnected);
|
|
console.log("onNetworkStatusChange", res.networkType);
|
|
});
|
|
},
|
|
|
|
swichTabTItem(evt) {
|
|
this.setData({
|
|
activeTab: evt.detail.index
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面初次渲染完成
|
|
*/
|
|
onReady: function () {
|
|
|
|
},
|
|
getWebscoketConfig() {
|
|
if (!this.data.isEmployee) {
|
|
return;
|
|
}
|
|
let urlStr = app.getNetAddresss('plugin.yun-chat.frontend.chat.get-ws-setting');
|
|
app._postNetWork({
|
|
url: urlStr,
|
|
success: (resdata) => {
|
|
let res = resdata.data;
|
|
if (res.result !== 1) return app.tips(res.msg);
|
|
websocketConfig = res.data.wss_params;
|
|
websocketRequestUrl = `${websocketConfig.host}?appId=${websocketConfig.appId}&signature=${websocketConfig.signature}&nonceStr=${websocketConfig.nonceStr}×tamp=${websocketConfig.timestamp}&clientid=${websocketConfig.clientid}&agent_id=${websocketConfig.agent_id}`;
|
|
this.socketInit();
|
|
}
|
|
});
|
|
|
|
},
|
|
getSetting() {
|
|
return new Promise((resolve, reject) => {
|
|
let urlStr = app.getNetAddresss('plugin.yun-chat.frontend.h5.chat.get-list-setting');
|
|
app._postNetWork({
|
|
url: urlStr,
|
|
success: (resdata) => {
|
|
let res = resdata.data;
|
|
if (res.result !== 1) return app.tips(res.msg);
|
|
if (res.data.employee_id > 0) {
|
|
this.setData({
|
|
isEmployee: true
|
|
});
|
|
}
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
},
|
|
|
|
socketInit() {
|
|
console.log("执行socket链接", websocketRequestUrl);
|
|
if (socketInstance === null) {
|
|
socketInstance = wx.connectSocket({
|
|
url: websocketRequestUrl
|
|
});
|
|
socketInstance.onMessage(response => {
|
|
let chatNewData = JSON.parse(response.data);
|
|
console.log(chatNewData);
|
|
if (chatNewData.uid) {
|
|
let mIndex = 0;
|
|
let employeeChatList = this.data.employeeChatList;
|
|
let chat = employeeChatList.find((item, index) => {
|
|
if (item.uid == chatNewData.uid) {
|
|
mIndex = index;
|
|
return item;
|
|
}
|
|
});
|
|
console.log(mIndex, chat);
|
|
if (chat) {
|
|
switch (chatNewData["content_type"]) {
|
|
case 0:
|
|
chat["last_chat_content"] = chatNewData["data"];
|
|
break;
|
|
case 1:
|
|
chat["last_chat_content"] = "[图片]";
|
|
break;
|
|
case 2:
|
|
chat["last_chat_content"] = "[商品]";
|
|
break;
|
|
case 3:
|
|
chat["last_chat_content"] = "[订单]";
|
|
break;
|
|
}
|
|
chat["un_read_num"]++;
|
|
chat["updated_at"] = chatNewData["time"];
|
|
employeeChatList.splice(mIndex, 1);
|
|
employeeChatList.unshift(chat);
|
|
this.setData({
|
|
employeeChatList
|
|
});
|
|
} else {
|
|
employeeChatList.unshift(chatNewData);
|
|
this.setData({
|
|
employeeChatList
|
|
});
|
|
}
|
|
}
|
|
});
|
|
socketInstance.onError(error => {
|
|
socketInstance.close();
|
|
this.socketReconnet();
|
|
socketInstance = null;
|
|
});
|
|
socketInstance.onOpen(() => {
|
|
this.checkSocketConnectState();
|
|
});
|
|
socketInstance.onClose(() => {
|
|
clearInterval(websocketConntectCheckTimer);
|
|
websocketConntectCheckTimer = null;
|
|
});
|
|
}
|
|
},
|
|
|
|
checkSocketConnectState() {
|
|
if (websocketConntectCheckTimer !== null) {
|
|
return;
|
|
}
|
|
websocketConntectCheckTimer = setInterval(() => {
|
|
if (socketInstance) {
|
|
if (socketInstance.readyState == 1) {
|
|
console.log(JSON.stringify({
|
|
type: "ping"
|
|
}));
|
|
socketInstance.send({
|
|
data: JSON.stringify({
|
|
type: "ping"
|
|
})
|
|
});
|
|
websocketReconnetCount = 0;
|
|
} else {
|
|
clearInterval(websocketConntectCheckTimer);
|
|
websocketConntectCheckTimer = null;
|
|
socketInstance.close();
|
|
this.socketReconnet();
|
|
}
|
|
} else {
|
|
clearInterval(websocketConntectCheckTimer);
|
|
websocketConntectCheckTimer = null;
|
|
}
|
|
}, 5000);
|
|
},
|
|
|
|
socketReconnet() {
|
|
if (websocketReconnectTimer !== null) {
|
|
return;
|
|
}
|
|
websocketReconnectTimer = setInterval(() => {
|
|
websocketReconnetCount++;
|
|
this.socketInit();
|
|
if (websocketReconnetCount >= websocketMaxReconnetCount) {
|
|
clearInterval(websocketReconnectTimer);
|
|
websocketReconnectTimer = null;
|
|
// VanNotify("网路连接不可用");
|
|
}
|
|
}, 5000);
|
|
},
|
|
|
|
getChatData() {
|
|
return new Promise((resolve, reject) => {
|
|
if (!isLoopGetChatData) {
|
|
if (this.data.chatListPagination.finished || this.data.chatListPagination.loading) {
|
|
return;
|
|
}
|
|
}
|
|
let pages = this.data.chatListPagination.pages;
|
|
if (isLoopGetChatData) {
|
|
pages = 1;
|
|
} else {
|
|
this.data.chatListPagination.loading = true;
|
|
}
|
|
let urlStr = app.getNetAddresss('plugin.yun-chat.frontend.h5.chat.get-list');
|
|
app._postNetWork({
|
|
url: urlStr,
|
|
data: {
|
|
page: pages
|
|
},
|
|
success: (resdata) => {
|
|
let res = resdata.data;
|
|
let {
|
|
data: {
|
|
data,
|
|
per_page,
|
|
current_page,
|
|
last_page
|
|
},
|
|
msg,
|
|
result
|
|
} = res;
|
|
this.data.chatListPagination.loading = false;
|
|
if (result !== 1) return app.tips(msg);
|
|
let chatList;
|
|
if (pages == 1) {
|
|
chatList = data;
|
|
} else {
|
|
chatList = this.data.chatList.concat(data);
|
|
}
|
|
this.setData({
|
|
chatList
|
|
});
|
|
|
|
// for (const key in data) {
|
|
// if (Object.hasOwnProperty.call(data, key)) {
|
|
// const element = data[key];
|
|
// let uid = element["has_one_employee"]["uid"];
|
|
// let target = "chatList."+uid;
|
|
// this.setData({
|
|
// [target]:element
|
|
// });
|
|
// }
|
|
// }
|
|
if (isLoopGetChatData) {
|
|
isLoopGetChatData = false;
|
|
loopGetingChatData = false;
|
|
this.data.chatListPagination.pages = 1;
|
|
} else {
|
|
if (data.length < per_page || current_page == last_page) {
|
|
this.data.chatListPagination.finished = true;
|
|
}
|
|
this.data.chatListPagination.pages++;
|
|
}
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
|
|
},
|
|
|
|
loopGetChatData() {
|
|
clearInterval(loopGetChatDataHandle);
|
|
loopGetChatDataHandle = null;
|
|
loopGetChatDataCount = 0;
|
|
if (loopGetChatDataHandle === null) {
|
|
loopGetChatDataHandle = setInterval(() => {
|
|
console.log(loopGetChatDataCount);
|
|
if (loopGetingChatData === false) {
|
|
isLoopGetChatData = true;
|
|
if (this.data.isEmployee == true) {
|
|
if (this.data.activeTab == 0) {
|
|
this.getEmployeeChatData();
|
|
} else {
|
|
this.getChatData();
|
|
}
|
|
} else {
|
|
this.getChatData();
|
|
}
|
|
loopGetChatDataCount++;
|
|
if (loopGetChatDataCount >= 100) {
|
|
clearInterval(loopGetChatDataHandle);
|
|
loopGetChatDataHandle = null;
|
|
}
|
|
}
|
|
}, 5000);
|
|
} else {
|
|
loopGetChatDataCount = 0;
|
|
}
|
|
},
|
|
|
|
getEmployeeChatData() {
|
|
if (!isLoopGetChatData) {
|
|
if (this.data.isEmployee === false || this.data.employeeChatPagination.finished || this.data.employeeChatPagination.loading) {
|
|
return;
|
|
}
|
|
}
|
|
let pages = this.data.employeeChatPagination.pages;
|
|
if (isLoopGetChatData) {
|
|
pages = 1;
|
|
} else {
|
|
this.data.employeeChatPagination.loading = true;
|
|
}
|
|
let urlStr = app.getNetAddresss('plugin.yun-chat.frontend.chat.get-list');
|
|
app._postNetWork({
|
|
url: urlStr,
|
|
data: {
|
|
page: pages
|
|
},
|
|
success: (resdata) => {
|
|
let res = resdata.data;
|
|
let {
|
|
data: {
|
|
data,
|
|
per_page,
|
|
current_page,
|
|
last_page
|
|
}
|
|
} = res;
|
|
this.data.employeeChatPagination.loading = false;
|
|
if (res.result !== 1) return app.tips(res.msg);
|
|
|
|
if (data.length < per_page || current_page == last_page) {
|
|
this.data.employeeChatPagination.finished = true;
|
|
}
|
|
let employeeChatList;
|
|
if (pages == 1) {
|
|
employeeChatList = data;
|
|
} else {
|
|
employeeChatList = this.data.employeeChatList.concat(data);
|
|
}
|
|
|
|
this.setData({
|
|
employeeChatList
|
|
});
|
|
//data = arrayToObject(data, "uid");
|
|
// for (const key in data) {
|
|
// if (Object.hasOwnProperty.call(data, key)) {
|
|
// const element = data[key];
|
|
// let uid = element["uid"];
|
|
// let target = "employeeChatList."+uid;
|
|
// this.setData({
|
|
// [target]:element
|
|
// });
|
|
// }
|
|
// }
|
|
if (isLoopGetChatData) {
|
|
isLoopGetChatData = false;
|
|
loopGetingChatData = false;
|
|
this.data.employeeChatPagination.pages = 1;
|
|
} else {
|
|
if (data.length < per_page || current_page == last_page) {
|
|
this.data.employeeChatPagination.finished = true;
|
|
}
|
|
this.data.employeeChatPagination.pages++;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
|
|
toEmployeeChat(evt) {
|
|
let item = evt.currentTarget.dataset.item;
|
|
wx.navigateTo({
|
|
url: '/packageH/chitchat/chatWindow/chatWindow?chatType=2&user_id=' + item.uid,
|
|
});
|
|
},
|
|
|
|
enterChatPage(evt) {
|
|
let item = evt.currentTarget.dataset.item;
|
|
wx.navigateTo({
|
|
url: '/packageH/chitchat/chatWindow/chatWindow?chatType=1&groupId=' + item.group_id + "&employeeId=" + item.employee_id,
|
|
});
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
* 生命周期函数--监听页面显示
|
|
*/
|
|
onShow: async function () {
|
|
let chatListPagination = {
|
|
pages: 1,
|
|
finished: false,
|
|
loading: false
|
|
};
|
|
let employeeChatPagination = {
|
|
pages: 1,
|
|
finished: false,
|
|
loading: false
|
|
};
|
|
this.setData({
|
|
chatListPagination,
|
|
employeeChatPagination
|
|
});
|
|
this.getEmployeeChatData();
|
|
await this.getChatData();
|
|
this.loopGetChatData();
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面隐藏
|
|
*/
|
|
onHide: function () {
|
|
clearInterval(loopGetChatDataHandle);
|
|
loopGetChatDataHandle = null;
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面卸载
|
|
*/
|
|
onUnload: function () {
|
|
if (socketInstance) {
|
|
socketInstance.close();
|
|
}
|
|
clearInterval(loopGetChatDataHandle);
|
|
loopGetChatDataHandle = null;
|
|
},
|
|
|
|
/**
|
|
* 页面相关事件处理函数--监听用户下拉动作
|
|
*/
|
|
onPullDownRefresh: function () {
|
|
|
|
},
|
|
|
|
/**
|
|
* 页面上拉触底事件的处理函数
|
|
*/
|
|
onReachBottom: function () {
|
|
if (this.data.isEmployee == true) {
|
|
if (this.data.activeTab == 0) {
|
|
this.getEmployeeChatData();
|
|
} else {
|
|
this.getChatData();
|
|
}
|
|
} else {
|
|
this.getChatData();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 用户点击右上角分享
|
|
*/
|
|
onShareAppMessage: function () {
|
|
|
|
}
|
|
}); |