diff --git a/components.d.ts b/components.d.ts index 9de6fc1..2811a17 100644 --- a/components.d.ts +++ b/components.d.ts @@ -37,13 +37,13 @@ declare module 'vue' { SysGroupAdminMessage: typeof import('./src/components/talk/message/system/SysGroupAdminMessage.vue')['default'] SysGroupCancelMutedMessage: typeof import('./src/components/talk/message/system/SysGroupCancelMutedMessage.vue')['default'] SysGroupCreateMessage: typeof import('./src/components/talk/message/system/SysGroupCreateMessage.vue')['default'] - SysGroupInfoChange: typeof import('./src/components/talk/message/system/SysGroupInfoChange.vue')['default'] SysGroupInfoChangeMessage: typeof import('./src/components/talk/message/system/SysGroupInfoChangeMessage.vue')['default'] SysGroupJoinMessage: typeof import('./src/components/talk/message/system/SysGroupJoinMessage.vue')['default'] SysGroupMemberCancelMutedMessage: typeof import('./src/components/talk/message/system/SysGroupMemberCancelMutedMessage.vue')['default'] SysGroupMemberKickedMessage: typeof import('./src/components/talk/message/system/SysGroupMemberKickedMessage.vue')['default'] SysGroupMemberMutedMessage: typeof import('./src/components/talk/message/system/SysGroupMemberMutedMessage.vue')['default'] SysGroupMemberQuitMessage: typeof import('./src/components/talk/message/system/SysGroupMemberQuitMessage.vue')['default'] + SysGroupMemberRemovedMessage: typeof import('./src/components/talk/message/system/SysGroupMemberRemovedMessage.vue')['default'] SysGroupMutedMessage: typeof import('./src/components/talk/message/system/SysGroupMutedMessage.vue')['default'] SysGroupTransferMessage: typeof import('./src/components/talk/message/system/SysGroupTransferMessage.vue')['default'] SysTextMessage: typeof import('./src/components/talk/message/system/SysTextMessage.vue')['default'] diff --git a/src/components/talk/message/system/SysGroupInfoChangeMessage.vue b/src/components/talk/message/system/SysGroupInfoChangeMessage.vue index 806e629..d0cfa0b 100644 --- a/src/components/talk/message/system/SysGroupInfoChangeMessage.vue +++ b/src/components/talk/message/system/SysGroupInfoChangeMessage.vue @@ -14,7 +14,8 @@ defineProps({ <div class="im-message-sys-text"> <div class="sys-text"> <a @click="showUserInfoModal(data.user_id)"> - {{ data.nickname }} + <!-- {{ data.nickname }} --> + 管理员 </a> <span>修改群名为</span> <span>"{{ extra.group_name }}"</span> diff --git a/src/components/talk/message/system/SysGroupMemberRemovedMessage.vue b/src/components/talk/message/system/SysGroupMemberRemovedMessage.vue new file mode 100644 index 0000000..f26af8b --- /dev/null +++ b/src/components/talk/message/system/SysGroupMemberRemovedMessage.vue @@ -0,0 +1,23 @@ +<script setup> +import './sys-message.less' +import { useInject } from '@/hooks' + +const { showUserInfoModal } = useInject() + +defineProps({ + extra: Object, + data: Object, +}) +</script> + +<template> + <div class="im-message-sys-text"> + <div class="sys-text"> + <template v-for="(user, index) in extra?.members" :key="index"> + <a @click="showUserInfoModal(user.user_id)">{{ user.nickname }}</a> + <em v-show="index < extra.members.length - 1">、</em> + </template> + <span>已离开此群</span> + </div> + </div> +</template> diff --git a/src/constant/message.ts b/src/constant/message.ts index 11e0e2f..a421418 100644 --- a/src/constant/message.ts +++ b/src/constant/message.ts @@ -60,7 +60,7 @@ export const ChatMsgTypeMapping = { [ChatMsgSysGroupTransfer]: '[转让群主]', [ChatMsgSysGroupAdmin]: '[设置管理员]', [ChatMsgSysGroupMemberRemoved]: '[移出群成员消息]', - [ChatMsgSysGroupInfoChange]: '[修改群名称]' + [ChatMsgSysGroupInfoChange]: '[群信息更新]' } // 消息类型 - 消息组件 映射关系 diff --git a/src/pages/chatSettings/index.vue b/src/pages/chatSettings/index.vue index ae15279..0afb54d 100644 --- a/src/pages/chatSettings/index.vue +++ b/src/pages/chatSettings/index.vue @@ -167,7 +167,6 @@ @click="showConfirmPrompt(3)" class="clear-chat-record-btn-each" v-if=" - groupParams?.groupInfo?.is_manager === false && dialogueParams.type === 2 && (groupParams?.groupInfo?.group_type === 1 || groupParams?.groupInfo?.group_type === 3) @@ -226,6 +225,7 @@ const dialogueParams = reactive({ keyboard: computed(() => dialogueStore.keyboard), num: computed(() => dialogueStore.members.length), memberList: computed(() => dialogueStore.members), + adminList: computed(() => dialogueStore.getAdminList), }) const talkParams = reactive({ topItems: computed(() => talkStore.topItems), @@ -563,14 +563,20 @@ const showConfirmPrompt = (flag) => { confirmContent = t('ok') + t('chat.settings.clearChatRecord') } else if (flag === 2) { //解散群聊 - confirmContent = t('ok') + t('group.quit.btn') - subContent = t('groupManage.disband.hint') - subContentColor = '#CF3050' + confirmContent = t('group.dismiss.confirm') } else if (flag === 3) { - //退出群聊 - confirmContent = t('ok') + t('group.quit.btn') - subContent = t('groupManage.quit.hint') - subContentColor = '#B4B4B4' + //最后一个管理员退群就解散群聊 + if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + //解散群聊 + confirmContent = t('ok') + t('group.quit.btn') + subContent = t('groupManage.disband.hint') + subContentColor = '#CF3050' + } else { + //退出群聊 + confirmContent = t('ok') + t('group.quit.btn') + subContent = t('groupManage.quit.hint') + subContentColor = '#B4B4B4' + } } showConfirm({ subContent: subContent, @@ -597,14 +603,32 @@ const showConfirmPrompt = (flag) => { }) } } else if (flag === 3) { - ServeSecedeGroup({ - group_id: dialogueParams.receiver_id, - }).then(({ code, message }) => { - if (code == 200) { - // dialogueStore.apiClearRecord() - } else { + //最后一个管理员退群就解散群聊 + if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + //解散群聊 + let params = { + group_id: dialogueParams.receiver_id, //群id } - }) + console.log(params) + const res = await ServeDismissGroup(params) + if (res.code === 200) { + dialogueStore.updateGroupMembers() + groupStore.ServeGroupDetail() + uni.navigateBack({ + delta: 2, + }) + } + } else { + //退出群聊 + ServeSecedeGroup({ + group_id: dialogueParams.receiver_id, + }).then(({ code, message }) => { + if (code == 200) { + // dialogueStore.apiClearRecord() + } else { + } + }) + } } }, onCancel: () => {}, diff --git a/src/pages/creatGroupChat/index.vue b/src/pages/creatGroupChat/index.vue index e639880..6c42090 100644 --- a/src/pages/creatGroupChat/index.vue +++ b/src/pages/creatGroupChat/index.vue @@ -356,6 +356,11 @@ const confirmBtnStatus = computed(() => { onShow(() => { depsNoExpanded.value = true + + if(groupActiveIndex.value === 0 || groupActiveIndex.value === 2){ + // allChooseMembers.value = [] + console.log(allChooseMembers.value) + } }) </script> <style scoped lang="scss"> diff --git a/src/pages/dialog/index.vue b/src/pages/dialog/index.vue index b31887a..0e11345 100644 --- a/src/pages/dialog/index.vue +++ b/src/pages/dialog/index.vue @@ -26,7 +26,7 @@ <template #right> <div class="mr-[36rpx] toChatSetting_btn" - v-if="!talkParams.isDismiss" + v-if="!talkParams.isDismiss && !talkParams.isQuit" > <tm-icon color="rgb(51, 51, 51)" @@ -542,6 +542,7 @@ const talkParams = reactive({ keyboard: computed(() => dialogueStore.keyboard), num: computed(() => dialogueStore.members.length), isDismiss: computed(() => dialogueStore.isDismiss), + isQuit: computed(() => dialogueStore.isQuit), adminList: computed(() => dialogueStore.getAdminList), }) @@ -877,6 +878,9 @@ const editorOption = { return el }, source: function (searchTerm, renderList, mentionChar) { + if (talkParams.type === 1) { + return + } // 在失焦前保存光标位置 const quill = getQuill() const range = quill.getSelection() @@ -1107,11 +1111,14 @@ watch( newValue[newValue.length - 1]?.sequence === dialogueList?.records?.[0]?.sequence ) { - //相同意味着分页加载缓存中的聊天记录完毕 - state.value.localPageLoadDone = true - if (dialogueList?.records?.[0]?.sequence !== 1) { + if ( + dialogueList?.records?.[0]?.sequence !== 1 && + !state.value.localPageLoadDone + ) { loadConfig.status = 1 } + //相同意味着分页加载缓存中的聊天记录完毕 + state.value.localPageLoadDone = true } else { state.value.localPageLoadDone = false } @@ -1149,8 +1156,10 @@ const onScrollToLower = async () => { })) virtualList.value = formattedMoreRecords.concat(tempVirtualList).reverse() - - console.log(virtualList.value) + loadConfig.status = + dialogueList?.records?.[0]?.sequence > 1 && moreRecords.length > 0 + ? 1 + : 2 } else { if (tempVirtualList[0].sequence > dialogueList.records[0].sequence) { virtualList.value = dialogueList.records @@ -1224,8 +1233,8 @@ const onScrollToUpper = async () => { .concat( dialogueList.records.slice( recordIndex + 1, - Math.min(recordIndex + 11, dialogueList.records.length) - ) + Math.min(recordIndex + 11, dialogueList.records.length), + ), ) .reverse() @@ -1330,7 +1339,7 @@ const getMentionSelectLists = (mentionSelectList) => { { id: mentionSelectItem?.id, denotationChar: '@', - value: mentionSelectItem?.nickname, + value: mentionSelectItem?.nickname + ' ', }, true, ) @@ -1401,7 +1410,8 @@ const queryRecordsByMsgInfo = async (msgInfo) => { nextTick(() => { zpagingRef.value.complete(recordsList.reverse()) - loadConfig.status = dialogueList?.records?.[0]?.sequence > 1 ? 1 : 2 + loadConfig.status = + dialogueList?.records?.[0]?.sequence > 1 && recordsList.length > 0 ? 1 : 2 nextTick(() => { let offset = uni.getSystemInfoSync().windowHeight const navBarAreaQuery = uni.createSelectorQuery() @@ -1492,8 +1502,11 @@ const findTalkRecords = (record, isMiddle, sequence, appointParams) => { resolve(JSON.parse(JSON.stringify(state.value.serveFindRecord))) state.value.serveFindRecord = [] } + } else { + resolve([]) } } else { + resolve([]) } }) resp.catch(() => {}) diff --git a/src/pages/search/components/searchList.vue b/src/pages/search/components/searchList.vue index 25a7acb..f320a15 100644 --- a/src/pages/search/components/searchList.vue +++ b/src/pages/search/components/searchList.vue @@ -317,6 +317,8 @@ const queryAllSearch = (pageNum, searchResultPageSize) => { data.last_id, data.last_group_id, data.last_member_id, + data.last_receiver_user_name, + data.last_receiver_group_name, ) let total = data.count if (props.searchRecordDetail) { diff --git a/src/pages/search/moreResult/moreResult.vue b/src/pages/search/moreResult/moreResult.vue index 6890668..4cff530 100644 --- a/src/pages/search/moreResult/moreResult.vue +++ b/src/pages/search/moreResult/moreResult.vue @@ -62,6 +62,8 @@ onLoad((options) => { receiver_id: 0, //查详情的时候需传入 last_group_id: 0, //最后一条群id last_member_id: 0, //最后一条用户id + last_receiver_user_name: '', //最后一条用户名 + last_receiver_group_name: '', //最后一条群名 }), ) state.apiRequest = ServeTalkRecord @@ -73,11 +75,13 @@ onLoad((options) => { }) //分页查询时,最后一条id变化 -const lastIdChange = (last_id, last_group_id, last_member_id) => { +const lastIdChange = (last_id, last_group_id, last_member_id, last_receiver_user_name, last_receiver_group_name) => { let idChanges = { last_id, last_group_id, last_member_id, + last_receiver_user_name, + last_receiver_group_name, } state.apiParams = encodeURIComponent( JSON.stringify( diff --git a/src/store/modules/dialogue.js b/src/store/modules/dialogue.js index 33157d7..f9905bf 100644 --- a/src/store/modules/dialogue.js +++ b/src/store/modules/dialogue.js @@ -51,6 +51,9 @@ export const useDialogueStore = defineStore('dialogue', { //是否已被解散 isDismiss: false, + //是否退群/移出群 + isQuit: false, + // 群成员列表 members: [], @@ -102,6 +105,7 @@ export const useDialogueStore = defineStore('dialogue', { this.isShowEditor = data?.is_robot === 0 this.isDismiss = data?.is_dismiss === 1 ? true : false + this.isQuit = data?.is_quit === 1 ? true : false this.members = [] if (data.talk_type == 2) { diff --git a/src/store/modules/dialogueList.js b/src/store/modules/dialogueList.js index 1114290..bb9c073 100644 --- a/src/store/modules/dialogueList.js +++ b/src/store/modules/dialogueList.js @@ -41,6 +41,7 @@ export const useDialogueListStore = createGlobalState(() => { isShowEditor: dialogue.isShowEditor, isShowSessionList: dialogue.isShowSessionList, isDismiss: dialogue.isDismiss, + isQuit: dialogue.isQuit, members: dialogue.members.map(member => ({ id: member.id, nickname: member.nickname, diff --git a/src/uni_modules/tmui/locale/zh-Hans.json b/src/uni_modules/tmui/locale/zh-Hans.json index 53be61f..32fae35 100644 --- a/src/uni_modules/tmui/locale/zh-Hans.json +++ b/src/uni_modules/tmui/locale/zh-Hans.json @@ -154,5 +154,6 @@ "chat.mention.select": "选择提醒的人", "do.phone.call": "拨打", "popup.title.phone": "电话", - "pageTitle.view.deps": "查看部门" + "pageTitle.view.deps": "查看部门", + "group.dismiss.confirm": "确定解散本群" } diff --git a/src/utils/talk.js b/src/utils/talk.js index 83557bd..16a4976 100644 --- a/src/utils/talk.js +++ b/src/utils/talk.js @@ -33,6 +33,7 @@ export function formatTalkItem(params) { is_top: 0, is_online: 0, is_dismiss: 0, + is_quit: 0, is_robot: 0, unread_num: 0, content: '......',