7021f2fd创建于 2025年5月14日历史提交
<template>
  <view class="wrap FolderTeam">
    <view class="titleArea">
      <view class="title">聊天成员</view>
      <view class="right" @click="() => (teamListShow = true)">
        <view class="num">{{ modelValue.length }}人</view>
        <wd-icon name="arrow-right" size="16px"></wd-icon>
      </view>
    </view>
    <view class="content">
      <SelectUser
        modalTitle="全部联系人"
        showType="card"
        :isDelUser="false"
        :isAddUser="getIsAddUser"
        :readonlyUser="readonlyUser"
        v-model="user"
        rowKey="id"
        @getSelectdAllData="getSelectdAllData"
      ></SelectUser>
    </view>
    <TeamList
      v-if="teamListShow"
      v-model="teamList"
      :pageType="pageType"
      :chatto="chatto"
      @close="() => (teamListShow = false)"
      @change="handleChange"
    ></TeamList>
    <wd-toast :selector="selector"></wd-toast>
  </view>
</template>

<script setup lang="ts">
import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni'
import { ref, watch } from 'vue'
import { http } from '@/utils/http'
import { useUserStore } from '@/store/user'
import { pick } from 'lodash-es'
import { uuid } from '@/common/uitls'
import TeamList from './TeamList.vue'

const api = {
  addAuthUser: '/eoa/im/newApi/invitationFriend',
}
defineOptions({
  name: 'chatTeam',
  options: {
    styleIsolation: 'shared',
  },
})

const props = defineProps(['modelValue', 'pageType', 'chatto', 'izInvitation', 'groupLevel'])
const emit = defineEmits(['update:modelValue'])
const selector = uuid()
const toast = useToast(selector)
const userStore = useUserStore()
const readonlyUser = ref([])
const teamList = ref([])
const teamListShow = ref(false)
const user = ref([])
const handleChange = (data) => {
  emit('update:modelValue', data)
}
const getIsAddUser = computed(() => {
  let result = true
  if (props.pageType === 'group') {
    if (props.izInvitation == 1 && props.groupLevel == 'member') {
      // 仅群主和admin可邀请用户
      result = false
    }
  }
  return result
})
const getSelectdAllData = (data) => {
  const newAddUser = getDifference(data, props.modelValue, 'id').map((item) => {
    return {
      ...pick(item, ['id', 'avatar']),
      username: item.realname,
      groupLevel: 'member',
    }
  })
  const auto = () => {
    user.value = props.modelValue
  }
  http
    .post(api.addAuthUser, {
      groupId: props.chatto,
      type: props.pageType,
      userIds: newAddUser.map((item) => item.id).join(','),
    })
    .then((res: any) => {
      if (res.success) {
        emit('update:modelValue', [...props.modelValue, ...newAddUser])
      } else {
        emit('update:modelValue', [...props.modelValue])
        auto()
      }
      toast.warning(`${res.message}`)
    })
    .catch((err) => {
      toast.warning('邀请用户失败~')
      auto()
    })
}

const getDifference = (b, a, key) => {
  // 将数组a转换为Set以便快速查找
  const aIds = new Set(a.map((item) => item[key]))
  // 过滤数组b中不在数组a中的元素
  return b.filter((item) => !aIds.has(item[key]))
}

const init = () => {
  const ids = props.modelValue.map((item) => item.id)
  user.value = ids
  readonlyUser.value = ids
}
watch(
  () => props.modelValue,
  () => {
    teamList.value = [...props.modelValue]
    init()
  },
  { deep: true, immediate: true },
)
</script>

<style lang="scss" scoped>
.wrap {
  background-color: #fff;
  padding: 14px;
  .titleArea {
    font-size: 15px;
    color: var(--color-grey);
    display: flex;
    justify-content: space-between;
    .right {
      display: flex;
      align-items: center;
    }
  }
}
</style>