// 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 () { } });