xiangyixiangqin/miniapp/App.vue
2026-02-06 17:58:15 +08:00

159 lines
5.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>