159 lines
5.1 KiB
Vue
159 lines
5.1 KiB
Vue
<script>
|
||
import { useConfigStore } from './store/config.js'
|
||
import { useUserStore } from './store/user.js'
|
||
import { useChatStore, MessageType } from './store/chat.js'
|
||
import signalR from './utils/signalr.js'
|
||
|
||
// 交换状态枚举
|
||
const ExchangeStatus = {
|
||
PENDING: 0,
|
||
ACCEPTED: 1,
|
||
REJECTED: 2
|
||
}
|
||
|
||
// 全局 SignalR 事件处理器引用(用于移除监听)
|
||
let globalExchangeResponseHandler = null
|
||
let globalReceiveMessageHandler = null
|
||
|
||
/**
|
||
* 初始化全局 SignalR 连接和事件监听
|
||
* 用于在用户不在聊天页面时也能接收交换响应等通知
|
||
*/
|
||
async function initGlobalSignalR() {
|
||
const userStore = useUserStore()
|
||
const chatStore = useChatStore()
|
||
|
||
if (!userStore.isLoggedIn) {
|
||
console.log('[App] 用户未登录,跳过 SignalR 连接')
|
||
return
|
||
}
|
||
|
||
// 获取未读消息数并更新badge
|
||
chatStore.fetchAllUnreadCounts()
|
||
|
||
try {
|
||
// 连接 SignalR(如果已连接会直接返回)
|
||
await signalR.connect()
|
||
console.log('[App] 全局 SignalR 连接成功')
|
||
|
||
// 移除旧的监听器(防止重复注册)
|
||
if (globalExchangeResponseHandler) {
|
||
signalR.off('ExchangeResponse', globalExchangeResponseHandler)
|
||
}
|
||
if (globalReceiveMessageHandler) {
|
||
signalR.off('ReceiveMessage', globalReceiveMessageHandler)
|
||
}
|
||
|
||
// 全局监听交换响应事件
|
||
globalExchangeResponseHandler = (message) => {
|
||
console.log('[App] 全局收到交换响应:', message)
|
||
|
||
// 如果当前在对应的聊天页面,由聊天页面处理,这里不重复处理
|
||
if (message.sessionId && message.sessionId === chatStore.currentSessionId) {
|
||
console.log('[App] 当前在聊天页面,跳过全局处理')
|
||
return
|
||
}
|
||
|
||
// 更新 chatStore 中对应会话的消息状态
|
||
if (message.extraData) {
|
||
try {
|
||
const extraData = typeof message.extraData === 'string'
|
||
? JSON.parse(message.extraData)
|
||
: message.extraData
|
||
|
||
const requestMessageId = extraData.RequestMessageId || extraData.requestMessageId
|
||
const status = extraData.Status ?? extraData.status ?? ExchangeStatus.PENDING
|
||
const sessionId = message.sessionId
|
||
|
||
console.log('[App] 交换响应详情:', { requestMessageId, status, sessionId })
|
||
|
||
// 更新 chatStore 中的消息
|
||
if (sessionId && chatStore.messagesBySession[sessionId]) {
|
||
const messages = chatStore.messagesBySession[sessionId]
|
||
const requestMsg = messages.find(m => m.id === requestMessageId)
|
||
if (requestMsg) {
|
||
requestMsg.status = status
|
||
console.log('[App] 已更新消息状态:', requestMessageId, status)
|
||
|
||
// 如果同意了交换,更新交换的数据
|
||
if (status === ExchangeStatus.ACCEPTED) {
|
||
if (requestMsg.messageType === MessageType.EXCHANGE_WECHAT) {
|
||
requestMsg.exchangedContent = extraData.senderWeChat || extraData.receiverWeChat ||
|
||
extraData.SenderWeChat || extraData.ReceiverWeChat
|
||
} else if (requestMsg.messageType === MessageType.EXCHANGE_PHOTO) {
|
||
requestMsg.photos = extraData.senderPhotos || extraData.receiverPhotos ||
|
||
extraData.SenderPhotos || extraData.ReceiverPhotos
|
||
requestMsg.photoCount = requestMsg.photos?.length || 0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 显示通知提示
|
||
const isAccepted = status === ExchangeStatus.ACCEPTED
|
||
const typeText = message.messageType === 5 ? '微信' : '照片'
|
||
uni.showToast({
|
||
title: isAccepted ? `对方已同意交换${typeText}` : `对方已拒绝交换${typeText}`,
|
||
icon: 'none',
|
||
duration: 2000
|
||
})
|
||
} catch (e) {
|
||
console.error('[App] 解析交换响应数据失败:', e)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 全局监听新消息事件(用于更新未读数等)
|
||
globalReceiveMessageHandler = (message) => {
|
||
console.log('[App] 全局收到新消息:', message)
|
||
|
||
// 如果当前在对应的聊天页面,由聊天页面处理,这里不重复处理
|
||
if (message.sessionId && message.sessionId === chatStore.currentSessionId) {
|
||
console.log('[App] 当前在聊天页面,跳过全局处理')
|
||
return
|
||
}
|
||
|
||
// 不在聊天页面时,增加未读数并更新badge
|
||
if (message.sessionId) {
|
||
chatStore.incrementUnreadCount(message.sessionId)
|
||
}
|
||
}
|
||
|
||
signalR.on('ExchangeResponse', globalExchangeResponseHandler)
|
||
signalR.on('ReceiveMessage', globalReceiveMessageHandler)
|
||
|
||
console.log('[App] 全局 SignalR 事件监听已注册')
|
||
} catch (err) {
|
||
console.error('[App] 全局 SignalR 连接失败:', err)
|
||
}
|
||
}
|
||
|
||
export default {
|
||
onLaunch: function() {
|
||
console.log('App Launch')
|
||
// 恢复用户状态
|
||
const userStore = useUserStore()
|
||
userStore.restoreFromStorage()
|
||
|
||
// 加载所有配置(一次请求)
|
||
const configStore = useConfigStore()
|
||
configStore.loadAppConfig()
|
||
|
||
// 初始化全局 SignalR 连接
|
||
initGlobalSignalR()
|
||
},
|
||
onShow: function() {
|
||
console.log('App Show')
|
||
// 应用从后台切回前台时,重新连接 SignalR
|
||
initGlobalSignalR()
|
||
},
|
||
onHide: function() {
|
||
console.log('App Hide')
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style>
|
||
/*每个页面公共css */
|
||
</style>
|