95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
/**
|
|
* Call Provider / Context
|
|
* ---
|
|
* Configures the general state of a Daily call, such as which features
|
|
* to enable, as well as instantiate the 'call machine' hook responsible
|
|
* fir the overaching call loop (joining, leaving, etc)
|
|
*/
|
|
import React, {
|
|
createContext,
|
|
useCallback,
|
|
useContext,
|
|
useEffect,
|
|
useState,
|
|
} from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import {
|
|
ACCESS_STATE_LOBBY,
|
|
ACCESS_STATE_UNKNOWN,
|
|
VIDEO_QUALITY_AUTO,
|
|
} from '../constants';
|
|
import { useCallMachine } from './useCallMachine';
|
|
|
|
export const CallContext = createContext();
|
|
|
|
export const CallProvider = ({
|
|
children,
|
|
domain,
|
|
room,
|
|
token = '',
|
|
subscribeToTracksAutomatically = false,
|
|
}) => {
|
|
const [videoQuality, setVideoQuality] = useState(VIDEO_QUALITY_AUTO);
|
|
const [preJoinNonAuthorized, setPreJoinNonAuthorized] = useState(false);
|
|
|
|
// Daily CallMachine hook (primarily handles status of the call)
|
|
const { daily, leave, state, setRedirectOnLeave } = useCallMachine({
|
|
domain,
|
|
room,
|
|
token,
|
|
subscribeToTracksAutomatically,
|
|
});
|
|
|
|
// Convience wrapper for adding a fake participant to the call
|
|
const addFakeParticipant = useCallback(() => {
|
|
daily.addFakeParticipant();
|
|
}, [daily]);
|
|
|
|
// Convenience wrapper for changing the bandwidth of the client
|
|
const setBandwidth = useCallback(
|
|
(quality) => {
|
|
daily.setBandwidth(quality);
|
|
},
|
|
[daily]
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (!daily) return;
|
|
|
|
const { access } = daily.accessState();
|
|
if (access === ACCESS_STATE_UNKNOWN) return;
|
|
|
|
const requiresPermission = access?.level === ACCESS_STATE_LOBBY;
|
|
setPreJoinNonAuthorized(requiresPermission && !token);
|
|
}, [state, daily, token]);
|
|
|
|
return (
|
|
<CallContext.Provider
|
|
value={{
|
|
state,
|
|
callObject: daily,
|
|
addFakeParticipant,
|
|
preJoinNonAuthorized,
|
|
leave,
|
|
videoQuality,
|
|
setVideoQuality,
|
|
setBandwidth,
|
|
setRedirectOnLeave,
|
|
subscribeToTracksAutomatically,
|
|
}}
|
|
>
|
|
{children}
|
|
</CallContext.Provider>
|
|
);
|
|
};
|
|
|
|
CallProvider.propTypes = {
|
|
children: PropTypes.node,
|
|
domain: PropTypes.string.isRequired,
|
|
room: PropTypes.string.isRequired,
|
|
token: PropTypes.string,
|
|
subscribeToTracksAutomatically: PropTypes.bool,
|
|
};
|
|
|
|
export const useCallState = () => useContext(CallContext);
|