adding boilerplate prolly won't work

This commit is contained in:
talksik
2022-06-01 20:42:47 -05:00
parent 36edda9f30
commit a6cca6877c
2 changed files with 81 additions and 13 deletions
@@ -1,8 +1,12 @@
import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react'; /* eslint-disable jsx-a11y/media-has-caption */
/* eslint-disable react/jsx-no-comment-textnodes */
import { ConnectOptions, Room, connect } from 'twilio-video';
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import { useMediaDevices, useMount } from 'react-use'; import { useMediaDevices, useMount } from 'react-use';
import TwilioAccessToken from '@nirvana/core/src/functions/response/TwilioAccessToken.response'; import TwilioAccessToken from '@nirvana/core/src/functions/response/TwilioAccessToken.response';
import { getTwilioAccessToken } from '../firebase/functions'; import { getTwilioAccessToken } from '../firebase/functions';
import useConversations from './ConversationProvider';
import { useImmer } from 'use-immer'; import { useImmer } from 'use-immer';
import { useSnackbar } from 'notistack'; import { useSnackbar } from 'notistack';
@@ -54,31 +58,93 @@ interface ICommunicationsContext {
userLocalStream?: MediaStream; userLocalStream?: MediaStream;
userDeviceSelections?: DeviceSelections; userDeviceSelections?: DeviceSelections;
room: Room | null;
} }
const CommunicationsContext = React.createContext<ICommunicationsContext>({}); const CommunicationsContext = React.createContext<ICommunicationsContext>({
room: null,
});
// todo save the selected devices in localstorage // todo save the selected devices in localstorage
export function CommunicationsProvider({ children }: { children: React.ReactNode }) { export function CommunicationsProvider({ children }: { children: React.ReactNode }) {
const { enqueueSnackbar } = useSnackbar(); const { enqueueSnackbar } = useSnackbar();
const [userDeviceSelections, setUserDeviceSelections] = useImmer<DeviceSelections>({}); const [userDeviceSelections, setUserDeviceSelections] = useImmer<DeviceSelections>({});
const { selectedConversation } = useConversations();
const devices = useUserDevices(); const devices = useUserDevices();
const [room, setRoom] = useState<Room | null>(null);
const localAudioRef = useRef<HTMLAudioElement>(null);
const getAuthToken = useCallback(async () => { const getAuthToken = useCallback(async () => {
try { const result = await getTwilioAccessToken();
const result = await getTwilioAccessToken(); const data = result.data as TwilioAccessToken;
const data = result.data as TwilioAccessToken;
enqueueSnackbar('got token data'); enqueueSnackbar('got token data');
return data.token; return data.token;
} catch (error) {
console.error(error);
enqueueSnackbar('something went wrong trying to set up calls', { variant: 'error' });
}
}, [enqueueSnackbar]); }, [enqueueSnackbar]);
const connectToRoom = useCallback(
async (conversationId: string) => {
try {
const token = await getAuthToken();
connect(token, {
name: conversationId,
audio: true,
}).then(
(room) => {
enqueueSnackbar('joined room', { variant: 'success' });
// Log your Client's LocalParticipant in the Room
const localParticipant = room.localParticipant;
console.log(`Connected to the Room as LocalParticipant "${localParticipant.identity}"`);
// Log any Participants already connected to the Room
room.participants.forEach((participant) => {
console.log(`Participant "${participant.identity}" is connected to the Room`);
});
// Log new Participants as they connect to the Room
room.once('participantConnected', (participant) => {
console.log(`Participant "${participant.identity}" has connected to the Room`);
});
// Log Participants as they disconnect from the Room
room.once('participantDisconnected', (participant) => {
console.log(`Participant "${participant.identity}" has disconnected from the Room`);
});
setRoom(room);
},
(error) => {
console.error(`Unable to connect to Room: ${error.message}`);
},
);
} catch (error) {
console.error(error);
enqueueSnackbar('something went wrong trying to set up calls', { variant: 'error' });
}
},
[getAuthToken, enqueueSnackbar, setRoom],
);
// every time conversation is selected
// we should connect to the room and get all of the participant peers
// do a peer to peer room for all cases for now
useEffect(() => {
if (selectedConversation?.id) {
connectToRoom(selectedConversation.id);
} else {
// leave room
setRoom(null);
}
}, [selectedConversation?.id, connectToRoom]);
// const getUserAudioDevices = useMemo(() => { // const getUserAudioDevices = useMemo(() => {
// console.log(devices); // console.log(devices);
// }, [devices]); // }, [devices]);
@@ -95,7 +161,9 @@ export function CommunicationsProvider({ children }: { children: React.ReactNode
}); });
return ( return (
<CommunicationsContext.Provider value={{ userDeviceSelections }}> <CommunicationsContext.Provider value={{ userDeviceSelections, room }}>
<audio autoPlay controls ref={localAudioRef} />
{children} {children}
</CommunicationsContext.Provider> </CommunicationsContext.Provider>
); );
+1 -1
View File
@@ -29,7 +29,7 @@ export const getStreamToken = functions.https.onCall((data, context) => {
return; return;
} }
const identity = 'user'; const identity = context.auth?.uid ?? 'user';
// Create Video Grant // Create Video Grant
const videoGrant = new VideoGrant(); const videoGrant = new VideoGrant();