// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { AudioInputDevice } from 'amazon-chime-sdk-js'; import React, { createContext, useContext, useState } from 'react'; import { AudioVideoProvider } from '../AudioVideoProvider'; import { ContentShareProvider } from '../ContentShareProvider'; import { DevicesProvider } from '../DevicesProvider'; import { FeaturedVideoTileProvider } from '../FeaturedVideoTileProvider'; import { LocalAudioOutputProvider } from '../LocalAudioOutputProvider'; import { LocalVideoProvider } from '../LocalVideoProvider'; import { useLogger } from '../LoggerProvider'; import { MeetingEventProvider } from '../MeetingEventProvider'; import { RemoteVideoTileProvider } from '../RemoteVideoTileProvider'; import { RosterProvider } from '../RosterProvider'; import MeetingManager from './MeetingManager'; interface Props { onDeviceReplacement?: ( nextDevice: string, currentDevice: AudioInputDevice ) => Promise; /** Pass a `MeetingManager` instance if you want to share this instance * across multiple different `MeetingProvider`s. This approach has limitations. * Check `meetingManager` prop documentation for more information. */ meetingManager?: MeetingManager; } export const MeetingContext = createContext(null); export const MeetingProvider: React.FC> = ({ onDeviceReplacement, meetingManager: meetingManagerProp, children, }) => { const logger = useLogger(); const [meetingManager] = useState( () => meetingManagerProp || new MeetingManager(logger) ); return ( {children} ); }; export const useMeetingManager = (): MeetingManager => { const meetingManager = useContext(MeetingContext); if (!meetingManager) { throw new Error('useMeetingManager must be used within MeetingProvider'); } return meetingManager; };