refactor(core): introduce EventBus and refactor store infrastructure
All checks were successful
Frontend CI / build-and-push-web (push) Successful in 2m46s
Frontend CI / ota-android (push) Successful in 10m34s
Frontend CI / build-android-apk (push) Successful in 1h15m8s

- Add EventBus for decoupled event-driven communication between services
- Add EventSubscriber component for centralized event handling
- Add requestDedupe utility for shared request deduplication
- Refactor api/wsService to use eventBus instead of direct router navigation
- Extract MessageMapper.toCachedMessages for consistent message mapping
- Remove deprecated BaseManager and CacheBus classes
- Improve @mention rendering with memberMap support in segment rendering
- Update hooks to use useRef instead of useState for fetch tracking
This commit is contained in:
lafay
2026-04-12 18:14:29 +08:00
parent 4b5ce1ba21
commit 6610d2f173
28 changed files with 378 additions and 512 deletions

View File

@@ -721,7 +721,7 @@ export interface SSEEvent extends WSEvent {}
* 从消息segments中提取纯文本内容
* 用于消息列表显示、通知等场景
*/
export function extractTextFromSegments(segments?: MessageSegment[]): string {
export function extractTextFromSegments(segments?: MessageSegment[], memberMap?: Map<string, { nickname: string; user_id: string }>): string {
if (!segments || segments.length === 0) {
return '';
}
@@ -731,7 +731,6 @@ export function extractTextFromSegments(segments?: MessageSegment[]): string {
for (const segment of segments) {
switch (segment.type) {
case 'text':
// 兼容 content 和 text 两种字段
const textData = segment.data as TextSegmentData;
result += textData.content ?? textData.text ?? '';
break;
@@ -739,10 +738,10 @@ export function extractTextFromSegments(segments?: MessageSegment[]): string {
const atData = segment.data as AtSegmentData;
if (atData.user_id === 'all') {
result += '@所有人 ';
} else if (atData.nickname) {
result += `@${atData.nickname} `;
} else {
result += `@${atData.user_id} `;
const member = memberMap?.get(atData.user_id);
const displayName = member?.nickname || atData.nickname || atData.user_id;
result += `@${displayName} `;
}
break;
case 'image':