195 lines
5.1 KiB
JavaScript
195 lines
5.1 KiB
JavaScript
/**
|
||
* 聊天接口模块
|
||
* 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
|
||
}
|