index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <view class="create_group_container">
  3. <custom-nav-bar title="发起群聊" />
  4. <u-toast ref="uToast"></u-toast>
  5. <view class="main">
  6. <view class="member_row">
  7. <view class="desc_title">
  8. 群名称
  9. </view>
  10. <view class="member_list">
  11. <my-avatar @click="chooseImage" :isGroup="true" :src="groupFaceUrl" size="48" />
  12. <image class="edit_img" src="/pages_im/static/images/chat/icon_edit.png" alt="" />
  13. <u-input v-model="groupName" disabledColor="transparent" maxlength="16" placeholder="取个群名方便后续搜索" clearable
  14. :border="false">
  15. </u-input>
  16. </view>
  17. </view>
  18. <view class="member_row" @click="toChooseMember">
  19. <view class="desc_title">
  20. <text>群成员</text>
  21. <text class="number" v-if="checkedMemberList.length">{{ `${checkedMemberList.length}人` }}</text>
  22. </view>
  23. <view class="member_list">
  24. <image class="add_img" src="/pages_im/static/images/group_setting_invite.png" alt="" />
  25. <view v-for="member in checkedMemberList.slice(0, 5)" :key="member.userID" class="member_item">
  26. <my-avatar :src="member.faceURL" :desc="member.nickname" size="36" />
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. <view class="action_bar">
  32. <u-button :loading="createLoading" :disabled="disabledCreate" @click="complateCreate" text="完成创建">
  33. </u-button>
  34. </view>
  35. </view>
  36. </template>
  37. <script>
  38. import { ContactChooseTypes } from "../../../constant";
  39. import IMSDK, {
  40. GroupType,
  41. IMMethods,
  42. SessionType,
  43. } from "openim-uniapp-polyfill";
  44. import CustomNavBar from "../../../components/CustomNavBar/index.vue";
  45. import MyAvatar from "../../../components/MyAvatar/index.vue";
  46. import { navigateToDesignatedConversation } from "../../../util/imCommon";
  47. import { getPurePath, toastWithCallback } from "../../../util/common";
  48. export default {
  49. components: {
  50. CustomNavBar,
  51. MyAvatar,
  52. },
  53. data() {
  54. return {
  55. groupName: "",
  56. groupFaceUrl: "",
  57. checkedMemberList: [],
  58. fileList: [],
  59. createLoading: false,
  60. };
  61. },
  62. computed: {
  63. disabledCreate() {
  64. return !this.groupName || this.checkedMemberList.length === 0;
  65. },
  66. },
  67. onLoad(options) {
  68. const { checkedMemberList } = options;
  69. this.checkedMemberList = checkedMemberList
  70. ? JSON.parse(checkedMemberList)
  71. : [];
  72. console.log(this.checkedMemberList,"-------1111-----");
  73. },
  74. methods: {
  75. toChooseMember() {
  76. uni.navigateTo({
  77. url: `/pages_im/pages/common/contactChoose/index?type=${ContactChooseTypes.GetList
  78. }&checkedUserInfoList=${encodeURIComponent(JSON.stringify(this.checkedMemberList))}`,
  79. });
  80. },
  81. complateCreate() {
  82. console.log(this.checkedMemberList,"-------2222-----", this.checkedMemberList.map((member) => member.userID));
  83. this.createLoading = true;
  84. const options = {
  85. adminUserIDs: [],
  86. memberUserIDs: this.checkedMemberList.map((member) => member.userID),
  87. groupInfo: {
  88. groupType: GroupType.WorkingGroup,
  89. groupName: this.groupName,
  90. faceURL: this.groupFaceUrl,
  91. },
  92. };
  93. IMSDK.asyncApi(IMSDK.IMMethods.CreateGroup, IMSDK.uuid(), options)
  94. .then(({ data }) => {
  95. toastWithCallback("创建成功", () =>
  96. navigateToDesignatedConversation(
  97. data.groupID,
  98. SessionType.WorkingGroup,
  99. true,
  100. ),
  101. );
  102. })
  103. .catch((err) => {
  104. console.log(err);
  105. uni.$u.toast("创建失败");
  106. })
  107. .finally(() => (this.createLoading = false));
  108. },
  109. getCheckedUsers(list) {
  110. this.checkedMemberList = [...list];
  111. },
  112. chooseImage() {
  113. uni.chooseImage({
  114. count: 1,
  115. sizeType: ["compressed"],
  116. success: async ({ tempFilePaths }) => {
  117. const path = tempFilePaths[0];
  118. const nameIdx = path.lastIndexOf("/") + 1;
  119. const typeIdx = path.lastIndexOf(".") + 1;
  120. const fileName = path.slice(nameIdx);
  121. const fileType = path.slice(typeIdx);
  122. try {
  123. const {
  124. data: { url },
  125. } = await IMSDK.asyncApi(IMMethods.UploadFile, IMSDK.uuid(), {
  126. filepath: getPurePath(tempFilePaths[0]),
  127. name: fileName,
  128. contentType: fileType,
  129. uuid: IMSDK.uuid(),
  130. });
  131. this.groupFaceUrl = url;
  132. } catch (error) {
  133. uni.$u.toast("上传失败");
  134. }
  135. },
  136. fail: function (err) {
  137. console.log(err)
  138. if (err.errMsg === 'chooseImage:fail cancel') return
  139. uni.$u.toast("上传失败");
  140. },
  141. });
  142. },
  143. },
  144. };
  145. </script>
  146. <style lang="scss" scoped>
  147. .create_group_container {
  148. @include colBox(false);
  149. height: 100vh;
  150. background-color: #f6f6f6;
  151. .edit_img {
  152. width: 36rpx;
  153. height: 36rpx;
  154. margin-left: 24rpx;
  155. margin-right: 10rpx;
  156. }
  157. .add_img {
  158. width: 36px;
  159. height: 36px;
  160. margin-right: 10rpx
  161. }
  162. .main {
  163. display: flex;
  164. flex-direction: column;
  165. flex: 1;
  166. }
  167. .member_row {
  168. padding: 24rpx 28rpx;
  169. margin: 0 24rpx;
  170. margin-top: 24rpx;
  171. border-radius: 16rpx;
  172. background-color: #fff;
  173. color: #999;
  174. .desc_title {
  175. @include vCenterBox();
  176. justify-content: space-between;
  177. font-weight: 400;
  178. font-size: 16px;
  179. color: #222222;
  180. .number {
  181. color: #757575;
  182. }
  183. }
  184. .member_list {
  185. display: flex;
  186. flex-wrap: wrap;
  187. margin-top: 24rpx;
  188. align-items: center;
  189. .member_item {
  190. @include colBox(false);
  191. align-items: center;
  192. margin-right: 12rpx;
  193. .member_name {
  194. @include nomalEllipsis();
  195. max-width: 42px;
  196. margin-top: 12rpx;
  197. }
  198. }
  199. }
  200. }
  201. .action_bar {
  202. background-color: #fff;
  203. padding: 20rpx 24rpx;
  204. font-weight: 400;
  205. font-size: 16px;
  206. uni-button {
  207. border-radius: 16rpx !important;
  208. background-color: #FF5030 !important;
  209. color: #fff !important;
  210. }
  211. }
  212. }
  213. </style>