UNPKG

@fishjam-cloud/react-client

Version:
71 lines (70 loc) 4.15 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { FishjamClient } from "@fishjam-cloud/ts-client"; import { useMemo, useRef } from "react"; import { CameraContext } from "./contexts/camera"; import { CustomSourceContext } from "./contexts/customSource"; import { FishjamClientContext } from "./contexts/fishjamClient"; import { FishjamIdContext } from "./contexts/fishjamId"; import { FishjamClientStateContext } from "./contexts/fishjamState"; import { InitDevicesContext } from "./contexts/initDevices"; import { MicrophoneContext } from "./contexts/microphone"; import { PeerStatusContext } from "./contexts/peerStatus"; import { ScreenshareContext } from "./contexts/screenshare"; import { VIDEO_TRACK_CONSTRAINTS } from "./devices/constraints"; import { useMediaDevices } from "./hooks/internal/devices/useMediaDevices"; import { useCustomSourceManager } from "./hooks/internal/useCustomSourceManager"; import { useFishjamClientState } from "./hooks/internal/useFishjamClientState"; import { usePeerStatus } from "./hooks/internal/usePeerStatus"; import { useScreenShareManager } from "./hooks/internal/useScreenshareManager"; import { useTrackManager } from "./hooks/internal/useTrackManager"; import { mergeWithDefaultBandwitdthLimits } from "./utils/bandwidth"; import { getLastDevice, saveLastDevice } from "./utils/localStorage"; /** * Provides the Fishjam Context * @category Components */ export function FishjamProvider(props) { const fishjamClientRef = useRef(new FishjamClient({ reconnect: props.reconnect })); const persistHandlers = useMemo(() => { if (props.persistLastDevice === false) return undefined; if (typeof props.persistLastDevice === "object") return props.persistLastDevice; return { getLastDevice, saveLastDevice }; }, [props.persistLastDevice]); const { cameraManager, microphoneManager, initializeDevices } = useMediaDevices({ videoConstraints: props.constraints?.video ?? VIDEO_TRACK_CONSTRAINTS, audioConstraints: props.constraints?.audio ?? true, persistHandlers, }); const peerStatus = usePeerStatus(fishjamClientRef.current); const mergedBandwidthLimits = useMemo(() => mergeWithDefaultBandwitdthLimits(props.bandwidthLimits), [props.bandwidthLimits]); const videoTrackManager = useTrackManager({ tsClient: fishjamClientRef.current, peerStatus, deviceManager: cameraManager, bandwidthLimits: mergedBandwidthLimits, streamConfig: props.videoConfig, type: "camera", }); const audioTrackManager = useTrackManager({ tsClient: fishjamClientRef.current, peerStatus, deviceManager: microphoneManager, bandwidthLimits: mergedBandwidthLimits, streamConfig: props.audioConfig, type: "microphone", }); const screenShareManager = useScreenShareManager({ fishjamClient: fishjamClientRef.current, peerStatus, }); const cameraContext = useMemo(() => ({ videoTrackManager, cameraManager }), [videoTrackManager, cameraManager]); const microphoneContext = useMemo(() => ({ audioTrackManager, microphoneManager }), [audioTrackManager, microphoneManager]); const customSourceManager = useCustomSourceManager({ fishjamClient: fishjamClientRef.current, peerStatus, }); const fishjamClientState = useFishjamClientState(fishjamClientRef.current); return (_jsx(FishjamClientContext.Provider, { value: fishjamClientRef, children: _jsx(FishjamClientStateContext.Provider, { value: fishjamClientState, children: _jsx(FishjamIdContext.Provider, { value: props.fishjamId ?? null, children: _jsx(InitDevicesContext.Provider, { value: initializeDevices, children: _jsx(PeerStatusContext.Provider, { value: peerStatus, children: _jsx(CameraContext.Provider, { value: cameraContext, children: _jsx(MicrophoneContext.Provider, { value: microphoneContext, children: _jsx(ScreenshareContext.Provider, { value: screenShareManager, children: _jsx(CustomSourceContext.Provider, { value: customSourceManager, children: props.children }) }) }) }) }) }) }) }) })); }