Add a useEventEmitterThree for livekit's event emitters and use it

This commit is contained in:
David Baker
2023-07-24 21:03:56 +01:00
parent e37783ad7e
commit 9fdafaf395
2 changed files with 20 additions and 7 deletions

View File

@@ -84,6 +84,7 @@ import { useFullscreen } from "./useFullscreen";
import { useLayoutStates } from "../video-grid/Layout"; import { useLayoutStates } from "../video-grid/Layout";
import { useSFUConfig } from "../livekit/OpenIDLoader"; import { useSFUConfig } from "../livekit/OpenIDLoader";
import { E2EELock } from "../E2EELock"; import { E2EELock } from "../E2EELock";
import { useEventEmitterThree } from "../useEvents";
const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {}); const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {});
// There is currently a bug in Safari our our code with cloning and sending MediaStreams // There is currently a bug in Safari our our code with cloning and sending MediaStreams
@@ -204,13 +205,7 @@ export function InCallView({
onLeave(); onLeave();
}, [onLeave]); }, [onLeave]);
useEffect(() => { useEventEmitterThree(livekitRoom, RoomEvent.Disconnected, onDisconnected);
livekitRoom.on(RoomEvent.Disconnected, onDisconnected);
return () => {
livekitRoom.off(RoomEvent.Disconnected, onDisconnected);
};
}, [onDisconnected, livekitRoom]);
useEffect(() => { useEffect(() => {
widget?.api.transport.send( widget?.api.transport.send(

View File

@@ -15,6 +15,7 @@ limitations under the License.
*/ */
import { useEffect } from "react"; import { useEffect } from "react";
import EventEmitter from "eventemitter3";
import type { import type {
Listener, Listener,
@@ -59,3 +60,20 @@ export const useTypedEventEmitter = <
}; };
}, [emitter, eventType, listener]); }, [emitter, eventType, listener]);
}; };
// Shortcut for registering a listener on an eventemitter3 EventEmitter (ie. what the LiveKit SDK uses)
export const useEventEmitterThree = <
EventType extends EventEmitter.ValidEventTypes,
T extends EventEmitter.EventNames<EventType>
>(
emitter: EventEmitter<EventType>,
eventType: T,
listener: EventEmitter.EventListener<EventType, T>
) => {
useEffect(() => {
emitter.on(eventType, listener);
return () => {
emitter.off(eventType, listener);
};
}, [emitter, eventType, listener]);
};