gaoluyang
2 天以前 b64a0deae5b5d33f9e20671a68936b27f0b9b00b
src/views/im/home/components/group/group-admin-set-dialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
<script lang="ts" setup>
import type { GroupMemberLite } from './group-member.vue'
import { ref } from 'vue'
import { Button, message, Modal } from 'ant-design-vue'
import { addGroupAdmin, removeGroupAdmin } from '#/api/im/group'
import { GROUP_ADMIN_MAX_COUNT } from '#/views/im/utils/config'
import { GroupMemberPickerPanel } from '../picker'
defineOptions({ name: 'ImGroupAdminSetDialog' })
const emit = defineEmits<{
  /** ç®¡ç†å‘˜å˜æ›´æˆåŠŸï¼›çˆ¶ä¾§é€šå¸¸ç”¨æ¥ reload ç¾¤æ•°æ® */
  reload: []
}>()
const visible = ref(false)
const submitting = ref(false)
const groupId = ref(0)
const members = ref<GroupMemberLite[]>([])
const currentAdminIds = ref<number[]>([]) // å½“前管理员 userId åˆ—表:默认勾选 + æäº¤æ—¶ diff
const hideIds = ref<number[]>([])
const maxSize = ref(GROUP_ADMIN_MAX_COUNT)
const selectedIds = ref<number[]>([])
defineExpose({
  /** æ‰“开设置管理员弹窗:reset â†’ çŒå‚ â†’ visible=true */
  open(opts: {
    /** å½“前管理员 userId åˆ—表(默认勾选) */
    currentAdminIds: number[]
    groupId: number
    /** éšè— userId(群主) */
    hideIds?: number[]
    /** å·²é€‰æ•°ä¸Šé™ï¼›ä¸ä¼ èµ° GROUP_ADMIN_MAX_COUNT */
    maxSize?: number
    members: GroupMemberLite[]
  }) {
    groupId.value = opts.groupId
    members.value = opts.members
    currentAdminIds.value = [...opts.currentAdminIds]
    hideIds.value = opts.hideIds ? [...opts.hideIds] : []
    maxSize.value = opts.maxSize ?? GROUP_ADMIN_MAX_COUNT
    selectedIds.value = [...opts.currentAdminIds]
    submitting.value = false
    visible.value = true
  }
})
/** è·Ÿå½“前管理员列表做差集,分别拿到要新增 / æ’¤é”€çš„ userId */
async function handleOk() {
  if (!groupId.value) {
    return
  }
  const previousIds = currentAdminIds.value
  const previousIdSet = new Set(previousIds)
  const nextIds = selectedIds.value
  const nextIdSet = new Set(nextIds)
  const addedIds = nextIds.filter((id) => !previousIdSet.has(id))
  const removedIds = previousIds.filter((id) => !nextIdSet.has(id))
  if (addedIds.length === 0 && removedIds.length === 0) {
    visible.value = false
    return
  }
  submitting.value = true
  try {
    if (addedIds.length > 0) {
      await addGroupAdmin({ id: groupId.value, userIds: addedIds })
    }
    if (removedIds.length > 0) {
      await removeGroupAdmin({ id: groupId.value, userIds: removedIds })
    }
    message.success(`已更新群管理员(新增 ${addedIds.length} ä½ï¼Œæ’¤é”€ ${removedIds.length} ä½ï¼‰`)
    emit('reload')
    visible.value = false
  } finally {
    submitting.value = false
  }
}
</script>
<template>
  <!--
    è®¾ç½®ç¾¤ç®¡ç†å‘˜ï¼šä¸€ä¸ªå¼¹çª—合并增 / åˆ ï¼Œæäº¤æ—¶è·Ÿå½“前管理员列表 diff
    - dialog å£³æœ¬ç»„件持有;选择 UI å§”托 GroupMemberPickerPanel(grid å½¢æ€å¯¹é½å½“前视觉)
    - ç¾¤ä¸»ä»Žå€™é€‰é‡Œéšè—ï¼ˆä¸èƒ½è®¾ä¸ºç®¡ç†å‘˜ï¼‰
    - å¯¹å¤–接口:ref + open({ groupId, members, currentAdminIds, hideIds, maxSize }) + emit reload()
  -->
  <Modal
    v-model:open="visible"
    title="设置群管理员"
    width="700px"
    :mask-closable="false"
    class="im-picker-dialog"
  >
    <div class="h-[480px]">
      <GroupMemberPickerPanel
        v-model:selected-ids="selectedIds"
        :members="members"
        :hide-ids="hideIds"
        :max-size="maxSize"
        selected-display="grid"
      />
    </div>
    <template #footer>
      <Button @click="visible = false">取消</Button>
      <Button type="primary" :loading="submitting" @click="handleOk">确定</Button>
    </template>
  </Modal>
</template>
<style scoped lang="scss">
@use '../picker/picker-dialog' as picker;
/* :deep ç©¿é€ el-dialog å†…部类;复用 picker å…¬å…± mixin */
.im-picker-dialog {
  @include picker.styles;
}
</style>