57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
|
import { useState, useEffect } from "react";
|
||
|
import { CallFeedEvent } from "matrix-js-sdk/src/webrtc/callFeed";
|
||
|
|
||
|
function getCallFeedState(callFeed) {
|
||
|
return {
|
||
|
member: callFeed ? callFeed.getMember() : null,
|
||
|
isLocal: callFeed ? callFeed.isLocal() : false,
|
||
|
speaking: callFeed ? callFeed.isSpeaking() : false,
|
||
|
noVideo: callFeed
|
||
|
? !callFeed.stream || callFeed.stream.getVideoTracks().length === 0
|
||
|
: true,
|
||
|
videoMuted: callFeed ? callFeed.isVideoMuted() : true,
|
||
|
audioMuted: callFeed ? callFeed.isAudioMuted() : true,
|
||
|
stream: callFeed ? callFeed.stream : undefined,
|
||
|
purpose: callFeed ? callFeed.purpose : undefined,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export function useCallFeed(callFeed) {
|
||
|
const [state, setState] = useState(() => getCallFeedState(callFeed));
|
||
|
|
||
|
useEffect(() => {
|
||
|
function onSpeaking(speaking) {
|
||
|
setState((prevState) => ({ ...prevState, speaking }));
|
||
|
}
|
||
|
|
||
|
function onMuteStateChanged(audioMuted, videoMuted) {
|
||
|
setState((prevState) => ({ ...prevState, audioMuted, videoMuted }));
|
||
|
}
|
||
|
|
||
|
function onUpdateCallFeed() {
|
||
|
setState(getCallFeedState(callFeed));
|
||
|
}
|
||
|
|
||
|
if (callFeed) {
|
||
|
callFeed.on(CallFeedEvent.Speaking, onSpeaking);
|
||
|
callFeed.on(CallFeedEvent.MuteStateChanged, onMuteStateChanged);
|
||
|
callFeed.on(CallFeedEvent.NewStream, onUpdateCallFeed);
|
||
|
}
|
||
|
|
||
|
onUpdateCallFeed();
|
||
|
|
||
|
return () => {
|
||
|
if (callFeed) {
|
||
|
callFeed.removeListener(CallFeedEvent.Speaking, onSpeaking);
|
||
|
callFeed.removeListener(
|
||
|
CallFeedEvent.MuteStateChanged,
|
||
|
onMuteStateChanged
|
||
|
);
|
||
|
callFeed.removeListener(CallFeedEvent.NewStream, onUpdateCallFeed);
|
||
|
}
|
||
|
};
|
||
|
}, [callFeed]);
|
||
|
|
||
|
return state;
|
||
|
}
|