| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { GroupMemberLite } from '../group' |
| | | |
| | | import { computed, ref } from 'vue' |
| | | |
| | | import { Button, Modal } from 'ant-design-vue' |
| | | |
| | | import { getCurrentUserId } from '#/views/im/utils/auth' |
| | | |
| | | import { useGroupStore } from '../../store/groupStore' |
| | | import { GroupMemberPickerPanel } from '../picker' |
| | | |
| | | defineOptions({ name: 'ImRtcCallMemberPickerDialog' }) |
| | | |
| | | const emit = defineEmits<{ |
| | | /** éå®ç¹å®æï¼æºå¸¦éä¸ç userId å表 */ |
| | | success: [selectedIds: number[]] |
| | | }>() |
| | | |
| | | type PickerMode = 'add' | 'invite' |
| | | |
| | | const groupStore = useGroupStore() |
| | | |
| | | const visible = ref(false) // å¼¹çªæ¾é |
| | | const groupId = ref(0) // å½å群ç¼å·ï¼open æ¶ç±è°ç¨æ¹ä¼ å
¥ |
| | | const mode = ref<PickerMode>('invite') // å¼¹çªç¨éï¼invite=å起群éè¯éé请人 / add=éè¯ä¸è¿½å æå |
| | | const excludeUserIds = ref<number[]>([]) // ç½®ç°ç userId å表ï¼add åºæ¯æå·²å¨éè¯å
ç人ç¦ç¨ |
| | | const selectedIds = ref<number[]>([]) // å½åéä¸ç userId å表ï¼GroupMemberPickerPanel v-model ç»è¿æ¥ |
| | | |
| | | /** æ é¢ï¼æç¨é忢 */ |
| | | const title = computed(() => (mode.value === 'add' ? 'æ·»å æå' : 'éæ©æå')) |
| | | |
| | | /** 群æåå表ï¼ä» groupStore ç°åï¼map æ GroupMemberLite */ |
| | | const members = computed<GroupMemberLite[]>(() => { |
| | | const group = groupStore.getGroup(groupId.value) |
| | | return (group?.members || []).map((member) => ({ |
| | | userId: member.userId, |
| | | nickname: member.nickname, |
| | | showName: member.displayUserName || member.nickname, |
| | | avatar: member.avatar, |
| | | status: member.status, |
| | | role: member.role |
| | | })) |
| | | }) |
| | | |
| | | /** èªå·±ä¸åºç°å¨é项é */ |
| | | const hideIds = computed<number[]>(() => { |
| | | const myId = getCurrentUserId() |
| | | return myId ? [myId] : [] |
| | | }) |
| | | |
| | | /** å·²å¨éè¯å
çæåç½®ç° */ |
| | | const disabledIds = computed<number[]>(() => excludeUserIds.value) |
| | | |
| | | /** æ¯å¦å¯æäº¤ï¼è³å°é 1 个 */ |
| | | const canSubmit = computed(() => selectedIds.value.length > 0) |
| | | |
| | | /** æå¼å¼¹çªï¼excludeUserIds ç¨äºãæ·»å æåãæ¶æå·²å¨éè¯å
çäººç½®ç° */ |
| | | function open(opts: { excludeUserIds?: number[]; groupId: number; mode?: PickerMode; }) { |
| | | groupId.value = opts.groupId |
| | | mode.value = opts.mode || 'invite' |
| | | excludeUserIds.value = opts.excludeUserIds || [] |
| | | selectedIds.value = [] |
| | | visible.value = true |
| | | } |
| | | defineExpose({ open }) // æä¾ open æ¹æ³ï¼ç¨äºæå¼å¼¹çª |
| | | |
| | | /** ç¹å®æï¼emit éä¸ ID å表ç»ç¶çº§ + å
³éå¼¹çªï¼æäº¤æé® disabled å·²ä¿è¯ selectedIds é空 */ |
| | | function handleOk() { |
| | | emit('success', [...selectedIds.value]) |
| | | visible.value = false |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- |
| | | éè¯æå鿩弹çªï¼å起群éè¯æ¶éé请人 / éè¯ä¸æ·»å æåï¼ |
| | | éæ© UI å§æ GroupMemberPickerPanelï¼èªå·± hideãå·²å¨éè¯å
çæå disabled |
| | | --> |
| | | <Modal |
| | | v-model:open="visible" |
| | | :title="title" |
| | | width="720px" |
| | | :mask-closable="false" |
| | | class="im-picker-dialog" |
| | | > |
| | | <div class="h-[480px]"> |
| | | <GroupMemberPickerPanel |
| | | v-model:selected-ids="selectedIds" |
| | | :members="members" |
| | | :disabled-ids="disabledIds" |
| | | :hide-ids="hideIds" |
| | | /> |
| | | </div> |
| | | <template #footer> |
| | | <Button @click="visible = false">åæ¶</Button> |
| | | <Button type="primary" :disabled="!canSubmit" @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> |