@fishjam-cloud/react-client
Version:
React client library for Fishjam
71 lines (70 loc) • 4.15 kB
JavaScript
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 }) }) }) }) }) }) }) }) }));
}