/** * 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, join, state } = 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 ( {children} ); }; CallProvider.propTypes = { children: PropTypes.node, domain: PropTypes.string.isRequired, room: PropTypes.string.isRequired, token: PropTypes.string, subscribeToTracksAutomatically: PropTypes.bool, }; export const useCallState = () => useContext(CallContext);