group.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import Vue from 'vue';
  2. import { GROUP_ROLE_TYPE_NAME } from '@/EaseIM/constant';
  3. import { emUserInfos, emGroups } from '@/EaseIM/emApis';
  4. import { convertGroupDetailsToGroupList } from '@/EaseIM/utils';
  5. const { fetchOtherInfoFromServer } = emUserInfos();
  6. const {
  7. getMultiGroupAttributesFromServer,
  8. fetchJoinedGroupListFromServer,
  9. removeGroupMembers,
  10. changeGroupOwner,
  11. } = emGroups();
  12. const GroupStore = {
  13. state: {
  14. /* 默认存储在state中的分页参数 */
  15. pageNum: 0,
  16. pageSize: 20,
  17. joinedGroupList: [],
  18. joinedGroupTotal: 0,
  19. groupMembersProfile: {},
  20. },
  21. mutations: {
  22. RESET_GROUP_STORE: (state) => {
  23. state.pageNum = 0;
  24. state.pageSize = 20;
  25. state.joinedGroupList = [];
  26. state.joinedGroupTotal = 0;
  27. state.groupMembersProfile = {};
  28. },
  29. UPDATE_PAGE_PARAMS: (state, payload) => {
  30. if (payload.pageNum !== undefined) {
  31. state.pageNum = payload.pageNum;
  32. }
  33. if (state.pageSize !== undefined) {
  34. state.pageSize = state.pageSize;
  35. }
  36. },
  37. SET_JOINEND_GROUP_LIST: (state, payload) => {
  38. const { isInit, groupList, joinedGroupTotal } = payload;
  39. if (isInit) {
  40. state.joinedGroupList = [...groupList];
  41. state.pageNum = 0;
  42. } else {
  43. state.joinedGroupList = [...state.joinedGroupList, ...groupList];
  44. }
  45. state.joinedGroupTotal = joinedGroupTotal;
  46. },
  47. ADD_NEW_JOINEND_GROUP: (state, group) => {
  48. state.joinedGroupList.unshift(group);
  49. },
  50. DELETE_JOINEND_GROUP: (state, groupId) => {
  51. state.joinedGroupList = state.joinedGroupList.filter(
  52. (group) => group.groupId !== groupId
  53. );
  54. state.joinedGroupTotal = state.joinedGroupTotal - 1;
  55. },
  56. UPDATE_JOINED_GROUP_DATA: (state, payload) => {
  57. const { groupDetail } = payload;
  58. const convertGroupDetails = convertGroupDetailsToGroupList(groupDetail);
  59. const _index = state.joinedGroupList.findIndex(
  60. (item) => item.groupId === convertGroupDetails.groupId
  61. );
  62. const oldGroupData = state.joinedGroupList[_index];
  63. const newGroupDetails = Object.assign(oldGroupData, convertGroupDetails);
  64. state.joinedGroupList.splice(_index, 1, newGroupDetails);
  65. },
  66. SET_GROUP_MEMBERS_PROFILE: (state, payload) => {
  67. const { groupId, groupMembersProfile } = payload;
  68. if (!state.groupMembersProfile[groupId]) {
  69. Vue.set(state.groupMembersProfile, groupId, {});
  70. }
  71. state.groupMembersProfile[groupId] = {
  72. ...state.groupMembersProfile[groupId],
  73. ...groupMembersProfile,
  74. };
  75. },
  76. DELETE_GROUP_MEMBERS_PROFILE: (state, payload) => {
  77. const { groupId, memberList } = payload;
  78. if (state.groupMembersProfile[groupId]) {
  79. memberList.forEach((userId) => {
  80. Vue.delete(state.groupMembersProfile[groupId], userId);
  81. });
  82. }
  83. },
  84. TRANSFER_GROUP_OWNER: (state, payload) => {
  85. const { groupId, newOwner } = payload;
  86. const soureData = state.joinedGroupList.find(
  87. (group) => group.groupId === groupId
  88. );
  89. const _index = state.joinedGroupList.findIndex(
  90. (group) => group.groupId === groupId
  91. );
  92. if (soureData && _index > -1) {
  93. soureData.role = GROUP_ROLE_TYPE_NAME.MEMBER;
  94. soureData.owner = newOwner;
  95. }
  96. state.joinedGroupList.splice(_index, 1, soureData);
  97. },
  98. CHANGE_AFFILIATIONS_COUNT: (state, payload) => {
  99. const { groupId, count } = payload;
  100. const soureData = state.joinedGroupList.find(
  101. (group) => group.groupId === groupId
  102. );
  103. const _index = state.joinedGroupList.findIndex(
  104. (group) => group.groupId === groupId
  105. );
  106. if (soureData && _index > -1) {
  107. if (count > 0) {
  108. soureData.affiliationsCount = soureData.affiliationsCount + 1;
  109. } else {
  110. soureData.affiliationsCount = soureData.affiliationsCount - 1;
  111. }
  112. }
  113. soureData && state.joinedGroupList.splice(_index, 1, soureData);
  114. },
  115. },
  116. actions: {
  117. fetchJoinedGroupList: async ({ state, commit }, params) => {
  118. //isInit 为是否从头获取
  119. const { isInit } = params;
  120. const param = {
  121. pageNum: isInit ? 0 : params.pageNum,
  122. pageSize: isInit ? 20 : params.pageSize,
  123. };
  124. return new Promise((resolve, reject) => {
  125. fetchJoinedGroupListFromServer(param.pageNum, param.pageSize)
  126. .then((joinedGroupList) => {
  127. const { total, entities } = joinedGroupList;
  128. console.log('total, entities ', total, entities);
  129. commit('SET_JOINEND_GROUP_LIST', {
  130. isInit,
  131. groupList: [...entities],
  132. joinedGroupTotal: total,
  133. });
  134. resolve(joinedGroupList);
  135. })
  136. .catch((error) => {
  137. console.log('>>>>>远端群组列表拉取失败', error);
  138. reject(error);
  139. });
  140. });
  141. },
  142. fetchGroupMembersProfile: async ({ commit }, params) => {
  143. console.log('fetchGroupMembersProfile', params);
  144. const { groupId, memberList } = params;
  145. //获取对应用户属性
  146. const profileRes = await fetchOtherInfoFromServer(memberList);
  147. //获取对应群成员属性
  148. const groupAttributesRes = await getMultiGroupAttributesFromServer({
  149. groupId,
  150. userIds: memberList,
  151. keys: ['nickName'],
  152. });
  153. commit('SET_GROUP_MEMBERS_PROFILE', {
  154. groupId,
  155. groupMembersProfile: Object.assign(
  156. { ...groupAttributesRes },
  157. { ...profileRes }
  158. ),
  159. });
  160. },
  161. deleteInGroupMembers: async ({ commit }, params) => {
  162. const { groupId, memberList } = params;
  163. return new Promise((resolve, reject) => {
  164. removeGroupMembers(groupId, memberList)
  165. .then((res) => {
  166. resolve(res);
  167. /**
  168. * 目前依赖memberAbsence,事件调用DELETE_GROUP_MEMBERS_PROFILE。
  169. * 删除群内信息,因此暂时注释
  170. */
  171. // commit('DELETE_GROUP_MEMBERS_PROFILE', {
  172. // groupId,
  173. // memberList,
  174. // });
  175. })
  176. .catch((error) => {
  177. reject(error);
  178. });
  179. });
  180. },
  181. transferGroupOwners: async ({ commit }, params) => {
  182. const { groupId, newOwner } = params;
  183. return new Promise((resolve, reject) => {
  184. changeGroupOwner(groupId, newOwner)
  185. .then((res) => {
  186. commit('TRANSFER_GROUP_OWNER', { groupId, newOwner });
  187. resolve(res);
  188. })
  189. .catch((error) => {
  190. reject(error);
  191. });
  192. });
  193. },
  194. },
  195. getters: {
  196. groupPageParams: (state) => {
  197. return {
  198. pageNum: state.pageNum,
  199. pageSize: state.pageSize,
  200. };
  201. },
  202. joinedGroupList: (state) => state.joinedGroupList,
  203. joinedGroupTotal: (state) => state.joinedGroupTotal,
  204. groupMembersProfile: (state) => state.groupMembersProfile,
  205. },
  206. };
  207. export default GroupStore;