yuminge-app/yun-min-program-plugin-master/packageH/chitchat/chatList/chatList.js

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}&timestamp=${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 () {
}
});