diff --git a/src/components/common/GroupAvatarIcon.vue b/src/components/common/GroupAvatarIcon.vue
index fe11116..f8aaf43 100644
--- a/src/components/common/GroupAvatarIcon.vue
+++ b/src/components/common/GroupAvatarIcon.vue
@@ -17,6 +17,8 @@ const avatarSize = computed(() => {
return 50
case 'small':
return 30
+ case 'tiny':
+ return 24
case 'default':
default:
return 40
@@ -31,6 +33,8 @@ const svgSize = computed(() => {
return 30
case 'small':
return 18
+ case 'tiny':
+ return 16
case 'default':
default:
return 24
diff --git a/src/components/common/SelectSessionDialog.vue b/src/components/common/SelectSessionDialog.vue
new file mode 100644
index 0000000..ebd008b
--- /dev/null
+++ b/src/components/common/SelectSessionDialog.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ `已选择:${selected.length} 个会话` }}
+
+
清空
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/item/SessionTitleItem.vue b/src/components/item/SessionTitleItem.vue
new file mode 100644
index 0000000..c4b39ec
--- /dev/null
+++ b/src/components/item/SessionTitleItem.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
diff --git a/src/views/message/MessageLayout.vue b/src/views/message/MessageLayout.vue
index 54b942b..8ad9fef 100644
--- a/src/views/message/MessageLayout.vue
+++ b/src/views/message/MessageLayout.vue
@@ -19,6 +19,7 @@ import InputEditor from '@/views/message/components/InputEditor.vue'
import MessageItem from '@/views/message/components/MessageItem.vue'
import SessionTag from '@/views/message/components/SessionTag.vue'
import SelectUserDialog from '@/components/common/SelectUserDialog.vue'
+import SelectSessionDialog from '@/components/common/SelectSessionDialog.vue'
import {
useUserStore,
useSettingStore,
@@ -522,7 +523,7 @@ const handleSelectedSession = async (sessionId) => {
// 如果是群组,要加载成员列表(显示消息需要account,nickName,avatar信息)
if (selectedSession.value.sessionType === MsgType.GROUP_CHAT) {
// 没有members数据才需要加载成员列表,加载过了就不重复加载了
- if (!groupMembers.value) {
+ if (!groupMembers.value && !isNotInGroup.value) {
const res = await groupInfoService({ groupId: selectedSession.value.remoteId })
groupData.setGroupInfo({
groupId: selectedSession.value.remoteId,
@@ -570,6 +571,92 @@ const sendRead = () => {
}
}
+/**
+ * 处理发送转发的消息
+ */
+const handleSendForwardMsg = async ({ session, content }) => {
+ if (session.sessionType === MsgType.GROUP_CHAT && session.leave) {
+ ElMessage.warning('您已离开该群或群已被解散')
+ return
+ }
+
+ if (session.sessionType === MsgType.GROUP_CHAT) {
+ if (!groupData.groupMembersList[session.remoteId]) {
+ const res = await groupInfoService({ groupId: session.remoteId })
+ groupData.setGroupInfo({
+ groupId: session.remoteId,
+ groupInfo: res.data.data.groupInfo || {}
+ })
+ groupData.setGroupMembers({
+ groupId: session.remoteId,
+ members: res.data.data.members || {}
+ })
+ }
+
+ const meInGroup = groupData.groupMembersList[session.remoteId][myAccount.value]
+ if (
+ meInGroup.mutedMode === 1 ||
+ (groupData.groupInfoList[session.remoteId].allMuted && meInGroup.mutedMode !== 2)
+ ) {
+ ElMessage.warning('您已被禁言,请联系管理员')
+ return
+ }
+ }
+
+ const seq = uuidv4()
+ const msg = {
+ msgId: seq,
+ seq: seq,
+ sessionId: session.sessionId,
+ fromId: myAccount.value,
+ remoteId: session.remoteId,
+ msgType: session.sessionType,
+ content: content,
+ status: msgSendStatus.PENDING,
+ msgTime: new Date(),
+ sendTime: new Date()
+ }
+ messageData.addMsgRecords(msg.sessionId, [msg])
+ messageData.updateMsgKeySort(msg.sessionId)
+
+ if (selectedSessionId.value === msg.sessionId) {
+ capacity.value++
+ msgListReachBottom()
+ }
+
+ const resendInterval = 2000 //2秒
+ const before = (data) => {
+ setTimeout(() => {
+ if (msg.status === msgSendStatus.PENDING) {
+ wsConnect.sendAgent(data)
+ setTimeout(() => {
+ if (msg.status === msgSendStatus.PENDING) {
+ wsConnect.sendAgent(data)
+ setTimeout(() => {
+ if (msg.status === msgSendStatus.PENDING) {
+ wsConnect.sendAgent(data)
+ setTimeout(() => {
+ if (msg.status === msgSendStatus.PENDING) {
+ messageData.updateMsg(msg.sessionId, msg.msgId, {
+ status: msgSendStatus.FAILED
+ })
+ ElMessage.error('消息发送失败')
+ }
+ }, resendInterval)
+ }
+ }, resendInterval)
+ }
+ }, resendInterval)
+ }
+ }, resendInterval)
+ }
+
+ const after = (msgId) => {
+ messageData.updateMsg(msg.sessionId, msg.msgId, { msgId, status: msgSendStatus.OK })
+ }
+ wsConnect.sendMsg(msg.sessionId, msg.remoteId, msg.msgType, msg.content, msg.seq, before, after)
+}
+
/**
* 发送时先添加本地消息,可以立即渲染
*/
@@ -834,7 +921,7 @@ const onShowUserCard = ({ sessionId, account }) => {
})
}
- if (messageData.sessionList[sessionId].sessionType === MsgType.GROUP_CHAT) {
+ if (sessionId && messageData.sessionList[sessionId].sessionType === MsgType.GROUP_CHAT) {
const groupId = selectedSession.value.remoteId
groupData.setOneOfGroupMembers({
groupId: groupId,
@@ -1066,6 +1153,65 @@ const onSelectOprMenu = (label) => {
}
}
+const isShowForwardMsgDialog = ref(false)
+let forwardMsg = {} // 待转发的消息
+const sessionListSortedKey = computed(() => {
+ return sessionListSorted.value
+ .filter((item) => {
+ return !(item.sessionType === MsgType.GROUP_CHAT && item.leave)
+ })
+ .map((item) => item.sessionId)
+})
+
+const showForwardMsgDialog = (msgId) => {
+ forwardMsg = messageData.getMsg(selectedSessionId.value, msgId)
+ isShowForwardMsgDialog.value = true
+}
+
+const handleConfirmForwardMsg = async (sessions) => {
+ const loadingInstance = ElLoading.service(el_loading_options)
+ try {
+ for (const item of sessions) {
+ const sessionId = item.sessionId
+ const remoteId = item.remoteId
+ // 如果没有session,先创建session
+ if (!messageData.sessionList[sessionId]) {
+ const res = await msgChatCreateSessionService({
+ sessionId: sessionId,
+ remoteId: remoteId,
+ sessionType: item.sessionType
+ })
+ messageData.addSession(res.data.data.session)
+ }
+
+ await handleSendForwardMsg({
+ session: item,
+ content: forwardMsg.content
+ .split(/(<.*?>)/)
+ .map((item) => {
+ const sliceStr = item.slice(1, -1)
+ const index = sliceStr.indexOf('-')
+ if (index !== -1) {
+ const nickName = sliceStr.slice(index + 1)
+ if (nickName) {
+ return `@${nickName}`
+ } else {
+ return item
+ }
+ }
+ return item
+ })
+ .join('')
+ })
+ }
+ } catch (error) {
+ console.error('forward msg error: ', error)
+ } finally {
+ loadingInstance.close()
+ isShowForwardMsgDialog.value = false
+ }
+}
+
const showMenuAddOpr = (e) => {
addOprMenuRef.value.handleShowMenu(e)
}
@@ -1307,6 +1453,7 @@ const onShowRecorder = () => {
@resendMsg="handleResendMessage"
@loadFinished="updateScroll"
@showHighlight="handleShowHighlight"
+ @forwardMsg="showForwardMsgDialog"
>
@@ -1432,6 +1579,17 @@ const onShowRecorder = () => {
创建群组
+
+
+ 转发消息
+
+