|
|
|
@ -1,5 +1,7 @@
|
|
|
|
|
import { EventEmitter } from 'events';
|
|
|
|
|
import type { SendMessagePayload } from '../model/message';
|
|
|
|
|
import { useEffect } from 'react';
|
|
|
|
|
import { useUpdateRef } from '../hooks/useUpdateRef';
|
|
|
|
|
import type { ChatMessage, SendMessagePayload } from '../model/message';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 共享事件类型
|
|
|
|
@ -21,6 +23,13 @@ export interface SharedEventMap {
|
|
|
|
|
* 发送消息
|
|
|
|
|
*/
|
|
|
|
|
sendMessage: (payload: SendMessagePayload) => void;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 回复消息事件
|
|
|
|
|
*
|
|
|
|
|
* 如果为null则是清空
|
|
|
|
|
*/
|
|
|
|
|
replyMessage: (payload: ChatMessage | null) => void;
|
|
|
|
|
}
|
|
|
|
|
export type SharedEventType = keyof SharedEventMap;
|
|
|
|
|
|
|
|
|
@ -43,3 +52,22 @@ export const sharedEvent = {
|
|
|
|
|
bus.emit(eventName, ...args);
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function useSharedEventHandler<
|
|
|
|
|
T extends SharedEventType,
|
|
|
|
|
H extends SharedEventMap[T]
|
|
|
|
|
>(eventName: T, handler: H) {
|
|
|
|
|
const handlerRef = useUpdateRef(handler);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const _handler: SharedEventMap[T] = (...args: any[]) => {
|
|
|
|
|
(handlerRef.current as any)(...args);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
sharedEvent.on(eventName, _handler);
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
sharedEvent.off(eventName, _handler);
|
|
|
|
|
};
|
|
|
|
|
}, []);
|
|
|
|
|
}
|
|
|
|
|