message.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import IMSDK, {
  2. MessageStatus,
  3. MessageType
  4. } from "openim-uniapp-polyfill";
  5. import {
  6. v4 as uuidv4
  7. } from "uuid";
  8. import {
  9. UpdateMessageTypes,
  10. FileMessageTypes
  11. } from "@/pages_im/constant";
  12. const state = {
  13. historyMessageList: [],
  14. previewImageList: [],
  15. hasMoreMessage: true,
  16. quoteMessage: undefined,
  17. };
  18. const mutations = {
  19. SET_HISTORY_MESSAGE_LIST(state, list) {
  20. state.historyMessageList = [...list];
  21. },
  22. SET_PREVIEW_IMAGE_LIST(state, list) {
  23. state.previewImageList = [...list];
  24. },
  25. SET_HAS_MORE_MESSAGE(state, hasMore) {
  26. state.hasMoreMessage = hasMore;
  27. },
  28. SET_QUOTE_MESSAGE(state, message) {
  29. state.quoteMessage = message;
  30. },
  31. };
  32. const actions = {
  33. async getHistoryMesageList({
  34. commit,
  35. state
  36. }, params) {
  37. let emptyFlag = true;
  38. try {
  39. const {
  40. data
  41. } = await IMSDK.asyncApi(
  42. IMSDK.IMMethods.GetAdvancedHistoryMessageList,
  43. uuidv4(),
  44. params,
  45. );
  46. console.log(data);
  47. const isFistPage = !params.startClientMsgID;
  48. const messages = data.messageList ?? [];
  49. if (!params.conversationID.includes("sn_")) {
  50. const imageList = filterPreviewImage([...messages]);
  51. commit("SET_PREVIEW_IMAGE_LIST", [
  52. ...imageList,
  53. ...(isFistPage ? [] : state.previewImageList),
  54. ]);
  55. }
  56. emptyFlag = messages.length === 0;
  57. commit("SET_HISTORY_MESSAGE_LIST", [
  58. ...messages,
  59. ...(isFistPage ? [] : state.historyMessageList),
  60. ]);
  61. commit("SET_HAS_MORE_MESSAGE", !data.isEnd && messages.length === 20);
  62. } catch (e) {
  63. commit("SET_HISTORY_MESSAGE_LIST", []);
  64. }
  65. return {
  66. emptyFlag,
  67. };
  68. },
  69. pushNewPreviewImage({
  70. state,
  71. commit
  72. }, url) {
  73. commit("SET_PREVIEW_IMAGE_LIST", [...state.previewImageList, url]);
  74. },
  75. pushNewMessage({
  76. commit,
  77. state
  78. }, message) {
  79. if (
  80. message.contentType === MessageType.PictureMessage &&
  81. message.status === MessageStatus.Succeed
  82. ) {
  83. const imageList = filterPreviewImage([message]);
  84. if (imageList.length > 0) {
  85. commit("SET_PREVIEW_IMAGE_LIST", [
  86. ...state.previewImageList,
  87. ...imageList,
  88. ]);
  89. }
  90. }
  91. commit("SET_HISTORY_MESSAGE_LIST", [...state.historyMessageList, message]);
  92. },
  93. updateOneMessage({
  94. commit,
  95. dispatch,
  96. state
  97. }, {
  98. message,
  99. type = UpdateMessageTypes.Overall,
  100. keyWords = [],
  101. isSuccess = false,
  102. }) {
  103. const tmpList = state.historyMessageList;
  104. const idx = tmpList.findIndex((msg) => msg.clientMsgID === message.clientMsgID);
  105. if (idx !== -1) {
  106. if (type === UpdateMessageTypes.Overall) {
  107. console.log("qxj FileMessageTypes:" + FileMessageTypes);
  108. if (FileMessageTypes.includes(message.contentType) && isSuccess) {
  109. let filePath = "";
  110. switch (message.contentType) {
  111. case MessageType.FileMessage:
  112. filePath = message.fileElem.filePath;
  113. break;
  114. case MessageType.PictureMessage:
  115. filePath = message.pictureElem.sourcePath;
  116. break;
  117. case MessageType.VideoMessage:
  118. filePath = message.videoElem.videoPath;
  119. break;
  120. case MessageType.VoiceMessage:
  121. filePath = message.soundElem.soundPath;
  122. break;
  123. default:
  124. break;
  125. }
  126. if (filePath) {
  127. dispatch("user/addLocalPathToCache", {
  128. key: message.clientMsgID,
  129. path: filePath,
  130. })
  131. }
  132. }
  133. if (message.contentType === MessageType.PictureMessage && isSuccess) {
  134. const imageList = filterPreviewImage([message]);
  135. if (imageList.length > 0) {
  136. commit("SET_PREVIEW_IMAGE_LIST", [
  137. ...state.previewImageList,
  138. ...imageList,
  139. ]);
  140. }
  141. }
  142. tmpList[idx] = {
  143. ...message,
  144. };
  145. } else if (type === UpdateMessageTypes.KeyWords) {
  146. const updateFields = Array.isArray(keyWords) ? keyWords : [keyWords];
  147. updateFields.forEach(
  148. (field) => (tmpList[idx][field.key] = field.value),
  149. );
  150. }
  151. commit("SET_HISTORY_MESSAGE_LIST", tmpList);
  152. }
  153. },
  154. deleteMessages({
  155. commit,
  156. state
  157. }, messages) {
  158. const tmpList = [...state.historyMessageList];
  159. messages.map((message) => {
  160. const idx = tmpList.findIndex(
  161. (msg) => msg.clientMsgID === message.clientMsgID,
  162. );
  163. if (idx !== -1) {
  164. tmpList.splice(idx, 1);
  165. }
  166. });
  167. commit("SET_HISTORY_MESSAGE_LIST", tmpList);
  168. },
  169. resetMessageState({
  170. commit
  171. }) {
  172. commit("SET_HISTORY_MESSAGE_LIST", []);
  173. commit("SET_PREVIEW_IMAGE_LIST", []);
  174. commit("SET_HAS_MORE_MESSAGE", true);
  175. commit("SET_QUOTE_MESSAGE", undefined);
  176. },
  177. updateMessageNicknameAndFaceUrl({
  178. commit,
  179. state
  180. }, {
  181. sendID,
  182. senderFaceUrl,
  183. senderNickname
  184. }, ) {
  185. const tmpList = [...state.historyMessageList].map((message) => {
  186. if (message.sendID === sendID) {
  187. message.senderFaceUrl = senderFaceUrl;
  188. message.senderNickname = senderNickname;
  189. }
  190. return message;
  191. });
  192. commit("SET_HISTORY_MESSAGE_LIST", [...tmpList]);
  193. },
  194. updateQuoteMessageRevoke({
  195. dispatch,
  196. state
  197. }, {
  198. clientMsgID
  199. }) {
  200. [...state.historyMessageList].map((message) => {
  201. if (message.contentType === MessageType.QuoteMessage && clientMsgID === message.quoteElem
  202. .quoteMessage.clientMsgID) {
  203. dispatch('updateOneMessage', {
  204. message: {
  205. ...message,
  206. quoteElem: {
  207. ...message.quoteElem,
  208. quoteMessage: {
  209. ...message.quoteElem.quoteMessage,
  210. contentType: 2101
  211. }
  212. }
  213. }
  214. })
  215. }
  216. return null;
  217. });
  218. }
  219. };
  220. function filterPreviewImage(messages) {
  221. return messages
  222. .filter((message) => {
  223. if (message.contentType === MessageType.PictureMessage) {
  224. return true;
  225. }
  226. if (message.contentType === MessageType.OANotification) {
  227. let notificationData = {};
  228. try {
  229. notificationData = JSON.parse(message.notificationElem.detail);
  230. } catch (error) {}
  231. if (notificationData.mixType === 1) {
  232. message.pictureElem.snapshotPicture.url =
  233. notificationData.pictureElem.sourcePicture.url;
  234. return true;
  235. }
  236. return false;
  237. }
  238. return false;
  239. })
  240. .map((item) => item.pictureElem.sourcePicture.url);
  241. }
  242. export default {
  243. namespaced: true,
  244. state,
  245. mutations,
  246. actions,
  247. };