App.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. <script>
  2. //app.js
  3. const req = require("./utils/request.js");
  4. // // #ifndef H5
  5. // let livePlayer = requirePlugin('live-player-plugin')
  6. // // #endif
  7. import _chunkArr from './hxChatSDK/utils/chunkArr';
  8. let WebIM = (wx.WebIM = require("./hxChatSDK/utils/WebIM")["default"]);
  9. let msgStorage = require("./chat/components/chat/msgstorage");
  10. let msgType = require("./chat/components/chat/msgtype");
  11. let disp = require("./hxChatSDK/utils/broadcast");
  12. let logout = false;
  13. import {
  14. onGetSilentConfig
  15. } from './chat/components/chat/pushStorage'
  16. export default {
  17. onLaunch: function(options) {
  18. // this.globalData.appInitData();
  19. this.globalData.InitUpdateManager();
  20. this.globalData.getChatList();
  21. //
  22. uni.hideTabBar();
  23. var me = this;
  24. var logs = uni.getStorageSync("logs") || [];
  25. logs.unshift(Date.now());
  26. uni.setStorageSync("logs", logs);
  27. disp.on("em.main.ready", function() {
  28. calcUnReadSpot();
  29. });
  30. disp.on("em.chatroom.leave", function() {
  31. calcUnReadSpot();
  32. });
  33. disp.on("em.chat.session.remove", function() {
  34. calcUnReadSpot();
  35. });
  36. disp.on("em.chat.audio.fileLoaded", function() {
  37. calcUnReadSpot();
  38. });
  39. disp.on("em.main.deleteFriend", function() {
  40. calcUnReadSpot();
  41. });
  42. disp.on("em.chat.audio.fileLoaded", function() {
  43. calcUnReadSpot();
  44. }); //
  45. disp.on("em.mian.profile.update", function() {
  46. me.fetchUserInfoWithLoginId()
  47. });
  48. disp.on("em.mian.friendProfile.update", function() {
  49. me.fetchFriendInfoFromServer()
  50. });
  51. WebIM.conn.listen({
  52. onOpened(message) {
  53. console.log('监听onOpened>>>>>', message);
  54. if (
  55. getCurrentRoute() == "pages/user/user" ||
  56. getCurrentRoute() == "pages/login_token/login_token"
  57. ) {
  58. me.globalData.onLoginSuccess(
  59. uni.getStorageSync("myUsername")
  60. );
  61. }
  62. },
  63. onReconnect() {
  64. uni.showToast({
  65. title: "重连中...",
  66. duration: 2000,
  67. });
  68. },
  69. onSocketConnected() {
  70. uni.showToast({
  71. title: "socket连接成功",
  72. duration: 2000,
  73. });
  74. },
  75. onClosed() {
  76. // uni.showToast({
  77. // title: "退出登录",
  78. // icon: "none",
  79. // duration: 2000,
  80. // });
  81. console.log('>>>>>>>>>>>IM被退出登录>>>>>>>>>>>>>>>>>')
  82. // uni.redirectTo({
  83. // url: "../login/login",
  84. // });
  85. me.globalData.conn.closed = true;
  86. WebIM.conn.close();
  87. },
  88. onInviteMessage(message) {
  89. me.globalData.saveGroupInvitedList.push(message);
  90. disp.fire("em.invite.joingroup", message);
  91. },
  92. onReadMessage(message) {
  93. //console.log('已读', message)
  94. },
  95. //onPresence为旧版 ,建议参考最新增删好友api文档 :http://docs-im.easemob.com/im/web/basics/buddy
  96. onPresence(message) {
  97. switch (message.type) {
  98. case "unsubscribe":
  99. break;
  100. // 好友邀请列表
  101. case "subscribe":
  102. for (let i = 0; i < me.globalData.saveFriendList.length; i++) {
  103. if (me.globalData.saveFriendList[i].from === message.from) {
  104. me.globalData.saveFriendList[i] = message;
  105. disp.fire("em.subscribe");
  106. return;
  107. }
  108. }
  109. msgStorage.saveReceiveMsg(message, "INFORM"); //存添加好友消息,方便展示通知
  110. me.globalData.saveFriendList.push(message);
  111. disp.fire("em.subscribe");
  112. break;
  113. case "subscribed":
  114. uni.showToast({
  115. title: "添加成功",
  116. duration: 1000,
  117. });
  118. disp.fire("em.subscribed");
  119. break;
  120. case "unsubscribed":
  121. disp.fire("em.unsubscribed", message);
  122. break;
  123. case "direct_joined":
  124. saveGroups();
  125. uni.showToast({
  126. title: "已进群",
  127. duration: 1000,
  128. });
  129. break;
  130. case "memberJoinPublicGroupSuccess":
  131. saveGroups();
  132. uni.showToast({
  133. title: "已进群",
  134. duration: 1000,
  135. });
  136. break;
  137. case "invite":
  138. // 防止重复添加
  139. for (
  140. let i = 0; i < me.globalData.saveGroupInvitedList.length; i++
  141. ) {
  142. if (me.globalData.saveGroupInvitedList[i].from === message.from) {
  143. me.globalData.saveGroupInvitedList[i] = message;
  144. disp.fire("em.invite.joingroup");
  145. return;
  146. }
  147. }
  148. me.globalData.saveGroupInvitedList.push(message);
  149. msgStorage.saveReceiveMsg(message, "INFORM"); //存添加好友消息,方便展示通知
  150. disp.fire("em.invite.joingroup");
  151. break;
  152. case "unavailable":
  153. disp.fire("em.contacts.remove");
  154. disp.fire("em.group.leaveGroup", message);
  155. break;
  156. case "deleteGroupChat":
  157. disp.fire("em.invite.deleteGroup", message);
  158. break;
  159. case "leaveGroup":
  160. disp.fire("em.group.leaveGroup", message);
  161. break;
  162. case "removedFromGroup":
  163. disp.fire("em.group.leaveGroup", message);
  164. break;
  165. default:
  166. break;
  167. }
  168. },
  169. onRoster(message) {},
  170. onVideoMessage(message) {
  171. console.log("onVideoMessage: ", message);
  172. if (message) {
  173. msgStorage.saveReceiveMsg(message, msgType.VIDEO);
  174. }
  175. calcUnReadSpot(message);
  176. ack(message);
  177. onGetSilentConfig(message);
  178. },
  179. onAudioMessage(message) {
  180. console.log("onAudioMessage", message);
  181. if (message) {
  182. if (onMessageError(message)) {
  183. msgStorage.saveReceiveMsg(message, msgType.AUDIO);
  184. }
  185. calcUnReadSpot(message);
  186. ack(message);
  187. onGetSilentConfig(message);
  188. }
  189. },
  190. onCmdMessage(message) {
  191. console.log("onCmdMessage", message);
  192. if (message) {
  193. if (onMessageError(message)) {
  194. msgStorage.saveReceiveMsg(message, msgType.CMD);
  195. }
  196. calcUnReadSpot(message);
  197. ack(message);
  198. onGetSilentConfig(message);
  199. }
  200. },
  201. onTextMessage(message) {
  202. console.log("onTextMessage", message);
  203. if (message) {
  204. if (onMessageError(message)) {
  205. msgStorage.saveReceiveMsg(message, msgType.TEXT);
  206. }
  207. calcUnReadSpot(message);
  208. ack(message);
  209. onGetSilentConfig(message);
  210. }
  211. },
  212. onEmojiMessage(message) {
  213. console.log("onEmojiMessage", message);
  214. if (message) {
  215. if (onMessageError(message)) {
  216. msgStorage.saveReceiveMsg(message, msgType.EMOJI);
  217. }
  218. calcUnReadSpot(message);
  219. ack(message);
  220. onGetSilentConfig(message);
  221. }
  222. },
  223. onPictureMessage(message) {
  224. console.log("onPictureMessage", message);
  225. if (message) {
  226. if (onMessageError(message)) {
  227. msgStorage.saveReceiveMsg(message, msgType.IMAGE);
  228. }
  229. calcUnReadSpot(message);
  230. ack(message);
  231. onGetSilentConfig(message);
  232. }
  233. },
  234. onFileMessage(message) {
  235. console.log("onFileMessage", message);
  236. if (message) {
  237. if (onMessageError(message)) {
  238. msgStorage.saveReceiveMsg(message, msgType.FILE);
  239. }
  240. calcUnReadSpot(message);
  241. ack(message);
  242. onGetSilentConfig(message);
  243. }
  244. },
  245. // 各种异常
  246. onError(error) {
  247. console.log(error); // 16: server-side close the websocket connection
  248. if (error.type == WebIM.statusCode.WEBIM_CONNCTION_OPEN_ERROR) {
  249. uni.hideLoading();
  250. disp.fire("em.error.passwordErr");
  251. }
  252. if (error.type == WebIM.statusCode.WEBIM_CONNCTION_AUTH_ERROR) {
  253. uni.hideLoading();
  254. disp.fire("em.error.tokenErr");
  255. }
  256. if (error.type == "socket_error") {
  257. ///sendMsgError
  258. console.log("socket_errorsocket_error", error);
  259. uni.showToast({
  260. title: "网络已断开",
  261. icon: "none",
  262. duration: 2000,
  263. });
  264. disp.fire("em.error.sendMsgErr", error);
  265. }
  266. },
  267. });
  268. this.globalData.checkIsIPhoneX();
  269. },
  270. onShow(options) {
  271. let scene = options.scene;
  272. req.setStorage('scene', scene)
  273. this.globalData.getVideoScene();
  274. },
  275. globalData: {
  276. phoneNumber: '',
  277. unReadMessageNum: 0,
  278. userInfo: null,
  279. userInfoFromServer: null, //用户属性从环信服务器获取
  280. friendUserInfoMap: new Map(), //好友属性
  281. saveFriendList: [],
  282. saveGroupInvitedList: [],
  283. isIPX: false, //是否为iphone X
  284. conn: {
  285. closed: false,
  286. curOpenOpt: {},
  287. open(opt) {
  288. // uni.showLoading({
  289. // title: "加载中...",
  290. // mask: true,
  291. // });
  292. this.curOpenOpt = opt;
  293. WebIM.conn.open(opt).then(() => {
  294. //token获取成功,即可开始请求用户属性。
  295. disp.fire("em.mian.profile.update");
  296. disp.fire("em.mian.friendProfile.update");
  297. console.log('>>>>>token成功')
  298. }).catch((err) => {
  299. console.log('>>>>>token获取失败', err)
  300. });
  301. this.closed = false;
  302. },
  303. reopen() {
  304. if (this.closed) {
  305. //this.open(this.curOpenOpt);
  306. WebIM.conn.open(this.curOpenOpt);
  307. this.closed = false;
  308. }
  309. },
  310. },
  311. onLoginSuccess: function(myName) {
  312. // uni.hideLoading();
  313. uni.navigateTo({
  314. url: "/chat/conversation/conversation?myName=" + myName,
  315. });
  316. },
  317. getUserInfo(cb) {
  318. var me = this;
  319. if (this.userInfo) {
  320. typeof cb == "function" && cb(this.userInfo);
  321. } else {
  322. // 调用登录接口
  323. uni.login({
  324. success() {
  325. uni.getUserInfo({
  326. success(res) {
  327. me.userInfo = res.userInfo;
  328. typeof cb == "function" && cb(me.userInfo);
  329. },
  330. });
  331. },
  332. });
  333. }
  334. },
  335. checkIsIPhoneX: function() {
  336. const me = this;
  337. uni.getSystemInfo({
  338. success: function(res) {
  339. // 根据 model 进行判断
  340. if (res.model && res.model.search("iPhone X") != -1) {
  341. me.isIPX = true;
  342. }
  343. },
  344. });
  345. },
  346. //获取客服配置
  347. getChatList() {
  348. req.getRequest('/api/customer/list', {}, res => {
  349. req.setStorage('chatService', res);
  350. });
  351. },
  352. appInitData() {
  353. var getSysInfo = uni.getSystemInfoSync();
  354. this.isIPhone = getSysInfo.model.indexOf("iPhone") != -1;
  355. this.isIPhoneX = getSysInfo.model.indexOf("iPhone X") != -1 || getSysInfo.model.indexOf("iPhone 11") != -
  356. 1; // 是否为全面屏
  357. this.isFullScreen = getSysInfo.screenHeight / getSysInfo.screenWidth >= 2.1; // iPhoneX底部空白高度为68,全面屏为20
  358. this.bottomBlankHeignt = this.isIPhoneX ? 68 : this.isFullScreen ? 10 : 0;
  359. this.height = getSysInfo.statusBarHeight;
  360. this.screenHeight = getSysInfo.screenHeight;
  361. },
  362. getVideoScene() {
  363. let scene = req.getStorage('scene');
  364. let arr = [1195, 1193, 1191, 1184, 1177, 1176, 1175, 1201, 1216, 10001]
  365. req.setStorage('isVideoScene', false)
  366. arr.some(it => {
  367. if (it === scene) {
  368. req.setStorage('isVideoScene', true)
  369. }
  370. })
  371. console.log('isVideoScene==', req.getStorage('isVideoScene'))
  372. },
  373. InitUpdateManager() {
  374. const updateManager = uni.getUpdateManager();
  375. let that = this;
  376. updateManager.onCheckForUpdate(function(res) {
  377. // 请求完新版本信息的回调
  378. console.log(res.hasUpdate);
  379. });
  380. updateManager.onUpdateReady(function() {
  381. uni.showModal({
  382. title: '更新提示',
  383. content: '新版本已经准备好,是否重启应用?',
  384. success: function(res) {
  385. if (res.confirm) {
  386. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  387. uni.clearStorage({
  388. success() {
  389. updateManager.applyUpdate();
  390. }
  391. });
  392. }
  393. }
  394. });
  395. });
  396. updateManager.onUpdateFailed(function() { // 新版本下载失败
  397. });
  398. },
  399. getCheckSessoin(success) {
  400. // var sessionKey = req.getStorage('SESSION_KEY');
  401. // let that = this;
  402. // wx.checkSession({
  403. // success() {
  404. // if (!sessionKey) {
  405. // that.getSessionKey(success);
  406. // } else {
  407. // success.call(this, sessionKey);
  408. // }
  409. // },
  410. // fail() {
  411. // that.getSessionKey(success);
  412. // }
  413. // })
  414. this.getSessionKey(success);
  415. },
  416. getSessionKey(success) {
  417. let that = this;
  418. uni.login({
  419. success(res) {
  420. req.postRequest('/api/code', {
  421. code: res.code
  422. }, data => {
  423. that.SESSION_KEY = data.session_key;
  424. req.setStorage('SESSION_KEY', data.session_key);
  425. success.call(this, data);
  426. }, true);
  427. }
  428. });
  429. },
  430. userInfo: null,
  431. height: 0,
  432. isredenvelopes: true,
  433. isLayerAd: true,
  434. /**
  435. * 打开新页面
  436. */
  437. openPage(e) {
  438. let url
  439. if (e.indexOf("plugin-private:") != -1) {
  440. url = `${e}`
  441. } else {
  442. url = `/${e}`
  443. }
  444. uni.navigateTo({
  445. // url: `/${e}`
  446. url: url
  447. });
  448. // uni.navigateTo({
  449. // url: `/${e}`
  450. // });
  451. },
  452. /**
  453. *
  454. * 关闭当前页面,跳转到应用内的某个页面。
  455. */
  456. redirectTab(path) {
  457. uni.redirectTo({
  458. url: `/${path}`
  459. });
  460. },
  461. /**
  462. *
  463. * 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
  464. */
  465. switchTab(path) {
  466. uni.switchTab({
  467. url: `/${path}`
  468. });
  469. },
  470. /**
  471. *
  472. * 关闭所有页面,打开到应用内的某个页面
  473. */
  474. reLaunchTo(path) {
  475. uni.reLaunch({
  476. url: `/${path}`
  477. });
  478. },
  479. /**
  480. *
  481. * 保留当前页面,跳转到应用内的某个页面
  482. */
  483. navigateTo(path) {
  484. uni.navigateTo({
  485. url: `/${path}`
  486. });
  487. }
  488. },
  489. methods: {
  490. async fetchUserInfoWithLoginId() {
  491. const userId = await uni.WebIM.conn.user;
  492. if (userId) {
  493. try {
  494. const {
  495. data
  496. } = await uni.WebIM.conn.fetchUserInfoById(userId)
  497. this.globalData.userInfoFromServer = Object.assign({}, data[userId]);
  498. } catch (error) {
  499. console.log(error)
  500. uni.showToast({
  501. title: "用户属性获取失败",
  502. icon: "none",
  503. duration: 2000,
  504. })
  505. }
  506. }
  507. },
  508. async fetchFriendInfoFromServer() {
  509. let friendList = []
  510. try {
  511. const res = await uni.WebIM.conn.getContacts()
  512. friendList = Object.assign([], res?.data)
  513. if (friendList.length && friendList.length < 99) {
  514. const {
  515. data
  516. } = await uni.WebIM.conn.fetchUserInfoById(friendList)
  517. this.setFriendUserInfotoMap(data)
  518. } else {
  519. let newArr = _chunkArr(friendList, 99)
  520. for (let i = 0; i < newArr.length; i++) {
  521. const {
  522. data
  523. } = await uni.WebIM.conn.fetchUserInfoById(newArr[i])
  524. this.setFriendUserInfotoMap(data)
  525. }
  526. }
  527. } catch (error) {
  528. console.log(error)
  529. uni.showToast({
  530. title: "用户属性获取失败",
  531. icon: "none"
  532. })
  533. }
  534. },
  535. setFriendUserInfotoMap(data) {
  536. if (Object.keys(data).length) {
  537. for (const key in data) {
  538. if (Object.hasOwnProperty.call(data, key)) {
  539. const values = data[key];
  540. Object.values(values).length && this.globalData.friendUserInfoMap.set(key, values);
  541. }
  542. }
  543. }
  544. }
  545. }
  546. };
  547. /*--------环信SDK消息-----------------------*/
  548. function ack(receiveMsg) {
  549. // 处理未读消息回执
  550. var bodyId = receiveMsg.id; // 需要发送已读回执的消息id
  551. var ackMsg = new WebIM.message("read", WebIM.conn.getUniqueId());
  552. ackMsg.set({
  553. id: bodyId,
  554. to: receiveMsg.from,
  555. });
  556. WebIM.conn.send(ackMsg.body);
  557. }
  558. function onMessageError(err) {
  559. if (err.type === "error") {
  560. uni.showToast({
  561. title: err.errorText,
  562. });
  563. return false;
  564. }
  565. return true;
  566. }
  567. function getCurrentRoute() {
  568. let pages = getCurrentPages();
  569. if (pages.length > 0) {
  570. let currentPage = pages[pages.length - 1];
  571. return currentPage.route;
  572. }
  573. return "/";
  574. }
  575. // 包含陌生人版本
  576. //该方法用以计算本地存储消息的未读总数。
  577. function calcUnReadSpot(message) {
  578. let myName = uni.getStorageSync("myUsername");
  579. let pushObj = uni.getStorageSync("pushStorageData")
  580. let pushAry = pushObj[myName] || []
  581. uni.getStorageInfo({
  582. success: function(res) {
  583. let storageKeys = res.keys;
  584. let newChatMsgKeys = [];
  585. let historyChatMsgKeys = [];
  586. storageKeys.forEach((item) => {
  587. if (item.indexOf(myName) > -1 && item.indexOf("rendered_") == -1 && item.indexOf(
  588. "imUserInfo_") == -1) {
  589. newChatMsgKeys.push(item);
  590. }
  591. });
  592. console.log('newChatMsgKeys》》》》》', newChatMsgKeys);
  593. let count = newChatMsgKeys.reduce(function(result, curMember, idx) {
  594. let newName = curMember.split(myName)[0]
  595. let chatMsgs;
  596. chatMsgs = uni.getStorageSync(curMember) || [];
  597. console.log('chatMsgs>>>>>', chatMsgs);
  598. //过滤消息来源与当前登录ID一致的消息,不计入总数中。
  599. chatMsgs = chatMsgs.filter((msg) => msg.yourname !== myName);
  600. if (pushAry.includes(newName)) return result
  601. return result + chatMsgs.length;
  602. }, 0);
  603. getApp().globalData.unReadMessageNum = count;
  604. disp.fire("em.unreadspot", message);
  605. },
  606. });
  607. }
  608. function saveGroups() {
  609. var me = this;
  610. return WebIM.conn.getGroup({
  611. limit: 50,
  612. success: function(res) {
  613. uni.setStorage({
  614. key: "listGroup",
  615. data: res.data,
  616. });
  617. },
  618. error: function(err) {
  619. console.log(err);
  620. },
  621. });
  622. }
  623. </script>
  624. <style>
  625. @import "./app.css";
  626. </style>