| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { ImRtcCallNotification } from '../../store/rtcStore' |
| | | |
| | | import { computed } from 'vue' |
| | | |
| | | import { DICT_TYPE } from '#/packages/constants/src' |
| | | import { getDictLabel } from '#/packages/effects/hooks/src' |
| | | import { IconifyIcon as Icon } from '#/packages/icons/src' |
| | | |
| | | import { useGroupCallMembers } from '../../composables/useGroupCallMembers' |
| | | import { UserAvatar } from '../user' |
| | | |
| | | const props = defineProps<{ |
| | | accepting?: boolean |
| | | isGroup?: boolean |
| | | payload: ImRtcCallNotification | null |
| | | rejecting?: boolean |
| | | }>() |
| | | |
| | | defineEmits<{ accept: []; reject: [] }>() |
| | | |
| | | /** æ¥çµæç¤ºææ¡ï¼åºåè¯é³ / è§é¢ */ |
| | | const tipText = computed(() => { |
| | | if (!props.payload) return '' |
| | | return `éè¯·ä½ ${getDictLabel(DICT_TYPE.IM_RTC_CALL_MEDIA_TYPE, props.payload.mediaType)}éè¯` |
| | | }) |
| | | |
| | | /** æ¥å¬æé®ç¦ç¨æ */ |
| | | const acceptDisabled = computed(() => !!props.accepting || !!props.rejecting) |
| | | |
| | | /** æç»æé®ç¦ç¨æ */ |
| | | const rejectDisabled = computed(() => !!props.rejecting || !!props.accepting) |
| | | |
| | | // 群éè¯æåï¼ç¼å为空æ¶ç¨ INVITE è½½è·éç主å«å
åºï¼é¿å
ç©ºç½ |
| | | const callMembers = useGroupCallMembers( |
| | | computed(() => (props.isGroup ? props.payload?.groupId : undefined)), |
| | | computed(() => props.payload?.inviterUserId) |
| | | ) |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- |
| | | 被å«ç«¯æ¥çµå°æ¡ï¼åè微信ï¼å³ä¸è§åºå®æ¬æµ®ï¼ |
| | | 群èï¼å·¦å¤´å + ä¸ï¼é请人 + ææ¡ä¸è¡ / éè¯æåè¡ï¼+ å³ä¸è§æç» / æ¥å¬ï¼ |
| | | ç§èï¼å·¦å¤´å + ä¸ï¼é请人 + ææ¡ä¸¤è¡ï¼+ å³ä¸è§æç» / æ¥å¬ |
| | | --> |
| | | <div |
| | | class="fixed top-5 right-5 rounded-2xl overflow-hidden shadow-[0_12px_36px_rgba(0,0,0,0.4)] z-[9999] flex gap-3 items-end p-3 text-white bg-[#2a2a2c]" |
| | | :class="isGroup ? 'w-[360px]' : 'w-[340px]'" |
| | | > |
| | | <!-- å·¦ï¼é请è
头å --> |
| | | <UserAvatar |
| | | :url="payload?.inviterAvatar" |
| | | :name="payload?.inviterNickname" |
| | | :size="48" |
| | | radius="8px" |
| | | :clickable="false" |
| | | class="self-start" |
| | | /> |
| | | |
| | | <!-- ä¸ï¼ç¾¤èåè¡ï¼é请人 + ææ¡ï¼+ éè¯æåï¼ç§è两è¡ï¼å / ææ¡ï¼ --> |
| | | <div class="flex flex-col flex-1 gap-1 self-start min-w-0"> |
| | | <!-- å + ææ¡ï¼ç¾¤åè¡å
èï¼ç§èä¸ä¸ä¸¤è¡ --> |
| | | <div v-if="isGroup" class="text-sm truncate"> |
| | | <span class="font-medium">{{ payload?.inviterNickname || '对æ¹' }}</span> |
| | | <span class="ml-1 text-white/60">{{ tipText }}</span> |
| | | </div> |
| | | <template v-else> |
| | | <div class="text-sm font-medium truncate">{{ payload?.inviterNickname || '对æ¹' }}</div> |
| | | <div class="text-13px text-white/60 truncate">{{ tipText }}</div> |
| | | </template> |
| | | |
| | | <!-- 群éè¯æåè¡ï¼ç§èæ ï¼æ¥å
¥ä¸ç人åéæå±ç¤º --> |
| | | <template v-if="isGroup && callMembers.length > 0"> |
| | | <div class="mt-1 text-xs text-white/45">éè¯æå</div> |
| | | <div class="flex flex-wrap gap-1"> |
| | | <UserAvatar |
| | | v-for="member in callMembers" |
| | | :key="member.userId" |
| | | :url="member.avatar" |
| | | :name="member.nickname" |
| | | :size="22" |
| | | radius="4px" |
| | | :clickable="false" |
| | | :class="{ 'opacity-50': member.pending }" |
| | | :title="member.pending ? `${member.nickname}ï¼æ¥å
¥ä¸ï¼` : member.nickname" |
| | | /> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | |
| | | <!-- å³ä¸è§ï¼æç» / æ¥å¬ --> |
| | | <div class="flex flex-shrink-0 gap-2 items-center"> |
| | | <button |
| | | class="flex flex-shrink-0 justify-center items-center w-10 h-10 text-white rounded-full transition-opacity bg-[#f04a4a] hover:opacity-90" |
| | | :class="{ 'opacity-60 cursor-not-allowed': rejectDisabled }" |
| | | :disabled="rejectDisabled" |
| | | @click="$emit('reject')" |
| | | > |
| | | <Icon icon="ant-design:phone-outlined" :size="18" class="rotate-[135deg]" /> |
| | | </button> |
| | | <button |
| | | class="flex flex-shrink-0 justify-center items-center w-10 h-10 text-white rounded-full transition-opacity bg-[#2ec27e] hover:opacity-90" |
| | | :class="{ 'opacity-60 cursor-not-allowed': acceptDisabled }" |
| | | :disabled="acceptDisabled" |
| | | @click="$emit('accept')" |
| | | > |
| | | <Icon icon="ant-design:phone-outlined" :size="18" /> |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </template> |