daily-examples/dailyjs/shared/contexts/CallProvider.js

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);