chat.js 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. import Vue from 'vue';
  2. var UNREAD_LIST_KEY = prefix('unread');
  3. const GETS_NUM = 30;
  4. import config from "../config.js";
  5. import api from "../library/index.js"
  6. import message from "../library/message.js"
  7. import action from "../library/action.js"
  8. var userid = uni.getStorageSync('access_token')
  9. var groups = uni.getStorageSync(userid + '_groups')
  10. const cache = function(key, value) {
  11. try {
  12. if (arguments.length == 1) {
  13. // console.log(key);
  14. return uni.getStorageSync(key)
  15. }
  16. if (arguments.length > 1) {
  17. if (value === null) {
  18. uni.removeStorageSync(key);
  19. } else {
  20. uni.setStorageSync(key, value);
  21. }
  22. }
  23. } catch (e) {
  24. uni.showToast({
  25. icon: 'none',
  26. title: '程序发生错误'
  27. });
  28. }
  29. };
  30. const parseDate = (str) => new Date(str.replace(/(-|年|月)/g, '/').replace('日', ''));
  31. const dateToTime = (date) => date.getTime() / 1000;
  32. const cutTimeStr = (str) => str.substr(0, 11);
  33. var system=uni.getStorageSync('system');
  34. function timestampToTime(timestamp) {
  35. var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  36. var Y = date.getFullYear();
  37. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
  38. var D = date.getDate();
  39. var h = date.getHours();
  40. var m = date.getMinutes();
  41. var s = date.getSeconds();
  42. if (D < 10) D = '0' + D;
  43. if (h < 10) h = '0' + h;
  44. if (m < 10) m = '0' + m;
  45. if (s < 10) s = '0' + s;
  46. return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s;
  47. }
  48. function setTimeShow(timestamp) {
  49. var time = timestampToTime(timestamp);
  50. var now = new Date();
  51. var Year = now.getFullYear();
  52. var month = now.getMonth() + 1;
  53. if (month < 10) month = '0' + month;
  54. var day = now.getDate();
  55. if (day < 10) day = '0' + day;
  56. var today = Year + '-' + month + '-' + day;
  57. if (time.substr(0, 10) == today) return time.substr(11, 8);
  58. if (time.substr(0, 4) == Year) return time.substr(5, 14);
  59. return time;
  60. }
  61. function prefix(id) {
  62. return uni.getStorageSync('access_token') + '_chat_' + id;
  63. }
  64. function prefixIndex(id) {
  65. return uni.getStorageSync('access_token') + prefix(id) + '_index';
  66. }
  67. function msglist_key() {
  68. return prefix('msglist');
  69. }
  70. function set_msgtop(key) {
  71. var msgtop = cache('msgtop');
  72. var istop = 0;
  73. for (var i = 0; i < msgtop.length; i++) {
  74. if ( msgtop[i]== key) {
  75. return true;
  76. }
  77. }
  78. return false;
  79. }
  80. function set_senderlist(sender) {
  81. var list = uni.getStorageSync(prefix('senderlist'));
  82. var isin = 0;
  83. if (list.length > 0) {
  84. for (var i = 0; i < list.length; i++) {
  85. if (parseInt(list[i].id) == parseInt(sender.id) && isin == 0) {
  86. list[i].nickname = sender.nickname;
  87. list[i].avatar = sender.avatar;
  88. isin = 1;
  89. }
  90. }
  91. } else var list = Array();
  92. if (isin == 0) list.push(sender);
  93. uni.setStorageSync(prefix('senderlist'), list);
  94. }
  95. function getUserInfo(msg){
  96. if(msg.id==1) return msg.group;
  97. else
  98. {
  99. return getUserInfoById(msg.id)
  100. }
  101. }
  102. function getUserInfoById(id) {
  103. if (id > 0) {
  104. var result = {
  105. id,
  106. avatar: config.imgUri + '/uploads/avatar.jpg',
  107. nickname: '未知用户',
  108. };
  109. let list = uni.getStorageSync(uni.getStorageSync('access_token') + '_frienddata');
  110. if (!list) list = [];
  111. list.forEach(v => {
  112. if (v.id == id) {
  113. result.nickname = v.nickname;
  114. if (v.avatar.indexOf('http') > -1) {
  115. } else v.avatar = config.imgUri + v.avatar
  116. result.avatar = v.avatar;
  117. }
  118. })
  119. } else {
  120. var system = uni.getStorageSync('system');
  121. var result = {
  122. id,
  123. avatar: config.imgUri + system['admin_logo'],
  124. nickname: system['admin_nickname'],
  125. };
  126. }
  127. return result;
  128. }
  129. function getGroupInfoById(msg) {
  130. var id=msg.id;
  131. var groups = uni.getStorageSync(uni.getStorageSync('access_token') + '_groups');
  132. for (var i = 0; i < groups.length; i++) {
  133. if (groups[i].id == id) {
  134. var avatar = groups[i].avatar;
  135. if (avatar !== null && avatar.indexOf('http') > -1) {
  136. } else avatar = config.imgUri + avatar
  137. var result = {
  138. id: id,
  139. avatar: avatar,
  140. nickname: groups[i].nickname,
  141. none: false
  142. };
  143. return result;
  144. }
  145. }
  146. return {
  147. id,
  148. avatar: config.imgUri + msg.avatar,
  149. nickname:msg.nickname,
  150. none: false
  151. };
  152. }
  153. function getGroupmemebrs(group_id, userid) {
  154. var members = uni.getStorageSync(group_id + '_group_members');
  155. if (!members) members = [];
  156. let result = [];
  157. members.forEach(item => {
  158. if (item.id == userid) result = item;
  159. })
  160. return result;
  161. }
  162. function get_chat_list(state, id) {
  163. var temp = cache(prefix(id)) ? cache(prefix(id)) : [];
  164. let lists = state.source[prefix(id)] || temp;
  165. return lists;
  166. }
  167. function get_chatold_list(state, id) {
  168. var temp = cache(prefix('old' + id)) ? cache(prefix('old' + id)) : [];
  169. let lists = state.source[prefix('old' + id)] || temp;
  170. return lists;
  171. }
  172. function msg_vocice(data) {
  173. if (data.msg.self != 1 && data.msg.cache_key != uni.getStorageSync('cache_key')) {
  174. var no_tip = 0;
  175. var msgnotip = uni.getStorageSync('msgnotip');
  176. if (!msgnotip) msgnotip = [];
  177. msgnotip.map(item => {
  178. if (item.storekey == data.msg.cache_key) {
  179. no_tip = 1;
  180. }
  181. })
  182. if (data.msg.message.content.type == 'remind' && data.msg.message.content.remind.id == uni.getStorageSync('access_token')) {
  183. no_tip = 0;
  184. data.msg.message.content.content = data.msg.message.content.content.replace('@{' + data.msg.message.content.remind.id + '}', '有人@我');
  185. cache('remid_' + key, data.msg);
  186. }
  187. if (no_tip == 0) {
  188. let userinfo = cache('userInfo');
  189. // console.log(userinfo);
  190. if (parseInt(userinfo.note2) != 0) uni.vibrateLong();
  191. if (parseInt(userinfo.note1) != 0) action.playVoice('/static/voice/chat.mp3');
  192. }
  193. }
  194. return data;
  195. }
  196. function httpString(str) {
  197. var reg = /(https?|http|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/g;
  198. // console.log(str);
  199. try{
  200. var s = str.match(reg);
  201. if (s != null) {
  202. return s;
  203. } else {
  204. return false;
  205. }
  206. }catch(e){
  207. return false;
  208. }
  209. }
  210. function get_senderinfo(v) {
  211. try {
  212. if (v.group_id > 0) {
  213. var mem = getGroupmemebrs(v.group_id, v.sender_id);
  214. ///console.log(mem);
  215. if (mem.id > 0) v.sender = mem;
  216. if(v.sender_id>0){
  217. var avatar = v.sender.avatar;
  218. if (avatar.indexOf('http') > -1) {
  219. } else avatar = config.imgUri + avatar
  220. var obj = {
  221. id: v.sender_id,
  222. avatar: avatar,
  223. nickname: v.sender.nickname,
  224. };
  225. }else{
  226. var result = {
  227. id,
  228. avatar: config.imgUri + system['admin_logo'],
  229. nickname: system['admin_nickname'],
  230. };
  231. }
  232. // console.log(mem);
  233. }
  234. else{
  235. if(v.sender_id>0){
  236. var avatar = v.sender.avatar;
  237. if (avatar.indexOf('http') > -1) {
  238. } else avatar = config.imgUri + avatar
  239. var obj = {
  240. id: v.sender_id,
  241. avatar: avatar,
  242. nickname: v.sender.nickname,
  243. };
  244. }else{
  245. var result = {
  246. id,
  247. avatar: config.imgUri + system['admin_logo'],
  248. nickname: system['admin_nickname'],
  249. };
  250. }
  251. }
  252. } catch (e) {
  253. var obj = getUserInfoById(v.sender_id);
  254. }
  255. return obj;
  256. }
  257. function message_format(v) {
  258. try {
  259. v.message.content = JSON.parse(v.message.content);
  260. var type = v.message.content.type;
  261. } catch (e) {
  262. //TODO handle the exception
  263. var type = v.message.content.type;
  264. }
  265. if (type == 'remind') {
  266. if ( v.message.content.remind.id == uni.getStorageSync('access_token')) {
  267. v.message.content.content = v.message.content.content.replace('@{' + v.message.content.remind.id + '}', '有人@我');
  268. }
  269. else{
  270. var mem = getGroupmemebrs(v.group_id, v.message.content.remind.id);
  271. if (mem.id==v.message.content.remind.id ) {
  272. var atname = mem.nickname;
  273. } else
  274. var atname = v.message.content.remind.nickname;
  275. v.message.content.content = v.message.content.content.replace('@{' + v.message.content.remind.id + '}', '@' +atname);
  276. }
  277. }
  278. if (v.message.type == 'text' && v.message.content.type != 'emotion') {
  279. if (type == 'remind')
  280. var content = v.message.content.content;
  281. else var content = v.message.content;
  282. var res = httpString(content);
  283. if (res != false) {
  284. v.message.type = 'url';
  285. v.message.content = {};
  286. v.message.content.content = content;
  287. v.message.content.urls = res;
  288. }
  289. }
  290. return v;
  291. }
  292. import http from "../library/http.js"
  293. export default {
  294. namespaced: true,
  295. state: {
  296. source: {},
  297. msglist: []
  298. },
  299. mutations: {
  300. /**
  301. * 从缓存里拉去消息
  302. * @param {Object} state
  303. * @param {Object} id
  304. */
  305. pull(state, id) {
  306. // console.log('pull');
  307. let key = prefix(id);
  308. let data = cache(key) || [];
  309. let indexKey = prefixIndex(id);
  310. let beforeList = state.source[key] || [];
  311. // console.log(id);
  312. if (data.length && beforeList.length == 0) {
  313. /* let _index = state.source[indexKey] === undefined ? (data.length - 1) : state.source[indexKey],
  314. list = [];
  315. for (let i = 0; i < GETS_NUM && _index >= 0 && data[_index]; _index--, i++) list.push(data[_index]);
  316. Vue.set(state.source, key, list.reverse().concat(state.source[key] || [])); //让属性具有响应式 */
  317. Vue.set(state.source, key, data.concat(state.source[key] || [])); //让属性具有响应式
  318. // state.source[indexKey] = _index;
  319. } else {
  320. // Vue.set(state.source, key, []);
  321. // state.source[indexKey] = undefined;
  322. }
  323. },
  324. /**
  325. * 推送消息到缓存
  326. * @param {Object} state
  327. * @param {Object} data
  328. */
  329. push(state, data) {
  330. let key = prefix(data.id);
  331. // console.log(data);
  332. var msg_list_key = msglist_key();
  333. var temp = cache(key) ? cache(key) : [];
  334. Vue.set(state.source, key, temp);
  335. // if(!data.msg['_mid']) data.msg['_mid'] = 'm' + Math.random().toString(36).substring(2); //生成唯一id
  336. if (data.msg.sender_id != uni.getStorageSync('access_token')) data.msg.unread = 1;
  337. else data.msg.unread = 0;
  338. var statelist = [];
  339. state.source[key].push(data.msg);
  340. // console.log(data.msg.message);
  341. if (data.msg.message.type != 'tips' || data.msg.message.msg_type == 'show') {
  342. //更新消息列表
  343. if (data.msg.isloading == 0 || data.msg.message.msg_type == 'show') {
  344. let msglist = cache(msg_list_key) || [];
  345. let msgindex = msglist.findIndex(v => v.key == key);
  346. // console.log(msgindex,key)
  347. let unreadCount = 0;
  348. if (msgindex >= 0) {
  349. let tmp = msglist.splice(msgindex, 1);
  350. unreadCount = tmp[0].msg.unread || 0;
  351. }
  352. if (data.msg.self != 1 && data.msg.cache_key != uni.getStorageSync('cache_key')) {
  353. var no_tip = 0;
  354. var msgnotip = uni.getStorageSync('msgnotip');
  355. if (!msgnotip) msgnotip = [];
  356. msgnotip.map(item => {
  357. if (item.storekey == data.msg.cache_key) {
  358. no_tip = 1;
  359. }
  360. })
  361. try {
  362. data.msg.message.content = JSON.parse(data.msg.message.content);
  363. } catch (e) {
  364. }
  365. if (data.msg.message.content.type == 'remind' && data.msg.message.content.remind.id == uni.getStorageSync('access_token')) {
  366. no_tip = 0;
  367. data.msg.message.content.content = data.msg.message.content.content.replace('@{' + data.msg.message.content.remind.id + '}', '有人@我');
  368. cache('remid_' + key, data.msg);
  369. }
  370. if (no_tip == 0) {
  371. try{
  372. let userinfo = cache('userInfo');
  373. if(parseInt(data.msg.group_id)>0){
  374. if (parseInt(userinfo.note1) != 0) action.playVoice('/static/voice/chat.mp3');
  375. if (parseInt(userinfo.note2) != 0) uni.vibrateLong();
  376. }
  377. else{
  378. if (parseInt(userinfo.note3) != 0) action.playVoice('/static/voice/friend.mp3');
  379. if (parseInt(userinfo.note4) != 0) uni.vibrateLong();
  380. }
  381. }catch(e){
  382. //TODO handle the exception
  383. }
  384. }
  385. }
  386. //console.log(data.msg);
  387. if (cache('remid_' + key)) var datamsg = cache('remid_' + key)
  388. else
  389. var datamsg = data.msg
  390. delete datamsg['receiver']
  391. msglist.push({
  392. key,
  393. msg: {
  394. ...datamsg,
  395. unread: data.msg.self ? unreadCount : unreadCount + 1,
  396. istop: set_msgtop(data.msg.cache_key)
  397. }
  398. });
  399. state.msglist = msglist;
  400. cache(msg_list_key, msglist);
  401. }
  402. // console.log(data.msg);
  403. } else {
  404. let list1 = state.source[key];
  405. var msg_id = data.msg.message.data.msg_id;
  406. //测回消息
  407. if (data.msg.message.msg_type = 'chat_back') {
  408. // #ifdef APP-PLUS
  409. /* plus.push.clear(); */
  410. // #endif
  411. var list = [];
  412. if (msg_id > 0) {
  413. var unread = 0;
  414. var tempdata = '';
  415. list1.map(item => {
  416. if (item.msg_id != msg_id) {
  417. list.push(item);
  418. if (item.message.type != 'tips') {
  419. tempdata = item;
  420. unread = unread + item.unread;
  421. }
  422. }
  423. })
  424. state.source[key] = list;
  425. let msglist = cache(msg_list_key) || [];
  426. let msgindex = msglist.findIndex(v => v.key == key);
  427. let unreadCount = 0;
  428. if (msgindex >= 0) {
  429. let tmp = msglist.splice(msgindex, 1);
  430. unreadCount = tmp[0].msg.unread || 0;
  431. }
  432. msglist.push({
  433. key,
  434. msg: {
  435. ...tempdata,
  436. unread: unread,
  437. istop: set_msgtop(key)
  438. }
  439. });
  440. state.msglist = msglist;
  441. cache(msg_list_key, msglist);
  442. }
  443. }
  444. }
  445. cache(key, state.source[key]);
  446. action.setStatusTips();
  447. },
  448. //从云端更新历史聊天记录
  449. update_message(state, data) {
  450. let key = prefix(data.id);
  451. var msg_list_key = msglist_key();
  452. var temp = cache(key) ? cache(key) : [];
  453. var listsold = get_chatold_list(state, data.id);
  454. Vue.set(state.source, key, temp);
  455. // if(!data.msg['_mid']) data.msg['_mid'] = 'm' + Math.random().toString(36).substring(2); //生成唯一id
  456. if (data.msg.sender_id != uni.getStorageSync('access_token')) data.msg.unread = 1;
  457. else data.msg.unread = 0;
  458. var statelist = temp;
  459. var isin = 0;
  460. temp.map(item => {
  461. if (parseInt(item.msg_id) == parseInt(data.msg.msg_id)) {
  462. isin = 1;
  463. }
  464. })
  465. if(isin==0){
  466. listsold.map(item => {
  467. if (parseInt(item.msg_id) == parseInt(data.msg.msg_id)) {
  468. isin = 1;
  469. }
  470. })
  471. }
  472. if (isin == 0) {
  473. statelist.push(data.msg);
  474. }
  475. state.source[key] = statelist;
  476. cache(key, state.source[key]);
  477. },
  478. //删除
  479. clearchatlist(state, msg) {
  480. var key = prefix(msg.storekey);
  481. let lists = get_chat_list(state, msg.storekey);
  482. let list = [];
  483. lists.map(item => {
  484. if (item._mid != msg._mid) {
  485. list.push(item)
  486. }
  487. })
  488. state.source[key] = list;
  489. Vue.set(state.source, key, list);
  490. uni.setStorageSync(key, list);
  491. //历史消息删除
  492. var listsold = get_chatold_list(state, msg.storekey);
  493. var listold = [];
  494. listsold.map(item => {
  495. if (item._mid != msg._mid) {
  496. listold.push(item)
  497. }
  498. })
  499. var keyold = prefix('old' + msg.storekey);
  500. uni.setStorageSync(keyold, listold);
  501. var msg_list_key = msglist_key();
  502. let msglist = cache(msg_list_key) || [];
  503. var data = [];
  504. for (var i = list.length - 1; i >= 0; i--) {
  505. if (list[i].message.type != 'tips') {
  506. data = list[i];
  507. break;
  508. }
  509. }
  510. for (var i = 0; i < msglist.length; i++) {
  511. if (msglist[i].key == key) {
  512. msglist[i].msg = {
  513. ...data,
  514. unread: 0,
  515. istop: set_msgtop(msglist[i].msg.cache_key)
  516. }
  517. }
  518. }
  519. state.msglist = msglist;
  520. uni.setStorageSync(msg_list_key, msglist);
  521. var userid = parseInt(uni.getStorageSync('access_token'));
  522. var postdata = {
  523. id: msg.msg_id,
  524. userid: userid
  525. };
  526. http.setWait(false).post('group.php?act=clearchatlist', postdata).then(res => {
  527. })
  528. },
  529. //更新历史消息记录
  530. update_msglist(state, msglist) {
  531. var msg_list_key = msglist_key();
  532. state.msglist = msglist;
  533. uni.setStorageSync(msg_list_key, msglist);
  534. },
  535. //设置
  536. setting(state, data) {
  537. cache('setting', data);
  538. if (!data.msgtop) data.msgtop = [];
  539. cache('msgtop', data.msgtop);
  540. if (!data.msgnotip) data.msgnotip = [];
  541. cache('msgnotip', data.msgnotip);
  542. var msg_key = msglist_key();
  543. var lists = uni.getStorageSync(msg_key) ? uni.getStorageSync(msg_key) : [];
  544. let list = [];
  545. let msgtop = data.msgtop;
  546. var list11 = [];
  547. lists.map(item => {
  548. item.msg.istop = set_msgtop(item.msg.cache_key);
  549. // item.msg.istop=0;
  550. // console.log()
  551. list11.push(item);
  552. })
  553. // console.log(list11);
  554. state.msglist = list11;
  555. uni.setStorageSync(msg_key, list11);
  556. },
  557. //置顶
  558. set_istop(state){
  559. var msg_key = msglist_key();
  560. var msgtop = uni.getStorageSync('msgtop')?uni.getStorageSync('msgtop'):[];
  561. var lists = uni.getStorageSync(msg_key) ? uni.getStorageSync(msg_key) : [];
  562. let list = [];
  563. var list11 = [];
  564. lists.map(item => {
  565. var istop=false;
  566. for (var i = 0; i < msgtop.length; i++) {
  567. if ( msgtop[i]== item.msg.cache_key) {
  568. istop=true;
  569. }
  570. }
  571. item.msg.istop = istop;
  572. list11.push(item);
  573. })
  574. // console.log(list11);
  575. state.msglist = list11;
  576. uni.setStorageSync(msg_key, list11);
  577. },
  578. //标记已读未读
  579. set_read(state,msg){
  580. if(msg.unread>0) var unread=0;
  581. else var unread=1;
  582. var msg_key = msglist_key();
  583. var lists = uni.getStorageSync(msg_key) ? uni.getStorageSync(msg_key) : [];
  584. let list = [];
  585. var list11 = [];
  586. lists.map(item => {
  587. if(item.msg.cache_key==msg.cache_key) item.msg.unread = unread;
  588. list11.push(item);
  589. })
  590. // console.log(list11);
  591. state.msglist = list11;
  592. uni.setStorageSync(msg_key, list11);
  593. action.setStatusTips();
  594. http.setWait(false).get('group.php?act=setReadTime3',{cache_key:msg.cache_key,userid:uni.getStorageSync('access_token'),unread:unread}).then(res=>{
  595. })
  596. },
  597. update_msglist(state,msg){
  598. var msg_key = msglist_key();
  599. state.msglist = msg;
  600. uni.setStorageSync(msg_key, msg);
  601. action.setStatusTips();
  602. },
  603. //删除消息列表
  604. delete_msglist(state, cache_key) {
  605. var msg_key = msglist_key();
  606. var lists = uni.getStorageSync(msg_key);
  607. let list = [];
  608. lists.map(item => {
  609. if (item.msg.cache_key != cache_key) list.push(item)
  610. })
  611. state.msglist = list;
  612. uni.setStorageSync(msg_key, list);
  613. cache(prefix(cache_key), '');
  614. state.source[prefix(cache_key)] = '';
  615. cache(prefix('old' + cache_key), '');
  616. console.log(cache_key);
  617. if (cache_key.indexOf('G') > -1) {
  618. var groupid = cache_key.substr(1, cache_key.length - 1);
  619. var userid = parseInt(uni.getStorageSync('access_token'));
  620. var touid = 0;
  621. var isgroup=1;
  622. } else {
  623. var touid = cache_key.substr(1, cache_key.length - 1);
  624. var userid = parseInt(uni.getStorageSync('access_token'));
  625. var groupid = 0;
  626. var isgroup=0;
  627. }
  628. http.setWait(false).post('group.php?act=delete_msglist', {
  629. groupid: groupid,
  630. userid: userid,
  631. touid: touid,
  632. isgroup:isgroup
  633. }).then(res => {
  634. // console.log(res);
  635. })
  636. action.setStatusTips();
  637. },
  638. /**
  639. * 初始化数据
  640. * @param {Object} state
  641. * @param {Object} id
  642. */
  643. init(state, id) {
  644. let indexKey = prefixIndex(id);
  645. // Vue.set(state.source, prefix(id), []);
  646. // state.source[indexKey] = undefined;
  647. uni.setStorageSync('cache_key', id);
  648. var key = prefix(id);
  649. uni.setStorageSync('remid_' + key, '');
  650. if (state.msglist.length) {
  651. //清空未读消息
  652. state.msglist.forEach(v => {
  653. // console.log(v);
  654. if (prefix(id) == v.key) v.msg.unread = 0;
  655. });
  656. var msg_list_key = msglist_key();
  657. cache(msg_list_key, state.msglist);
  658. }
  659. },
  660. /**
  661. * 清除未读标记
  662. */
  663. clearunread(state, id) {
  664. var msg_list_key = msglist_key();
  665. if (state.msglist.length) {
  666. //清空未读消息
  667. state.msglist.forEach(v => {
  668. if (prefix(id) == v.key) v.msg.unread = 0;
  669. });
  670. cache(msg_list_key, state.msglist);
  671. }
  672. // console.log({cache_key:id,userid:uni.getStorageSync('access_token')})
  673. http.setWait(false).get('group.php?act=setReadTime2',{cache_key:id,userid:uni.getStorageSync('access_token')}).then(res=>{
  674. })
  675. },
  676. /**
  677. * 清除聊天记录
  678. */
  679. clear(state) {
  680. state.source = [];
  681. state.msglist = [];
  682. },
  683. clear_message(state, key) {
  684. var msg_list_key = msglist_key();
  685. // console.log(msg_list_key);
  686. let lists = cache(msg_list_key) ? cache(msg_list_key) : [];
  687. let list = [];
  688. console.log(key);
  689. lists.map(item => {
  690. console.log(item);
  691. if (parseInt(item.msg_id) != parseInt(key)) {
  692. list.push(item)
  693. }
  694. })
  695. state.msglist = list;
  696. cache(msg_list_key, list);
  697. },
  698. receiveredpack(state, data) {
  699. let key = prefix(data.id);
  700. let list = cache(key) || [];
  701. list.forEach(v => {
  702. if (v.message.type == 'redpack' && v.message.content.id == data.redpack_id) {
  703. if (!v.message.content.hasget) v.message.content.hasget = true;
  704. }
  705. });
  706. cache(key, list);
  707. let list2 = state.source[key] || [];
  708. list2.forEach(v => {
  709. if (v.message.type == 'redpack' && v.message.content.id == data.redpack_id) {
  710. if (!v.message.content.hasget) v.message.content.hasget = true;
  711. }
  712. });
  713. },
  714. setredpackempty(state, data) {
  715. let key = prefix(data.id);
  716. let list = cache(key) || [];
  717. list.forEach(v => {
  718. if (v.message.type == 'redpack' && v.message.content.id == data.redpack_id) {
  719. if (!v.message.content.empty) v.message.content.empty = true;
  720. }
  721. });
  722. cache(key, list);
  723. let list2 = state.source[key] || [];
  724. list2.forEach(v => {
  725. if (v.message.type == 'redpack' && v.message.content.id == data.redpack_id) {
  726. if (!v.message.content.empty) v.message.content.empty = true;
  727. }
  728. });
  729. }
  730. },
  731. getters: {
  732. messagesold: (state) => (id, page) => {
  733. var shownum = 20;
  734. let tmp = [];
  735. var timeshow = 0;
  736. var timeshow1 = 0;
  737. if (page > 0) {
  738. var lists = get_chatold_list(state, id);
  739. var start = lists.length - 1;
  740. var to = start - page * shownum + 1;
  741. if (to < 0) to = 0;
  742. if (start > 0) {
  743. for (var i = start; i >= to; i--) {
  744. var v = lists[i];
  745. var obj = get_senderinfo(v);
  746. if (v.message.type != 'tips' && (parseInt(v.timestamp) - parseInt(timeshow) >= 300 ||
  747. parseInt(v.timestamp) - parseInt(timeshow1) >= 900)) {
  748. if (v.timestamp) {
  749. tmp.push({
  750. message: {
  751. type: 'tips',
  752. content: {
  753. type: 'time',
  754. text: setTimeShow(v.timestamp)
  755. }
  756. }
  757. });
  758. timeshow1 = v.timestamp;
  759. }
  760. }
  761. try {
  762. var isloading = v.isloading;
  763. } catch (e) {
  764. var isloading = 0
  765. }
  766. v = message_format(v);
  767. timeshow = v.timestamp;
  768. var array = {
  769. msgtype: 'msg',
  770. ...obj,
  771. self: v.self,
  772. message: v.message,
  773. msg_id: v.msg_id,
  774. storekey: id,
  775. _mid: v._mid,
  776. time: v.timestamp,
  777. isloading: isloading,
  778. group_id: v.group_id,
  779. }
  780. tmp.push(array);
  781. }
  782. }
  783. }
  784. // console.log(tmp.length)
  785. return tmp;
  786. },
  787. /**
  788. * 获取消息内容列表
  789. */
  790. messages: (state) => (id) => {
  791. var shownum = 15;
  792. let lists = get_chat_list(state, id);
  793. var key = prefix(id);
  794. let tmp = [];
  795. let lastTime = false;
  796. var timeshow = 0;
  797. var timeshow1 = 0;
  798. var list22 = [];
  799. var num = 0;
  800. var len = lists.length;
  801. var is_oldadd = 0;
  802. var starttime = (new Date()).getTime() / 1000 - 7 * 24 * 3600;
  803. if (len > 0 && (len > shownum) && lists[lists.length-1].isloading==1) {
  804. var lists_old = get_chatold_list(state, id);
  805. var key_old = prefix('old' + id);
  806. is_oldadd = 1;
  807. }
  808. var nowtime=(new Date().getTime())/1000;
  809. lists.map(v => {
  810. num++;
  811. if (len - num < shownum || lists[lists.length-1].isloading==0) {
  812. v.unread = 0;
  813. if (v.isloading == 1) {
  814. if (nowtime - (parseInt(v.timestamp)) > 120) v.isloading = 2;
  815. num--;
  816. }
  817. list22.push(v);
  818. var obj = get_senderinfo(v);
  819. if (v.message.type != 'tips' && (parseInt(v.timestamp) - parseInt(timeshow) >= 300 ||
  820. parseInt(v.timestamp) - parseInt(timeshow1) >= 900)) {
  821. if (v.timestamp) {
  822. tmp.push({
  823. message: {
  824. type: 'tips',
  825. content: {
  826. type: 'time',
  827. text: setTimeShow(v.timestamp)
  828. }
  829. }
  830. });
  831. timeshow1 = v.timestamp;
  832. }
  833. }
  834. try {
  835. var isloading = v.isloading;
  836. } catch (e) {
  837. var isloading = 0
  838. }
  839. v = message_format(v);
  840. timeshow = v.timestamp;
  841. var array = {
  842. msgtype: 'msg',
  843. ...obj,
  844. self: v.self,
  845. message: v.message,
  846. msg_id: v.msg_id,
  847. storekey: id,
  848. _mid: v._mid,
  849. time: v.timestamp,
  850. isloading: isloading,
  851. group_id: v.group_id
  852. }
  853. tmp.push(array);
  854. } else {
  855. //setTimeout(function(){
  856. try{
  857. var isin = 0;
  858. var to=lists_old.length-5;
  859. for(var i=lists_old.length-1;i>=to;i--){
  860. if (parseInt(lists_old[i].msg_id) == parseInt(v.msg_id)) {
  861. isin = 1;
  862. break;
  863. }
  864. }
  865. if(isin==0) {
  866. lists_old.push(v);
  867. }
  868. }catch(e){
  869. //TODO handle the exception
  870. }
  871. // },10000,lists_old,v)
  872. }
  873. });
  874. // console.log(list22.length)
  875. state.source[id] = list22;
  876. cache(key, list22);
  877. if (is_oldadd == 1) {
  878. cache(key_old, lists_old);
  879. }
  880. return tmp;
  881. },
  882. /**
  883. * 检查消息是否还有更多
  884. */
  885. checkmore: (state) => (id) => {
  886. if (state.source[prefixIndex(id)] === undefined) return false;
  887. return state.source[prefixIndex(id)] >= 0;
  888. },
  889. /**
  890. * 获取最近的聊天列表
  891. */
  892. msglist: (state) => {
  893. let tmp = [];
  894. var msg_list_key = msglist_key();
  895. let lists11 = uni.getStorageSync(msg_list_key) ? uni.getStorageSync(msg_list_key) : [];
  896. //console.log(msg_list_key,lists11.length)
  897. let lists = [];
  898. for (var i = 0; i < lists11.length; i++) {
  899. try {
  900. // console.log(lists11[i]['key'],uni.getStorageSync('access_token'));
  901. if (lists11[i]['key'].indexOf(uni.getStorageSync('access_token') + '_chat_') > -1) lists.push(
  902. lists11[i]);
  903. } catch (e) {
  904. }
  905. }
  906. Vue.set(state, 'msglist', lists);
  907. state.msglist.forEach(v => {
  908. v.msg = Object.assign(v.msg, (+v.msg.cache_key.indexOf('G') > -1) ? getGroupInfoById(v.msg) :v.msg.group);
  909. try {
  910. v.msg.message.content = JSON.parse(v.msg.message.content);
  911. } catch (e) {
  912. }
  913. if (v.msg.message.content.type == 'remind') {
  914. if(v.msg.message.content.remind.id == uni.getStorageSync('access_token')){
  915. v.msg.message.content.content = v.msg.message.content.content.replace('@{' + v.msg.message.content.remind.id + '}', "有人@我");
  916. }else{
  917. var mem = getGroupmemebrs(v.msg.group_id, v.msg.message.content.remind.id);
  918. if (mem.id==v.msg.message.content.remind.id) {
  919. var atname = mem.nickname;
  920. } else var atname = v.msg.message.content.remind.nickname;
  921. v.msg.message.content.content = v.msg.message.content.content.replace('@{' + v.msg.message.content.remind.id + '}', '@' + atname);
  922. }
  923. }
  924. // if (!v.msg.group_id) console.log(getUserInfoById(v.msg.id))
  925. if (!v.msg.none) tmp.push(v.msg);
  926. });
  927. let temp1 = [];
  928. let temp2 = [];
  929. tmp.map(item => {
  930. if (item.istop==true) temp1.push(item)
  931. else temp2.push(item)
  932. })
  933. temp1.sort((a, b) =>b.timestamp - a.timestamp);
  934. temp2.sort((a, b) => b.timestamp - a.timestamp);
  935. // tmp.sort((a, b) => b.timestamp - a.timestamp);
  936. action.setStatusTips();
  937. var res= temp1.concat(temp2);
  938. return res;
  939. }
  940. }
  941. }