104 lines
2.8 KiB
JavaScript
104 lines
2.8 KiB
JavaScript
|
import {
|
||
|
CONFERENCE_JOINED,
|
||
|
CONFERENCE_WILL_LEAVE,
|
||
|
getCurrentConference
|
||
|
} from '../base/conference';
|
||
|
import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
|
||
|
import { MiddlewareRegistry } from '../base/redux';
|
||
|
import { TRACK_UPDATED, TRACK_REMOVED, TRACK_ADDED } from '../base/tracks';
|
||
|
|
||
|
import { UPDATE_FACE_COORDINATES } from './actionTypes';
|
||
|
import {
|
||
|
loadWorker,
|
||
|
stopFaceRecognition,
|
||
|
startFaceRecognition
|
||
|
} from './actions';
|
||
|
import { FACE_BOX_EVENT_TYPE } from './constants';
|
||
|
|
||
|
MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
||
|
const state = getState();
|
||
|
const { faceCoordinatesSharing } = state['features/base/config'];
|
||
|
|
||
|
if (!getCurrentConference(state)) {
|
||
|
return next(action);
|
||
|
}
|
||
|
|
||
|
if (action.type === CONFERENCE_JOINED) {
|
||
|
if (faceCoordinatesSharing?.enabled) {
|
||
|
dispatch(loadWorker());
|
||
|
}
|
||
|
|
||
|
// allow using remote face centering data when local face centering is not enabled
|
||
|
action.conference.on(
|
||
|
JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
|
||
|
(participant, eventData) => {
|
||
|
if (!participant || !eventData) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (eventData.type === FACE_BOX_EVENT_TYPE) {
|
||
|
dispatch({
|
||
|
type: UPDATE_FACE_COORDINATES,
|
||
|
faceBox: eventData.faceBox,
|
||
|
id: participant.getId()
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return next(action);
|
||
|
}
|
||
|
|
||
|
if (!faceCoordinatesSharing?.enabled) {
|
||
|
return next(action);
|
||
|
}
|
||
|
|
||
|
switch (action.type) {
|
||
|
case CONFERENCE_WILL_LEAVE : {
|
||
|
dispatch(stopFaceRecognition());
|
||
|
|
||
|
return next(action);
|
||
|
}
|
||
|
case TRACK_ADDED: {
|
||
|
const { jitsiTrack: { isLocal, videoType } } = action.track;
|
||
|
|
||
|
if (videoType === 'camera' && isLocal()) {
|
||
|
// need to pass this since the track is not yet added in the store
|
||
|
dispatch(startFaceRecognition(action.track));
|
||
|
}
|
||
|
|
||
|
return next(action);
|
||
|
}
|
||
|
case TRACK_UPDATED: {
|
||
|
const { jitsiTrack: { isLocal, videoType } } = action.track;
|
||
|
|
||
|
if (videoType !== 'camera' || !isLocal()) {
|
||
|
return next(action);
|
||
|
}
|
||
|
|
||
|
const { muted } = action.track;
|
||
|
|
||
|
if (muted !== undefined) {
|
||
|
// addresses video mute state changes
|
||
|
if (muted) {
|
||
|
dispatch(stopFaceRecognition());
|
||
|
} else {
|
||
|
dispatch(startFaceRecognition());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return next(action);
|
||
|
}
|
||
|
case TRACK_REMOVED: {
|
||
|
const { jitsiTrack: { isLocal, videoType } } = action.track;
|
||
|
|
||
|
if (videoType === 'camera' && isLocal()) {
|
||
|
dispatch(stopFaceRecognition());
|
||
|
}
|
||
|
|
||
|
return next(action);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return next(action);
|
||
|
});
|