agora-react-native-rtm
Version:
React Native around the Agora RTM SDKs for Android and iOS agora
48 lines (41 loc) • 1.24 kB
text/typescript
import { useEffect, useRef } from 'react';
import { RTMClient } from '../api/RTMClient';
import { RTMClientEventMap } from '../api/RTMEvents';
type Disposer = () => void;
type Nullable<T> = T | null | undefined;
function listen<EventType extends keyof RTMClientEventMap>(
listenable: RTMClient,
event: EventType,
listener: RTMClientEventMap[EventType]
): Disposer;
function listen<EventType extends keyof RTMClientEventMap>(
listenable: RTMClient,
event: EventType,
listener: RTMClientEventMap[EventType]
) {
listenable.addEventListener(event, listener);
return () => listenable.removeEventListener(event, listener);
}
export function useRtmEvent<EventType extends keyof RTMClientEventMap>(
client: Nullable<RTMClient>,
event: EventType,
listener: Nullable<(...args: any[]) => void>
) {
const listenerRef = useRef(listener);
useEffect(() => {
listenerRef.current = listener;
}, [listener]);
useEffect(() => {
if (client) {
return listen(client, event, (...args: any[]) => {
if (listenerRef.current) {
listenerRef.current(...args);
}
});
} else {
return () => {
throw new Error('client is null');
};
}
}, [event, client]);
}