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

@@ -0,0 +1,31 @@
type Subscriber<T> = (event: T) => void;
export type AppEvent =
| { type: 'NAVIGATE'; payload: { path: string; params?: Record<string, any> } }
| { type: 'NAVIGATE_BACK' }
| { type: 'SHOW_VERIFICATION_MODAL' }
| { type: 'VIBRATE'; payload: { type: 'message' | 'group_message' | 'call' } }
| { type: 'SHOW_TOAST'; payload: { message: string; type: 'success' | 'error' | 'info' } }
| { type: 'AUTH_LOGOUT' }
| { type: 'AUTH_LOGIN'; payload: { userId: string } };
class EventBusClass {
private subscribers: Set<Subscriber<AppEvent>> = new Set();
emit(event: AppEvent): void {
this.subscribers.forEach(subscriber => {
try {
subscriber(event);
} catch (error) {
console.error('[EventBus] Subscriber error:', error);
}
});
}
subscribe(subscriber: Subscriber<AppEvent>): () => void {
this.subscribers.add(subscriber);
return () => this.subscribers.delete(subscriber);
}
}
export const eventBus = new EventBusClass();

2
src/core/events/index.ts Normal file
View File

@@ -0,0 +1,2 @@
export { eventBus, type AppEvent } from './EventBus';
export { useEventBus } from './useEventBus';

View File

@@ -0,0 +1,8 @@
import { useEffect } from 'react';
import { eventBus, AppEvent } from './EventBus';
export function useEventBus(handler: (event: AppEvent) => void): void {
useEffect(() => {
return eventBus.subscribe(handler);
}, [handler]);
}