diff --git a/components.d.ts b/components.d.ts index 334d110..f93eeb3 100644 --- a/components.d.ts +++ b/components.d.ts @@ -30,8 +30,6 @@ declare module 'vue' { LoginMessage: typeof import('./src/components/talk/message/LoginMessage.vue')['default'] Message: typeof import('./src/components/x-message/message/index.vue')['default'] MixedMessage: typeof import('./src/components/talk/message/MixedMessage.vue')['default'] - NButton: typeof import('naive-ui')['NButton'] - NIcon: typeof import('naive-ui')['NIcon'] PageAnimation: typeof import('./src/components/page-animation/index.vue')['default'] RevokeMessage: typeof import('./src/components/talk/message/RevokeMessage.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] @@ -39,6 +37,7 @@ 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'] + SysGroupDismissed: typeof import('./src/components/talk/message/system/SysGroupDismissed.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'] diff --git a/src/components/talk/message/ImageMessage.vue b/src/components/talk/message/ImageMessage.vue index c7ed9b9..8a84a27 100644 --- a/src/components/talk/message/ImageMessage.vue +++ b/src/components/talk/message/ImageMessage.vue @@ -58,7 +58,7 @@ const img = computed(() => { }" >
- +
diff --git a/src/components/talk/message/system/SysGroupDismissed.vue b/src/components/talk/message/system/SysGroupDismissed.vue new file mode 100644 index 0000000..9b3d098 --- /dev/null +++ b/src/components/talk/message/system/SysGroupDismissed.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/constant/message.ts b/src/constant/message.ts index a421418..5b7b8b3 100644 --- a/src/constant/message.ts +++ b/src/constant/message.ts @@ -85,7 +85,7 @@ export const MessageComponents = { [ChatMsgSysGroupMemberQuit]: 'sys-group-member-quit-message', [ChatMsgSysGroupMemberKicked]: 'sys-group-member-kicked-message', // [ChatMsgSysGroupMessageRevoke]: '[撤回消息]', - // [ChatMsgSysGroupDismissed]: '[群解散消息]', + [ChatMsgSysGroupDismissed]: 'sys-group-dismissed', [ChatMsgSysGroupMuted]: 'sys-group-muted-message', [ChatMsgSysGroupCancelMuted]: 'sys-group-cancel-muted-message', [ChatMsgSysGroupMemberMuted]: 'sys-group-member-muted-message', diff --git a/src/event/talk.js b/src/event/talk.js index 5d7bc0e..4a9579b 100644 --- a/src/event/talk.js +++ b/src/event/talk.js @@ -125,22 +125,27 @@ class Talk extends Base { this.insertTalkRecord() } else { this.updateTalkItem() - if (typeof plus !== 'undefined') { - let OAWebView = plus.webview.all() - OAWebView.forEach((webview) => { - if (webview.id === 'webviewId1') { - webview.evalJS(`updateUnreadMsgNumAdd()`) - } - }) - } else { - document.addEventListener('plusready', () => { + if ( + !useTalkStore().items[useTalkStore().findTalkIndex(this.getIndexName())] + .is_disturb + ) { + if (typeof plus !== 'undefined') { let OAWebView = plus.webview.all() OAWebView.forEach((webview) => { if (webview.id === 'webviewId1') { webview.evalJS(`updateUnreadMsgNumAdd()`) } }) - }) + } else { + document.addEventListener('plusready', () => { + let OAWebView = plus.webview.all() + OAWebView.forEach((webview) => { + if (webview.id === 'webviewId1') { + webview.evalJS(`updateUnreadMsgNumAdd()`) + } + }) + }) + } } } } @@ -204,6 +209,30 @@ class Talk extends Base { if ([1102, 1103, 1104, 1115].includes(record.msg_type)) { useDialogueStore().updateGroupMembers() } + + //群解散时,需要更新群成员权限 + if ([1106].includes(record.msg_type)) { + useDialogueStore().updateDismiss() + } + + //群成员被移出时,需要更新群成员权限 + if ([1104, 1115].includes(record.msg_type)) { + useDialogueStore().updateQuit() + } + + //群禁言变化时,需要更新群禁言状态——即更新群成员列表 + if ([1107, 1108, 1109, 1110].includes(record.msg_type)) { + useDialogueStore().updateGroupMembers() + } + //群公告变化时,需要更新群公告(新增和修改有热更新,删除没有) + if ([13].includes(record.msg_type)) { + useGroupStore().ServeGetGroupNotices() + } + //群管理员变化时,需要更新群管理员列表——即更新群成员列表,同时更新群信息 + if ([1114].includes(record.msg_type)) { + useDialogueStore().updateGroupMembers() + useGroupStore().ServeGroupDetail() + } if ([1116].includes(record.msg_type)) { // 更新会话信息 useDialogueStore().setDialogue({ diff --git a/src/pages/chatSettings/index.vue b/src/pages/chatSettings/index.vue index 0afb54d..c0dca72 100644 --- a/src/pages/chatSettings/index.vue +++ b/src/pages/chatSettings/index.vue @@ -267,8 +267,8 @@ onLoad(async (options) => { if (options.groupId) { console.log(options.groupId) state.groupId = Number(options.groupId) - await groupStore.ServeGroupDetail() if (dialogueParams.type === 2) { + await groupStore.ServeGroupDetail() await groupStore.ServeGetGroupNotices() } } @@ -566,7 +566,10 @@ const showConfirmPrompt = (flag) => { confirmContent = t('group.dismiss.confirm') } else if (flag === 3) { //最后一个管理员退群就解散群聊 - if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + if ( + dialogueParams.adminList.length === 1 && + dialogueParams.adminList[0].id === dialogueParams.uid + ) { //解散群聊 confirmContent = t('ok') + t('group.quit.btn') subContent = t('groupManage.disband.hint') @@ -604,7 +607,10 @@ const showConfirmPrompt = (flag) => { } } else if (flag === 3) { //最后一个管理员退群就解散群聊 - if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + if ( + dialogueParams.adminList.length === 1 && + dialogueParams.adminList[0].id === dialogueParams.uid + ) { //解散群聊 let params = { group_id: dialogueParams.receiver_id, //群id @@ -624,7 +630,9 @@ const showConfirmPrompt = (flag) => { group_id: dialogueParams.receiver_id, }).then(({ code, message }) => { if (code == 200) { - // dialogueStore.apiClearRecord() + uni.navigateBack({ + delta: 2, + }) } else { } }) diff --git a/src/pages/dialog/components/filePanel.vue b/src/pages/dialog/components/filePanel.vue index b0769fa..22553d9 100644 --- a/src/pages/dialog/components/filePanel.vue +++ b/src/pages/dialog/components/filePanel.vue @@ -72,7 +72,7 @@ const props = defineProps({ }) const state = reactive({ - base64Url: '' + base64Url: '', }) const uploadsStore = useUploadsStore() @@ -94,17 +94,54 @@ const onProgressFn = (progress, id) => { const photoActionsSelect = (index) => { if (index === 0) { - uni.chooseImage({ - sourceType: ['album'], - count: 9, - success: async (res) => { - console.log(res, 'res') - res.tempFiles.forEach(async (file) => { - let data = await onUploadImageVideo(file, 'image') - emit('selectImg', data, data.file_num) - }) - }, - }) + if (typeof plus === 'undefined') { + uni.chooseImage({ + sourceType: ['album'], + count: 9, + success: async (res) => { + console.log(res, 'res') + res.tempFiles.forEach(async (file) => { + let data = await onUploadImageVideo(file, 'image') + emit('selectImg', data, data.file_num) + }) + }, + }) + } else { + plus?.gallery.pick( + (res) => { + console.log(res, 'res') + res.files.reverse() + res.files.forEach(async (filePath) => { + plus?.io?.resolveLocalFileSystemURL( + filePath, + async (entry) => { + entry.file((file) => { + const fileReader = new plus.io.FileReader() + fileReader.readAsDataURL(file) + fileReader.onloadend = async (e) => { + const base64Url = e.target.result + const fileObj = base64ToFile(base64Url) + let data = await onUploadImageVideo(fileObj, 'image') + emit('selectImg', data, data.file_num) + } + }) + }, + (err) => { + console.log(err) + }, + ) + }) + }, + (err) => { + console.log(err) + }, + { + filter: 'image', + maximum: 9, + multiple: true, + }, + ) + } } else { uni.chooseVideo({ sourceType: ['album'], diff --git a/src/pages/index/components/chatItem.vue b/src/pages/index/components/chatItem.vue index 61a0200..b2cd819 100644 --- a/src/pages/index/components/chatItem.vue +++ b/src/pages/index/components/chatItem.vue @@ -65,6 +65,9 @@
+ + [有人@你] + {{ props.data.msg_text }}
@@ -135,10 +138,13 @@ const cellClick = () => { // 清空消息未读数 if (props.data.unread_num > 0) { - ServeClearTalkUnreadNum({ - talk_type: props.data.talk_type, - receiver_id: props.data.receiver_id, - },dialogueParams.unReadNum).then(() => { + ServeClearTalkUnreadNum( + { + talk_type: props.data.talk_type, + receiver_id: props.data.receiver_id, + }, + dialogueParams.unReadNum, + ).then(() => { talkStore.updateItem({ index_name: props.data.index_name, unread_num: 0, diff --git a/src/pages/search/searchByCondition/index.vue b/src/pages/search/searchByCondition/index.vue index 1cae687..362b5e4 100644 --- a/src/pages/search/searchByCondition/index.vue +++ b/src/pages/search/searchByCondition/index.vue @@ -123,7 +123,10 @@ state.condition === 'imgAndVideo' ? '0 0 10rpx' : '', }" > -
+
- + +
+
+ +
@@ -263,13 +285,14 @@ import fileType_EXCEL from '@/static/image/search/fileType_EXCEL.png' import fileType_WORD from '@/static/image/search/fileType_WORD.png' import fileType_PDF from '@/static/image/search/fileType_PDF.png' import fileType_Files from '@/static/image/search/fileType_Files.png' +import playCircle from "@/static/image/chatList/playCircle@2x.png" import { fileFormatSize, fileSuffix } from '@/utils/strings' import searchItem from '../components/searchItem.vue' import customInput from '@/components/custom-input/custom-input.vue' import ZPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue' import useZPaging from '@/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js' import { parseTime } from '@/utils/datetime' -import { onMounted, reactive, computed, ref } from 'vue' +import { onMounted, reactive, computed, ref, nextTick } from 'vue' import { onLoad } from '@dcloudio/uni-app' import { ServeTalkDate, ServeGetSessionId } from '@/api/search/index' import { ServeFindTalkRecords } from '@/api/chat/index' @@ -308,6 +331,37 @@ const state = reactive({ flatList: [], // 用于存储扁平化的数据 }) +const videoContext = ref() +const open = ref(false) +const currentVideoUrl = ref('') + +const fullscreenchange = (e) => { + if (!e.detail.fullScreen) { + videoContext.value.stop() + videoContext.value.seek(0) + open.value = false + } +} + +async function onPlay(url) { + currentVideoUrl.value = url + open.value = true + + // 等待 DOM 更新 + await nextTick() + + // 创建新的视频上下文 + videoContext.value = uni.createVideoContext(url, getCurrentInstance()) + + // 先请求全屏 + videoContext.value.requestFullScreen({ direction: 2 }) + + // 延迟一下再播放,确保全屏已经完成 + setTimeout(() => { + videoContext.value.play() + }, 100) +} + onLoad((options) => { console.log(options) if (options.condition) { @@ -829,6 +883,25 @@ body::v-deep .round-3 { width: 164rpx !important; height: 164rpx !important; } + .video-preview { + position: relative; + width: 164rpx; + height: 164rpx; + cursor: pointer; + .play-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + img{ + width: 80rpx !important; + height: 80rpx !important; + } + display: flex; + align-items: center; + justify-content: center; + } + } } } } diff --git a/src/store/modules/dialogue.js b/src/store/modules/dialogue.js index 07f64ad..d3595da 100644 --- a/src/store/modules/dialogue.js +++ b/src/store/modules/dialogue.js @@ -98,6 +98,16 @@ export const useDialogueStore = defineStore('dialogue', { this.unreadNum = 0 }, + // 更新群解散状态 + updateDismiss() { + this.isDismiss = true + }, + + // 更新群成员退出状态 + updateQuit() { + this.isQuit = true + }, + // 更新对话信息 setDialogue(data = {}) { this.online = data.is_online == 1