xiangyixiangqin/miniapp/api/chat.js
2026-01-29 20:31:24 +08:00

195 lines
5.1 KiB
JavaScript
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.

/**
* 聊天接口模块
* Requirements: 7.1, 7.2, 7.3
*/
import { get, post } from './request'
import config from '../config/index'
import { getToken } from '../utils/storage'
/**
* 获取会话列表
*
* @returns {Promise<Object>} 会话列表
*/
export async function getSessions() {
const response = await get('/chat/sessions')
// 统一返回格式
if (response && response.code === 0) {
// 后端字段映射到前端字段
const list = Array.isArray(response.data) ? response.data : (response.data?.list || [])
const mappedList = list.map(item => ({
sessionId: item.sessionId,
targetUserId: item.otherUserId,
targetNickname: item.otherNickname,
targetAvatar: item.otherAvatar,
otherIsRealName: item.otherIsRealName,
lastMessage: item.lastMessageContent,
lastMessageType: item.lastMessageType,
lastMessageTime: item.lastMessageTime,
unreadCount: item.unreadCount
}))
return {
success: true,
data: mappedList
}
}
return { success: false, data: [] }
}
/**
* 获取消息列表
* WHEN a user opens chat page, THE XiangYi_MiniApp SHALL call endpoint and display message history
* Requirements: 7.1
*
* @param {number} sessionId - 会话ID
* @param {number} [pageIndex=1] - 页码
* @param {number} [pageSize=20] - 每页数量
* @returns {Promise<Object>} 消息列表
*/
export async function getMessages(sessionId, pageIndex = 1, pageSize = 20) {
const response = await get('/chat/messages', { sessionId, pageIndex, pageSize })
return response
}
/**
* 发送消息
* WHEN a user sends a text message, THE XiangYi_MiniApp SHALL call endpoint
* Requirements: 7.2
*
* @param {Object} data - 消息数据
* @param {number} data.sessionId - 会话ID
* @param {number} data.receiverId - 接收者ID
* @param {number} data.messageType - 消息类型1文本 2语音 3图片
* @param {string} data.content - 消息内容
* @returns {Promise<Object>} 发送结果
*/
export async function sendMessage(data) {
const response = await post('/chat/send', data)
return response
}
/**
* 请求交换微信
* WHEN a user clicks "交换微信" button, THE XiangYi_MiniApp SHALL call endpoint
* Requirements: 7.3
*
* @param {number} sessionId - 会话ID
* @param {number} receiverId - 接收者ID
* @returns {Promise<Object>} 交换请求结果
*/
export async function exchangeWeChat(sessionId, receiverId) {
const response = await post('/chat/exchangeWeChat', { sessionId, receiverId })
return response
}
/**
* 请求交换照片
*
* @param {number} sessionId - 会话ID
* @param {number} receiverId - 接收者ID
* @returns {Promise<Object>} 交换请求结果
*/
export async function exchangePhoto(sessionId, receiverId) {
const response = await post('/chat/exchangePhoto', { sessionId, receiverId })
return response
}
/**
* 响应交换请求
*
* @param {number} requestMessageId - 请求消息ID
* @param {boolean} accept - 是否接受
* @returns {Promise<Object>} 响应结果
*/
export async function respondExchange(requestMessageId, accept) {
const response = await post('/chat/respondExchange', { requestMessageId, isAgreed: accept })
return response
}
/**
* 获取未读消息数
*
* @returns {Promise<Object>} 未读消息数
*/
export async function getUnreadCount() {
const response = await get('/chat/unreadCount')
return response
}
/**
* 获取或创建会话
*
* @param {number} targetUserId - 目标用户ID
* @returns {Promise<Object>} 会话ID
*/
export async function getOrCreateSession(targetUserId) {
const response = await get('/chat/session', { targetUserId })
return response
}
/**
* 删除会话
*
* @param {number} sessionId - 会话ID
* @returns {Promise<Object>} 删除结果
*/
export async function deleteSession(sessionId) {
const response = await post('/chat/session/delete', { sessionId })
return response
}
/**
* 上传语音文件
*
* @param {string} filePath - 临时文件路径
* @returns {Promise<Object>} 上传结果,包含 voiceUrl
*/
export async function uploadVoice(filePath) {
return new Promise((resolve, reject) => {
// 简化 URL 拼接
const uploadUrl = `${config.API_BASE_URL}/upload/voice`
uni.uploadFile({
url: uploadUrl,
filePath: filePath,
name: 'file',
header: {
'Authorization': `Bearer ${getToken()}`
},
success: (res) => {
if (res.statusCode === 200) {
try {
const data = JSON.parse(res.data)
if (data.code === 0) {
resolve(data)
} else {
reject(new Error(data.message || '上传失败'))
}
} catch (e) {
reject(new Error('解析响应失败'))
}
} else {
reject(new Error(`上传失败: ${res.statusCode}`))
}
},
fail: (err) => {
reject(new Error(err.errMsg || '网络错误'))
}
})
})
}
export default {
getSessions,
getMessages,
sendMessage,
exchangeWeChat,
exchangePhoto,
respondExchange,
getUnreadCount,
getOrCreateSession,
deleteSession,
uploadVoice
}