imCommon.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. import store from "@/store";
  2. import {
  3. CustomType,
  4. GroupSystemMessageTypes,
  5. AddFriendQrCodePrefix,
  6. AddGroupQrCodePrefix,
  7. } from "@/pages_im/constant";
  8. import {
  9. subUserOnlineStatus
  10. } from "../api/imApi";
  11. import IMSDK, {
  12. GroupAtType,
  13. MessageType,
  14. SessionType,
  15. } from "openim-uniapp-polyfill";
  16. import dayjs from "dayjs";
  17. import {
  18. isThisYear
  19. } from "date-fns";
  20. import calendar from "dayjs/plugin/calendar";
  21. import relativeTime from "dayjs/plugin/relativeTime";
  22. import updateLocale from "dayjs/plugin/updateLocale";
  23. import "dayjs/locale/zh-cn";
  24. dayjs.extend(calendar);
  25. dayjs.extend(relativeTime);
  26. dayjs.extend(updateLocale);
  27. dayjs.locale("zh-cn");
  28. dayjs.updateLocale("en", {
  29. calendar: {
  30. sameElse: "YYYY-MM-DD",
  31. },
  32. });
  33. dayjs.updateLocale("zh-cn", {
  34. calendar: {
  35. sameDay: "HH:mm",
  36. nextDay: "[明天]",
  37. nextWeek: "dddd",
  38. lastDay: "[昨天] HH:mm",
  39. lastWeek: "dddd HH:mm",
  40. sameElse: "YYYY年M月D日 HH:mm",
  41. },
  42. });
  43. export const formatMessageTime = (timestemp, keepSameYear = false) => {
  44. if (!timestemp) return "";
  45. const isRecent = dayjs().diff(timestemp, "day") < 7;
  46. const keepYear = keepSameYear || !isThisYear(timestemp);
  47. if (!isRecent && !keepYear) {
  48. return dayjs(timestemp).format("M月D日 HH:mm");
  49. }
  50. return dayjs(timestemp).calendar();
  51. };
  52. export const formatHyperlink = (nickname, currentUserID) => {
  53. return `<a href="${currentUserID}" style="color:#0089FF; text-decoration:none;">${nickname}</a>`;
  54. };
  55. const regex = /\b(http[s]?:\/\/[^\s]+)\b/g;
  56. export const parseLink = (content) =>
  57. content.replace(regex, (match) => formatHyperlink(match, match));
  58. const nomalTypes = [GroupAtType.AtAll, GroupAtType.AtAllAtMe, GroupAtType.AtMe];
  59. export const conversationSort = (conversationList) => {
  60. const arr = [];
  61. const filterArr = conversationList.filter(
  62. (c) => !arr.includes(c.conversationID) && arr.push(c.conversationID),
  63. );
  64. filterArr.sort((a, b) => {
  65. if (a.isPinned === b.isPinned) {
  66. const aCompare =
  67. a.draftTextTime > a.latestMsgSendTime ?
  68. a.draftTextTime :
  69. a.latestMsgSendTime;
  70. const bCompare =
  71. b.draftTextTime > b.latestMsgSendTime ?
  72. b.draftTextTime :
  73. b.latestMsgSendTime;
  74. if (aCompare > bCompare) {
  75. return -1;
  76. } else if (aCompare < bCompare) {
  77. return 1;
  78. } else {
  79. return 0;
  80. }
  81. } else if (a.isPinned && !b.isPinned) {
  82. return -1;
  83. } else {
  84. return 1;
  85. }
  86. });
  87. return filterArr;
  88. };
  89. export const parseAt = (atel, isParse = false) => {
  90. let mstr = atel.text;
  91. const pattern = /@\S+\s/g;
  92. const arr = mstr.match(pattern);
  93. const atUsersInfo = atel.atUsersInfo ?? [];
  94. arr?.map((match) => {
  95. const member = atUsersInfo.find(
  96. (user) => user.atUserID === match.slice(1, -1),
  97. );
  98. if (member && !isParse) {
  99. // mstr = mstr.replace(match, `<text class='parsed_at_el'> @${member.groupNickname}&nbsp;</text>`);
  100. // mstr = mstr.replace(match, `<a href="${member.atUserID}" style="color:#0089FF;text-decoration:none;">@${member.groupNickname}</a> `);
  101. mstr = mstr.replace(
  102. match,
  103. formatHyperlink(`@${member.groupNickname} `, member.atUserID),
  104. );
  105. } else {
  106. // mstr = mstr.replace(match, `<text class='parsed_at_el'> ${match}</text>`);
  107. mstr = mstr.replace(match, `@${member.groupNickname} `);
  108. }
  109. });
  110. return mstr;
  111. };
  112. const switchCustomMsg = (cMsg) => {
  113. switch (cMsg.customType) {
  114. case CustomType.MassMsg:
  115. return "[群发通知]";
  116. case CustomType.Call:
  117. return "[通话消息]";
  118. case CustomType.MeetingInvitation:
  119. return "[会议邀请]";
  120. default:
  121. return "";
  122. }
  123. };
  124. const switchCustomSysMsg = (payload) => {
  125. console.log("qxj data:"+payload.data);
  126. switch (payload.data) {
  127. case "startInquiry":
  128. return "[开始问诊]";
  129. case "startFollow":
  130. return "[开始随访]";
  131. case "finishInquiry":
  132. return "[结束问诊]";
  133. case "finishFollow":
  134. return "[结束随访]";
  135. case "order":
  136. return "[问诊订单]";
  137. case "prescribe":
  138. return "[电子处方单]";
  139. case "report":
  140. return "[问诊报告单]";
  141. case "follow":
  142. return "[随访单]";
  143. case "drugReport":
  144. return "[用药报告单]";
  145. case "package":
  146. return "[疗法消息]";
  147. case "course":
  148. return "[看课消息]";
  149. default:
  150. return "[自定义消息]";
  151. }
  152. };
  153. export const sec2Time = (seconds) => {
  154. var theTime1 = 0; // min
  155. var theTime2 = 0; // hour
  156. var theTime3 = 0; // day
  157. if (seconds > 60) {
  158. theTime1 = parseInt(seconds / 60);
  159. seconds = parseInt(seconds % 60);
  160. if (theTime1 > 60) {
  161. theTime2 = parseInt(theTime1 / 60);
  162. theTime1 = parseInt(theTime1 % 60);
  163. if (theTime2 > 24) {
  164. theTime3 = parseInt(theTime2 / 24);
  165. theTime2 = parseInt(theTime2 % 24);
  166. }
  167. }
  168. }
  169. var result = "";
  170. if (seconds > 0) {
  171. result = "" + parseInt(seconds) + "秒";
  172. }
  173. if (theTime1 > 0) {
  174. result = "" + parseInt(theTime1) + "分钟" + result;
  175. }
  176. if (theTime2 > 0) {
  177. result = "" + parseInt(theTime2) + "小时" + result;
  178. }
  179. if (theTime3 > 0) {
  180. result = "" + parseInt(theTime3) + "天" + result;
  181. }
  182. return result;
  183. };
  184. export const parseMessageByType = (pmsg) => {
  185. const isSelf = (id) => id === store.getters.storeCurrentUserID;
  186. const getName = (user) => {
  187. return user.userID === store.getters.storeCurrentUserID ?
  188. "你" :
  189. user.nickname;
  190. };
  191. switch (pmsg.contentType) {
  192. case MessageType.TextMessage:
  193. return pmsg.textElem.content;
  194. case MessageType.AtTextMessage:
  195. return parseAt(pmsg.atTextElem, true);
  196. case MessageType.PictureMessage:
  197. return `[图片]`;
  198. case MessageType.VideoMessage:
  199. return `[视频]`;
  200. case MessageType.VoiceMessage:
  201. return `[语音]`;
  202. case MessageType.LocationMessage:
  203. return `[位置]`;
  204. case MessageType.CardMessage:
  205. return `[名片]`;
  206. case MessageType.MergeMessage:
  207. return `[聊天记录]`;
  208. case MessageType.FileMessage:
  209. return pmsg.fileElem.fileName;
  210. case MessageType.RevokeMessage:
  211. const data = JSON.parse(pmsg.notificationElem.detail);
  212. const revoker = isSelf(data.revokerID) ? "你" : data.revokerNickname;
  213. const sourcer = isSelf(data.sourceMessageSendID) ?
  214. "你" :
  215. data.sourceMessageSenderNickname;
  216. const isAdminRevoke = data.revokerID !== data.sourceMessageSendID;
  217. if (isAdminRevoke) {
  218. return `${revoker}撤回了一条${sourcer}的消息`;
  219. }
  220. return `${revoker}撤回了一条消息`;
  221. case MessageType.CustomMessage:
  222. const customEl = pmsg.customElem;
  223. const customData = JSON.parse(customEl.data);
  224. if (customData.customType) {
  225. return `${switchCustomMsg(customData)}`;
  226. }
  227. return `${switchCustomSysMsg(customData.payload)}`;
  228. case MessageType.QuoteMessage:
  229. return pmsg.quoteElem.text;
  230. case MessageType.FaceMessage:
  231. return `[表情]`;
  232. case MessageType.FriendAdded:
  233. return "你们已经是好友了,开始聊天吧~";
  234. case MessageType.MemberEnter:
  235. const enterDetails = JSON.parse(pmsg.notificationElem.detail);
  236. const enterUser = enterDetails.entrantUser;
  237. return `${getName(enterUser)}进入了群聊`;
  238. case MessageType.GroupCreated:
  239. const groupCreatedDetail = JSON.parse(pmsg.notificationElem.detail);
  240. const groupCreatedUser = groupCreatedDetail.opUser;
  241. return `${getName(groupCreatedUser)}创建了群聊`;
  242. case MessageType.MemberInvited:
  243. const inviteDetails = JSON.parse(pmsg.notificationElem.detail);
  244. const inviteOpUser = inviteDetails.opUser;
  245. const invitedUserList = inviteDetails.invitedUserList ?? [];
  246. let inviteStr = "";
  247. invitedUserList.find(
  248. (user, idx) => (inviteStr += getName(user) + "、") && idx > 3,
  249. );
  250. inviteStr = inviteStr.slice(0, -1);
  251. return `${getName(inviteOpUser)}邀请了${inviteStr}${
  252. invitedUserList.length > 3 ? "..." : ""
  253. }进入群聊`;
  254. case MessageType.MemberKicked:
  255. const kickDetails = JSON.parse(pmsg.notificationElem.detail);
  256. const kickOpUser = kickDetails.opUser;
  257. const kickdUserList = kickDetails.kickedUserList ?? [];
  258. let kickStr = "";
  259. kickdUserList.find(
  260. (user, idx) => (kickStr += getName(user) + "、") && idx > 3,
  261. );
  262. kickStr = kickStr.slice(0, -1);
  263. return `${getName(kickOpUser)}踢出了${kickStr}${
  264. kickdUserList.length > 3 ? "..." : ""
  265. }`;
  266. case MessageType.MemberQuit:
  267. const quitDetails = JSON.parse(pmsg.notificationElem.detail);
  268. const quitUser = quitDetails.quitUser;
  269. return `${getName(quitUser)}退出了群聊`;
  270. case MessageType.GroupInfoUpdated:
  271. const groupUpdateDetail = JSON.parse(pmsg.notificationElem.detail);
  272. const groupUpdateUser = groupUpdateDetail.opUser;
  273. let updateFiled = "群设置";
  274. if (groupUpdateDetail.group.notification) {
  275. updateFiled = "群公告";
  276. }
  277. if (groupUpdateDetail.group.groupName) {
  278. updateFiled = `群名称为 ${groupUpdateDetail.group.groupName}`;
  279. }
  280. if (groupUpdateDetail.group.faceURL) {
  281. updateFiled = "群头像";
  282. }
  283. if (groupUpdateDetail.group.introduction) {
  284. updateFiled = "群介绍";
  285. }
  286. return `${getName(groupUpdateUser)}修改了${updateFiled}`;
  287. case MessageType.GroupOwnerTransferred:
  288. const transferDetails = JSON.parse(pmsg.notificationElem.detail);
  289. const transferOpUser = transferDetails.opUser;
  290. const newOwner = transferDetails.newGroupOwner;
  291. return `${getName(transferOpUser)}将群主转让给${getName(newOwner)}`;
  292. case MessageType.GroupDismissed:
  293. const dismissDetails = JSON.parse(pmsg.notificationElem.detail);
  294. const dismissUser = dismissDetails.opUser;
  295. return `${getName(dismissUser)}解散了群聊`;
  296. case MessageType.GroupMuted:
  297. const GROUPMUTEDDetails = JSON.parse(pmsg.notificationElem.detail);
  298. const groupMuteOpUser = GROUPMUTEDDetails.opUser;
  299. return `${getName(groupMuteOpUser)}开启了全体禁言`;
  300. case MessageType.GroupCancelMuted:
  301. const GROUPCANCELMUTEDDetails = JSON.parse(pmsg.notificationElem.detail);
  302. const groupCancelMuteOpUser = GROUPCANCELMUTEDDetails.opUser;
  303. return `${getName(groupCancelMuteOpUser)}取消了全体禁言`;
  304. case MessageType.GroupMemberMuted:
  305. const gmMutedDetails = JSON.parse(pmsg.notificationElem.detail);
  306. const muteTime = sec2Time(gmMutedDetails.mutedSeconds);
  307. return `${getName(gmMutedDetails.opUser)}禁言了${getName(
  308. gmMutedDetails.mutedUser,
  309. )} ${muteTime}`;
  310. case MessageType.GroupMemberCancelMuted:
  311. const gmcMutedDetails = JSON.parse(pmsg.notificationElem.detail);
  312. return `${getName(gmcMutedDetails.opUser)}取消了禁言${getName(
  313. gmcMutedDetails.mutedUser,
  314. )}`;
  315. case MessageType.GroupAnnouncementUpdated:
  316. const groupAnnouncementUpdateDetail = JSON.parse(
  317. pmsg.notificationElem.detail,
  318. );
  319. const groupAnnouncementUpdateUser = groupAnnouncementUpdateDetail.opUser;
  320. return `${getName(groupAnnouncementUpdateUser)}修改了群公告`;
  321. case MessageType.GroupNameUpdated:
  322. const groupNameUpdateDetail = JSON.parse(pmsg.notificationElem.detail);
  323. const groupNameUpdateUser = groupNameUpdateDetail.opUser;
  324. return `${getName(groupNameUpdateUser)}修改了群名称为${
  325. groupNameUpdateDetail.group.groupName
  326. }`;
  327. case MessageType.OANotification:
  328. const customNoti = JSON.parse(pmsg.notificationElem.detail);
  329. return customNoti.text;
  330. case MessageType.BurnMessageChange:
  331. const burnDetails = JSON.parse(pmsg.notificationElem.detail);
  332. return `阅后即焚已${burnDetails.isPrivate ? "开启" : "关闭"}`;
  333. default:
  334. return "";
  335. }
  336. };
  337. export const formatConversionTime = (timestemp) => {
  338. return caculateTimeago(timestemp,0);
  339. // const fromNowStr = dayjs(timestemp).fromNow();
  340. // if (fromNowStr.includes("秒")) {
  341. // return "刚刚";
  342. // }
  343. // if (!fromNowStr.includes("秒") && !fromNowStr.includes("分钟")) {
  344. // return dayjs(timestemp).calendar();
  345. // }
  346. // return fromNowStr;
  347. };
  348. export function caculateTimeago(dateTimeStamp,type) {
  349. const minute = 1000 * 60; // 把分,时,天,周,半个月,一个月用毫秒表示
  350. const hour = minute * 60;
  351. const day = hour * 24;
  352. const week = day * 7;
  353. const now = new Date().getTime(); // 获取当前时间毫秒
  354. const diffValue = now - dateTimeStamp;// 时间差
  355. let result = '';
  356. if (diffValue < 0) {
  357. return;
  358. }
  359. const minS = diffValue / 1000; // 计算时间差的秒
  360. const minC = diffValue / minute; // 计算时间差的分,时,天,周,月
  361. const hourC = diffValue / hour;
  362. const dayC = diffValue / day;
  363. const weekC = diffValue / week;
  364. if (weekC >= 1 && weekC <= 4) {
  365. result = ` ${parseInt(`${weekC}`, 10)}周前`;
  366. } else if (dayC >= 1 && dayC <= 6) {
  367. result = ` ${parseInt(`${dayC}`, 10)}天前`;
  368. } else if (hourC >= 1 && hourC <= 23) {
  369. result = ` ${parseInt(`${hourC}`, 10)}小时前`;
  370. } else if (minC >= 1 && minC <= 59) {
  371. result = ` ${parseInt(`${minC}`, 10)}分钟前`;
  372. } else if (diffValue >= 0 && diffValue <= minute) {
  373. // result = '刚刚';
  374. const num = parseInt(`${minS}`, 10)
  375. if(num == 0) {
  376. result = '刚刚';
  377. } else {
  378. result = ` ${parseInt(`${minS}`, 10)}秒前`;
  379. }
  380. } else {
  381. if(type==1) {
  382. result = '';
  383. } else {
  384. const datetime = new Date();
  385. datetime.setTime(dateTimeStamp);
  386. const Nyear = datetime.getFullYear();
  387. const Nmonth = datetime.getMonth() + 1 < 10 ? `0${datetime.getMonth() + 1}` : datetime.getMonth() + 1;
  388. const Ndate = datetime.getDate() < 10 ? `0${datetime.getDate()}` : datetime.getDate();
  389. result = `${Nyear}-${Nmonth}-${Ndate}`;
  390. }
  391. }
  392. return result;
  393. }
  394. export const secFormat = (sec) => {
  395. let h;
  396. let s;
  397. h = Math.floor(sec / 60);
  398. s = sec % 60;
  399. h += "";
  400. s += "";
  401. h = h.length === 1 ? "0" + h : h;
  402. s = s.length === 1 ? "0" + s : s;
  403. return h + ":" + s;
  404. };
  405. export const bytesToSize = (bytes) => {
  406. if (bytes === 0) return "0 B";
  407. var k = 1024,
  408. sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
  409. i = Math.floor(Math.log(bytes) / Math.log(k));
  410. return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i];
  411. };
  412. export const tipMessaggeFormat = (msg, currentUserID) => {
  413. if (msg.contentType === MessageType.RevokeMessage) {
  414. let revoker, sourcer, isAdminRevoke;
  415. const data = JSON.parse(msg.notificationElem.detail);
  416. revoker = currentUserID === data.revokerID ? "你" : data.revokerNickname;
  417. isAdminRevoke = data.revokerID !== data.sourceMessageSendID;
  418. sourcer =
  419. data.sourceMessageSendID === currentUserID ?
  420. "你" :
  421. data.sourceMessageSenderNickname;
  422. if (isAdminRevoke) {
  423. return `${revoker}撤回了一条${sourcer}的消息`;
  424. }
  425. return `${revoker}撤回了一条消息`;
  426. }
  427. const getName = (user) =>
  428. user.userID === currentUserID ? "你" : user.nickname;
  429. const getUserID = (user) => user.userID;
  430. const parseInfo = (user) => formatHyperlink(getName(user), getUserID(user));
  431. switch (msg.contentType) {
  432. case MessageType.FriendAdded:
  433. return `你们已经是好友了~`;
  434. case MessageType.GroupCreated:
  435. const groupCreatedDetail = JSON.parse(msg.notificationElem.detail);
  436. const groupCreatedUser = groupCreatedDetail.opUser;
  437. return `${parseInfo(groupCreatedUser)}创建了群聊`;
  438. case MessageType.GroupInfoUpdated:
  439. const groupUpdateDetail = JSON.parse(msg.notificationElem.detail);
  440. const groupUpdateUser = groupUpdateDetail.opUser;
  441. let updateFiled = "群设置";
  442. if (groupUpdateDetail.group.notification) {
  443. updateFiled = "群公告";
  444. }
  445. if (groupUpdateDetail.group.groupName) {
  446. updateFiled = `群名称为 ${groupUpdateDetail.group.groupName}`;
  447. }
  448. if (groupUpdateDetail.group.faceURL) {
  449. updateFiled = "群头像";
  450. }
  451. if (groupUpdateDetail.group.introduction) {
  452. updateFiled = "群介绍";
  453. }
  454. return `${parseInfo(groupUpdateUser)}修改了${updateFiled}`;
  455. case MessageType.GroupOwnerTransferred:
  456. const transferDetails = JSON.parse(msg.notificationElem.detail);
  457. const transferOpUser = transferDetails.opUser;
  458. const newOwner = transferDetails.newGroupOwner;
  459. return `${parseInfo(transferOpUser)}转让群主给${parseInfo(newOwner)}`;
  460. case MessageType.MemberQuit:
  461. const quitDetails = JSON.parse(msg.notificationElem.detail);
  462. const quitUser = quitDetails.quitUser;
  463. return `${parseInfo(quitUser)}退出了群组`;
  464. case MessageType.MemberInvited:
  465. const inviteDetails = JSON.parse(msg.notificationElem.detail);
  466. const inviteOpUser = inviteDetails.opUser;
  467. const invitedUserList = inviteDetails.invitedUserList ?? [];
  468. let inviteStr = "";
  469. invitedUserList.find(
  470. (user, idx) => (inviteStr += parseInfo(user) + "、") && idx > 3,
  471. );
  472. inviteStr = inviteStr.slice(0, -1);
  473. return `${parseInfo(inviteOpUser)} 邀请了${inviteStr}${
  474. invitedUserList.length > 3 ? "..." : ""
  475. }加入群聊`;
  476. case MessageType.MemberKicked:
  477. const kickDetails = JSON.parse(msg.notificationElem.detail);
  478. const kickOpUser = kickDetails.opUser;
  479. const kickdUserList = kickDetails.kickedUserList ?? [];
  480. let kickStr = "";
  481. kickdUserList.find(
  482. (user, idx) => (kickStr += parseInfo(user) + "、") && idx > 3,
  483. );
  484. kickStr = kickStr.slice(0, -1);
  485. return `${parseInfo(kickOpUser)} 踢出了${kickStr}${
  486. kickdUserList.length > 3 ? "..." : ""
  487. }`;
  488. case MessageType.MemberEnter:
  489. const enterDetails = JSON.parse(msg.notificationElem.detail);
  490. const enterUser = enterDetails.entrantUser;
  491. return `${parseInfo(enterUser)}加入了群聊`;
  492. case MessageType.GroupDismissed:
  493. const dismissDetails = JSON.parse(msg.notificationElem.detail);
  494. const dismissUser = dismissDetails.opUser;
  495. return `${parseInfo(dismissUser)}解散了群聊`;
  496. case MessageType.GroupMuted:
  497. const groupMutedDetails = JSON.parse(msg.notificationElem.detail);
  498. const groupMuteOpUser = groupMutedDetails.opUser;
  499. return `${parseInfo(groupMuteOpUser)}开启了全体禁言`;
  500. case MessageType.GroupCancelMuted:
  501. const groupCancelMutedDetails = JSON.parse(msg.notificationElem.detail);
  502. const groupCancelMuteOpUser = groupCancelMutedDetails.opUser;
  503. return `${parseInfo(groupCancelMuteOpUser)}关闭了全体禁言`;
  504. case MessageType.GroupMemberMuted:
  505. const gmMutedDetails = JSON.parse(msg.notificationElem.detail);
  506. const muteTime = sec2Time(gmMutedDetails.mutedSeconds);
  507. return `${parseInfo(gmMutedDetails.opUser)}禁言了${parseInfo(
  508. gmMutedDetails.mutedUser,
  509. )} ${muteTime}`;
  510. case MessageType.GroupMemberCancelMuted:
  511. const gmcMutedDetails = JSON.parse(msg.notificationElem.detail);
  512. return `${parseInfo(gmcMutedDetails.opUser)}取消了禁言${parseInfo(
  513. gmcMutedDetails.mutedUser,
  514. )}`;
  515. case MessageType.GroupNameUpdated:
  516. const groupNameUpdateDetail = JSON.parse(msg.notificationElem.detail);
  517. const groupNameUpdateUser = groupNameUpdateDetail.opUser;
  518. return `${parseInfo(groupNameUpdateUser)}修改了群名称为${
  519. groupNameUpdateDetail.group.groupName
  520. }`;
  521. case MessageType.BurnMessageChange:
  522. const burnDetails = JSON.parse(msg.notificationElem.detail);
  523. return `阅后即焚已${burnDetails.isPrivate ? "开启" : "关闭"}`;
  524. case MessageType.OANotification:
  525. const customNoti = JSON.parse(msg.notificationElem.detail);
  526. return customNoti.text;
  527. default:
  528. return "";
  529. }
  530. };
  531. export const getDesignatedUserOnlineState = (userID, targetID) => {
  532. return new Promise(async (resolve, reject) => {
  533. let status = 0;
  534. try {
  535. const data = await subUserOnlineStatus(userID, targetID);
  536. status = data.statusList[0].status;
  537. } catch (e) {
  538. reject(e);
  539. }
  540. // const onlineStr = switchOnline(
  541. // statusObj.status,
  542. // statusObj.detailPlatformStatus
  543. // );
  544. const onlineStr = status ? "在线" : "离线";
  545. resolve(onlineStr);
  546. });
  547. };
  548. export const markConversationAsRead = (conversation, fromChating = false) => {
  549. if (conversation.unreadCount !== 0) {
  550. IMSDK.asyncApi(
  551. IMSDK.IMMethods.MarkConversationMessageAsRead,
  552. IMSDK.uuid(),
  553. conversation.conversationID,
  554. );
  555. }
  556. const isNomalAtType = nomalTypes.includes(conversation.groupAtType);
  557. if (isNomalAtType) {
  558. console.log('ResetConversationGroupAtType', conversation.conversationID)
  559. IMSDK.asyncApi(
  560. IMSDK.IMMethods.ResetConversationGroupAtType,
  561. IMSDK.uuid(),
  562. conversation.conversationID,
  563. );
  564. }
  565. };
  566. export const prepareConversationState = (conversation, back2Tab = false) => {
  567. markConversationAsRead(conversation);
  568. if (conversation.conversationType === SessionType.WorkingGroup) {
  569. store.dispatch("conversation/getCurrentGroup", conversation.groupID);
  570. store.dispatch(
  571. "conversation/getCurrentMemberInGroup",
  572. conversation.groupID,
  573. );
  574. }
  575. store.dispatch("message/resetMessageState");
  576. store.commit("conversation/SET_CURRENT_CONVERSATION", conversation);
  577. let url = `/pages_im/pages/conversation/chating/index?back2Tab=${back2Tab}`;
  578. if (conversation.conversationType === SessionType.Notification) {
  579. url = "/pages_im/pages/conversation/notifyMessageList/index";
  580. }
  581. setTimeout(() => {
  582. uni.navigateTo({url});
  583. }, 300)
  584. };
  585. export const navigateToDesignatedConversation = (sourceID,sessionType,back2Tab = false) => {
  586. console.log("sourceID",sourceID);
  587. console.log("sessionType",sessionType);
  588. return new Promise(async (resolve, reject) => {
  589. try {
  590. const {data} = await IMSDK.asyncApi(
  591. IMSDK.IMMethods.GetOneConversation,
  592. IMSDK.uuid(),
  593. {
  594. sessionType,
  595. sourceID
  596. }
  597. );
  598. prepareConversationState(data, back2Tab);
  599. resolve();
  600. } catch (e) {
  601. reject(e);
  602. }
  603. });
  604. };
  605. export const setConversation = (conversationID,exStr) => {
  606. return new Promise(async (resolve, reject) => {
  607. try {
  608. const {data} = await IMSDK.asyncApi(
  609. IMSDK.IMMethods.SetConversation,
  610. IMSDK.uuid(), {
  611. conversationID:conversationID,
  612. isPinned: false,
  613. ex:exStr
  614. }
  615. );
  616. resolve();
  617. } catch (e) {
  618. reject(e);
  619. }
  620. });
  621. };
  622. export const scanQrCodeResult = (result) => {
  623. if (result?.includes(AddFriendQrCodePrefix)) {
  624. const userID = result.replace(AddFriendQrCodePrefix, "");
  625. uni.navigateTo({
  626. url: `/pages_im/pages/common/userCard/index?sourceID=${userID}&isScan=true`,
  627. });
  628. } else if (result?.includes(AddGroupQrCodePrefix)) {
  629. const groupID = result.replace(AddGroupQrCodePrefix, "");
  630. uni.navigateTo({
  631. url: `/pages_im/pages/common/groupCard/index?sourceID=${groupID}&isScan=true`,
  632. });
  633. } else {
  634. uni.$u.toast("未识别到有效内容");
  635. }
  636. };
  637. // export const callingModule = uni.requireNativePlugin("OUICalling");
  638. // export const meetingModule = uni.requireNativePlugin("OUIMeeting");
  639. export const callingModule = {};
  640. export const meetingModule = {};
  641. export const offlinePushInfo = {
  642. title: "您有一条新消息",
  643. desc: "您有一条新消息",
  644. ex: "",
  645. iOSPushSound: "",
  646. iOSBadgeCount: true,
  647. };
  648. export const getConversationContent = (message) => {
  649. if (
  650. !message.groupID ||
  651. GroupSystemMessageTypes.includes(message.contentType) ||
  652. message.sendID === store.getters.storeCurrentUserID ||
  653. message.contentType === MessageType.GroupAnnouncementUpdated
  654. ) {
  655. return parseMessageByType(message);
  656. }
  657. return `${message.senderNickname}:${parseMessageByType(message)}`;
  658. };
  659. export const meetingErrorHandle = ({
  660. errCode,
  661. errMsg
  662. }) => {
  663. let message = ""
  664. if (errCode === 1004) {
  665. message = "会议已结束或会议不存在!"
  666. } else if (errCode === 200001) {
  667. message = "您已在其他会议中!"
  668. }
  669. uni.$u.toast(message || errMsg);
  670. }