Migrate frontend realtime messaging to SSE.

Switch service integrations and screen/store consumers from websocket events to SSE, and ignore generated dist-web artifacts.

Made-with: Cursor
This commit is contained in:
2026-03-10 12:58:23 +08:00
parent 63e32b15a3
commit be84c01abd
25 changed files with 974 additions and 1305 deletions

View File

@@ -27,9 +27,6 @@ import { uploadService } from '../../../../services/uploadService';
import { ApiError } from '../../../../services/api';
// 【新架构】使用 MessageManager
import { useChat, useGroupTyping, useGroupMuted, messageManager } from '../../../../stores';
import {
websocketService,
} from '../../../../services/websocketService';
import { groupService } from '../../../../services/groupService';
import { userManager } from '../../../../stores/userManager';
import { groupManager } from '../../../../stores/groupManager';
@@ -728,14 +725,7 @@ export const useChatScreen = () => {
const segments = buildTextSegments(trimmedText, replyingTo);
if (isGroupChat && routeGroupId) {
// 群聊消息发送
websocketService.sendGroupChatMessage({
conversationId: conversationId,
groupId: routeGroupId,
segments: segments,
mentionUsers: selectedMentions.length > 0 ? selectedMentions : undefined,
mentionAll: mentionAll || undefined,
});
await messageService.sendMessageByAction('group', conversationId, segments);
setInputText('');
setSelectedMentions([]);
@@ -790,12 +780,7 @@ export const useChatScreen = () => {
const segments = buildImageSegments(uploadResult.url, uploadResult.url, undefined, undefined, replyingTo);
if (isGroupChat && routeGroupId) {
websocketService.sendGroupChatMessage({
conversationId: conversationId,
groupId: routeGroupId,
mediaUrl: uploadResult.url,
segments: segments,
});
await messageService.sendMessageByAction('group', conversationId, segments);
setReplyingTo(null);
} else {
// 【新架构】私聊图片通过 MessageManager 发送
@@ -922,12 +907,7 @@ export const useChatScreen = () => {
const segments = buildImageSegments(stickerUrl, stickerUrl, undefined, undefined, replyingTo);
if (isGroupChat && routeGroupId) {
websocketService.sendGroupChatMessage({
conversationId: conversationId,
groupId: routeGroupId,
mediaUrl: stickerUrl,
segments: segments,
});
await messageService.sendMessageByAction('group', conversationId, segments);
setReplyingTo(null);
} else {
// 【新架构】私聊表情通过 MessageManager 发送
@@ -983,7 +963,7 @@ export const useChatScreen = () => {
const handleRecall = useCallback(async (messageId: string) => {
try {
if (isGroupChat && routeGroupId) {
websocketService.sendGroupRecall(routeGroupId, conversationId!, messageId);
await messageService.recallMessage(messageId);
} else {
await messageService.recallMessage(messageId);
}

View File

@@ -145,7 +145,7 @@ export const EmbeddedChat: React.FC<EmbeddedChatProps> = ({ conversation, onBack
<Text style={styles.senderName}>{item.sender?.nickname || item.sender?.username}</Text>
)}
<Text style={[styles.messageText, isMe ? styles.messageTextMe : styles.messageTextOther]}>
{extractTextFromSegments(item.segments)}
{item.status === 'recalled' ? '消息已撤回' : extractTextFromSegments(item.segments)}
</Text>
</View>
{isMe && (