Files
chat/client/shared/model/message.ts

205 lines
4.2 KiB
TypeScript
Raw Normal View History

2026-04-25 16:36:34 +08:00
import { request } from '../api/request';
import type { ChatMessageReaction, ChatMessage } from 'tailchat-types';
import {
createAutoMergedRequest,
createAutoSplitRequest,
} from '../utils/request';
import _uniq from 'lodash/uniq';
import _flatten from 'lodash/flatten';
import _zipObject from 'lodash/zipObject';
export { ChatMessageReaction, ChatMessage };
export interface LocalChatMessage extends ChatMessage {
/**
*
*/
isLocal?: boolean;
/**
*
*/
sendFailed?: boolean;
}
export interface SimpleMessagePayload {
groupId?: string;
converseId: string;
content: string;
}
export interface SendMessagePayloadMeta {
mentions?: string[];
}
export interface SendMessagePayload extends SimpleMessagePayload {
/**
* content的plain内容
* inbox
*/
plain?: string;
meta?: SendMessagePayloadMeta;
}
/**
*
* @param converseId ID
* @param startId ID
*/
export async function fetchConverseMessage(
converseId: string,
startId?: string
): Promise<ChatMessage[]> {
const { data } = await request.get('/api/chat/message/fetchConverseMessage', {
params: {
converseId,
startId,
},
});
return data;
}
/**
*
* @param payload
*/
export async function sendMessage(
payload: SendMessagePayload
): Promise<ChatMessage> {
const { data } = await request.post('/api/chat/message/sendMessage', payload);
return data;
}
/**
*
* @param messageId ID
*/
export async function recallMessage(messageId: string): Promise<ChatMessage> {
const { data } = await request.post('/api/chat/message/recallMessage', {
messageId,
});
return data;
}
export async function deleteMessage(messageId: string): Promise<boolean> {
const { data } = await request.post('/api/chat/message/deleteMessage', {
messageId,
});
return data;
}
/**
*
* @param converseId id
* @param messageText
*/
export async function searchMessage(
text: string,
converseId: string,
groupId?: string
): Promise<ChatMessage[]> {
const { data } = await request.post('/api/chat/message/searchMessage', {
text,
converseId,
groupId,
});
return data;
}
interface LastMessageInfo {
converseId: string;
lastMessageId: string;
}
/**
* id获取会话最后一条消息的id
*/
async function fetchConverseLastMessages(
converseIds: string[]
): Promise<{ converseId: string; lastMessageId: string }[]> {
const { data } = await request.post(
'/api/chat/message/fetchConverseLastMessages',
{
converseIds,
}
);
return data;
}
export const _fetchConverseLastMessageInfo = createAutoMergedRequest<
string[],
(LastMessageInfo | null)[]
>(
createAutoSplitRequest(
async (converseIdsList) => {
const uniqList = _uniq(_flatten(converseIdsList));
const infoList = await fetchConverseLastMessages(uniqList);
const map = _zipObject<LastMessageInfo | null>(uniqList, infoList);
// 将请求结果根据传输来源重新分组
return converseIdsList.map((converseIds) =>
converseIds.map((converseId) => map[converseId] ?? null)
);
},
'serial',
100
)
);
export function getConverseLastMessageInfo(converseIds: string[]) {
return _fetchConverseLastMessageInfo(converseIds);
}
/**
* @param converseId ID
* @param messageId ID
* @returns
*/
export async function fetchNearbyMessage(params: {
groupId?: string;
converseId: string;
messageId: string;
}): Promise<ChatMessage[]> {
const { data } = await request.post(
'/api/chat/message/fetchNearbyMessage',
params
);
return data;
}
/**
*
*/
export async function addReaction(
messageId: string,
emoji: string
): Promise<boolean> {
const { data } = await request.post('/api/chat/message/addReaction', {
messageId,
emoji,
});
return data;
}
/**
*
*/
export async function removeReaction(
messageId: string,
emoji: string
): Promise<boolean> {
const { data } = await request.post('/api/chat/message/removeReaction', {
messageId,
emoji,
});
return data;
}