index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <view class="message_gray_item">
  3. <!-- 撤回类型通知消息 -->
  4. <template
  5. v-if="msgBody.type !== MESSAGE_TYPE.GRAY_INFORM && msgType !== ''"
  6. >
  7. <text class="message_time">{{ messageTime(msgBody.time) }}</text>
  8. <view
  9. v-if="msgType === MESSAGE_STATUS.RECALL"
  10. class="recall_msg_item_container"
  11. >
  12. <view v-if="isSelf">
  13. <text>你撤回了一条消息</text>
  14. <text
  15. class="re_edit_text"
  16. v-if="msgBody.type === MESSAGE_TYPE.TEXT"
  17. @click="callReEditTextMessage"
  18. >重新编辑</text
  19. >
  20. </view>
  21. <view v-else>
  22. <text>“{{ msgBody.from }}”</text>
  23. <text>撤回了一条消息</text>
  24. </view>
  25. </view>
  26. </template>
  27. <!-- 单聊好友关系变更类型的通知消息 -->
  28. <template
  29. v-if="
  30. msgBody.chatType === CHAT_TYPE.SINGLE_CHAT &&
  31. GRAY_INFORM_MAP_SINGLE_TEXT[msgBody.grayInformType]
  32. "
  33. >
  34. <text class="message_time">{{ messageTime(msgBody.time) }}</text>
  35. <view class="common_msg_item_container">
  36. <text>{{ replaceStr }}</text>
  37. </view>
  38. </template>
  39. <!-- 群组事件系统通知 -->
  40. <template
  41. v-if="
  42. msgBody.chatType === CHAT_TYPE.GROUP_CHAT &&
  43. GRAY_INFORM_MAP_GROUP_TEXT[msgBody.grayInformType]
  44. "
  45. >
  46. <text class="message_time">{{ messageTime(msgBody.time) }}</text>
  47. <view class="common_msg_item_container">
  48. <text>{{ replaceStr }}</text>
  49. </view>
  50. </template>
  51. </view>
  52. </template>
  53. <script>
  54. import {
  55. CHAT_TYPE,
  56. MESSAGE_STATUS,
  57. MESSAGE_TYPE,
  58. GRAY_INFORM_TYPE_SINGLE,
  59. GRAY_INFORM_MAP_SINGLE_TEXT,
  60. GRAY_INFORM_TEMPLATE_NAME,
  61. GRAY_INFORM_TYPE_GROUP,
  62. GRAY_INFORM_MAP_GROUP_TEXT,
  63. } from '@/EaseIM/constant';
  64. export default {
  65. props: {
  66. msgBody: {
  67. type: Object,
  68. default: () => ({}),
  69. required: true,
  70. },
  71. },
  72. data() {
  73. return {
  74. CHAT_TYPE,
  75. MESSAGE_STATUS,
  76. MESSAGE_TYPE,
  77. GRAY_INFORM_TYPE_SINGLE,
  78. GRAY_INFORM_MAP_SINGLE_TEXT,
  79. GRAY_INFORM_TEMPLATE_NAME,
  80. GRAY_INFORM_TYPE_GROUP,
  81. GRAY_INFORM_MAP_GROUP_TEXT,
  82. };
  83. },
  84. computed: {
  85. isSelf() {
  86. const { from } = this.msgBody;
  87. return (
  88. from === this.$store.state.LoginStore.loginUserBaseInfos.loginUserId
  89. );
  90. },
  91. messageTime() {
  92. return (time) => {
  93. return this.$u.timeFrom(time);
  94. };
  95. },
  96. messageCollectionStatus() {
  97. return this.$store.getters.messageStatusCollection;
  98. },
  99. friendUserInfoCollection() {
  100. return this.$store.getters.friendUserInfoCollection;
  101. },
  102. groupMembersProfileData() {
  103. return this.$store.getters.groupMembersProfile;
  104. },
  105. // 灰色通知消息类型
  106. msgType() {
  107. const msgBody = this.msgBody;
  108. let msgStatus = '';
  109. if (msgBody.id) {
  110. if (
  111. this.messageCollectionStatus &&
  112. this.messageCollectionStatus[msgBody.id] === MESSAGE_STATUS.DELETE
  113. ) {
  114. msgStatus = MESSAGE_STATUS.DELETE;
  115. } else if (
  116. this.messageCollectionStatus &&
  117. this.messageCollectionStatus[msgBody.id] === MESSAGE_STATUS.RECALL
  118. ) {
  119. msgStatus = MESSAGE_STATUS.RECALL;
  120. }
  121. }
  122. return msgStatus;
  123. },
  124. //将灰色系统通知包含昵称模版的进一步替换替换字符串[XXX]为用户昵称或ID
  125. replaceStr() {
  126. const { chatType, grayInformType, from, to } = this.msgBody;
  127. if (chatType === CHAT_TYPE.SINGLE_CHAT) {
  128. let str = GRAY_INFORM_MAP_SINGLE_TEXT[grayInformType];
  129. if (str) {
  130. return (str = str.replace(
  131. GRAY_INFORM_TEMPLATE_NAME.USER,
  132. this.getFriendNickname(from)
  133. ));
  134. }
  135. return str;
  136. }
  137. if (chatType === CHAT_TYPE.GROUP_CHAT) {
  138. const groupId = to;
  139. let str = GRAY_INFORM_MAP_GROUP_TEXT[grayInformType];
  140. if (str) {
  141. if (str.includes(GRAY_INFORM_TEMPLATE_NAME.GROUP_USER_FROM)) {
  142. return (str = str.replace(
  143. GRAY_INFORM_TEMPLATE_NAME.GROUP_USER_FROM,
  144. this.getMemberGroupNickname(from, groupId)
  145. ));
  146. } else {
  147. return str;
  148. }
  149. }
  150. return str;
  151. }
  152. },
  153. },
  154. methods: {
  155. callReEditTextMessage() {
  156. const { msg } = this.msgBody;
  157. if (msg) {
  158. this.$emit('reEditTextMessage', msg);
  159. }
  160. },
  161. getFriendNickname(userId) {
  162. if (
  163. this.friendUserInfoCollection[userId] &&
  164. this.friendUserInfoCollection[userId]?.nickname
  165. ) {
  166. return `“${this.friendUserInfoCollection[userId].nickname}”`;
  167. } else {
  168. return `“${userId}”`;
  169. }
  170. },
  171. //获取用户对应群组昵称
  172. getMemberGroupNickname(userId, groupId) {
  173. const groupMemberData = this.groupMembersProfileData[groupId];
  174. console.log(groupMemberData);
  175. let nickname = '';
  176. if (groupMemberData) {
  177. nickname =
  178. groupMemberData[userId]?.nickName ||
  179. groupMemberData[userId]?.nickname ||
  180. userId;
  181. return `“${nickname}”`;
  182. } else {
  183. return `“${userId}”`;
  184. }
  185. },
  186. },
  187. };
  188. </script>
  189. <style scoped>
  190. .message_gray_item {
  191. width: 100%;
  192. }
  193. .recall_msg_item_container,
  194. .common_msg_item_container {
  195. width: 100%;
  196. height: 16px;
  197. text-align: center;
  198. /* 简体中文/标签/小 */
  199. font-family: 'PingFang SC';
  200. font-style: normal;
  201. font-weight: 400;
  202. font-size: 12px;
  203. line-height: 16px;
  204. /* identical to box height, or 133% */
  205. /* Neutral/5 */
  206. color: #75828a;
  207. /* Inside auto layout */
  208. flex: none;
  209. order: 1;
  210. flex-grow: 0;
  211. }
  212. .re_edit_text {
  213. color: #3e91fa;
  214. font-size: 13px;
  215. }
  216. .message_time {
  217. display: flex;
  218. flex-direction: row;
  219. align-items: center;
  220. justify-content: center;
  221. width: 100%;
  222. height: 16px;
  223. /* Alphabet/Body/Small */
  224. font-family: 'SF Pro';
  225. font-style: normal;
  226. font-weight: 400;
  227. font-size: 12px;
  228. line-height: 16px;
  229. /* identical to box height, or 133% */
  230. /* Neutral/7 */
  231. color: #acb4b9;
  232. margin: 10px 0 5px 0;
  233. }
  234. </style>