Skip to content

Commit

Permalink
fix(hooks): modify useMeeting so it will not create new meetings
Browse files Browse the repository at this point in the history
  • Loading branch information
lalli-flores committed Jan 29, 2020
1 parent 52e9851 commit 49b5559
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 41 deletions.
11 changes: 2 additions & 9 deletions src/components/hooks/__mocks__/useMeeting.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
import {useContext} from 'react';

export default function useMeeting(meetingID, meetingDestination) {
export default function useMeeting(meetingID) {
const datasource = useContext();
let result = {};

if (meetingID in datasource.meetingsAdapter) {
result = datasource.meetingsAdapter[meetingID];
} else if (meetingDestination) {
result = datasource.meetingsAdapter[meetingDestination];
}

return result;
return meetingID ? datasource.meetingsAdapter[meetingID] : {};
}
55 changes: 23 additions & 32 deletions src/components/hooks/useMeeting.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,47 @@
import {useEffect, useContext, useState} from 'react';
import {from} from 'rxjs';
import {delayWhen, flatMap, take} from 'rxjs/operators';

import {AdapterContext} from '../../components/';

/**
* Custom hook that returns meeting data of the given ID.
* If no ID is given, a `meetingDestination` must be provided to
* create a new meeting.
*
* @param {string} meetingID ID of the meeting for which to return data.
* @param {string} meetingDestination Virtual location where the meeting should take place.
* @param {string} meetingID ID of the meeting for which to get data
* @returns {Meeting} Data of the meeting
*/
export default function useMeeting(meetingID, meetingDestination) {
const [meeting, setMeeting] = useState({});
export default function useMeeting(meetingID) {
const emptyMeeting = {
ID: null,
title: null,
localAudio: null,
localVideo: null,
remoteAudio: null,
remoteVideo: null,
};

const [meeting, setMeeting] = useState(emptyMeeting);
const {meetingsAdapter} = useContext(AdapterContext);

useEffect(() => {
let subscription;
// React won't recognize the meeting attributes have been updated
// since the state is the meeting object itself. We need to create a new
// meeting object trigger the state change
const onMeeting = (newMeeting) => {
setMeeting({...newMeeting});
};
const onError = (error) => {
throw error;
};
const onMeeting = (newMeeting) => {
// React won't recognize the meeting attributes have been updated
// since the state is the meeting object itself. We need to create a new
// meeting object trigger the state change
setMeeting({...newMeeting});
const onComplete = () => {
setMeeting(emptyMeeting);
};

if (meetingID) {
subscription = meetingsAdapter.getMeeting(meetingID).subscribe(onMeeting, onError);
} else if (meetingDestination) {
// Create a meeting, start event listeners by subscribing to getMeeting,
// wait for local media to get added and complete
subscription = meetingsAdapter
.createMeeting(meetingDestination)
.pipe(
flatMap(({ID}) => meetingsAdapter.getMeeting(ID)),
take(1),
delayWhen(({ID}) => from(meetingsAdapter.addLocalMedia(ID)))
)
.subscribe(onMeeting, onError);
}
const subscription = meetingsAdapter.getMeeting(meetingID).subscribe(onMeeting, onError, onComplete);

return () => {
if (subscription) {
subscription.unsubscribe();
}
subscription.unsubscribe();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [meetingID, meetingDestination]);
}, [meetingID]);

return meeting;
}

0 comments on commit 49b5559

Please sign in to comment.