UNPKG

@jellyfish-dev/browser-media-utils

Version:

Facilitates the use of getUserMedia and enumerateDevices.

95 lines (94 loc) 2.94 kB
import { useCallback, useEffect, useState } from "react"; import { NOOP } from "./utils"; const defaultState = { isError: false, stream: null, isLoading: false, start: NOOP, stop: NOOP, isEnabled: true, disable: NOOP, enable: NOOP, }; const stopTracks = (stream) => { stream.getTracks().forEach((track) => { track.stop(); }); }; /** * Hook that returns media stream and methods to control it, depending on the passed method. * * @param getMedia - Promise that returns a promise with MediaStream * @returns object containing information about the media stream and methods to control it */ export const useMedia = (getMedia) => { const [state, setState] = useState(defaultState); const start = useCallback((getMedia) => { const setEnable = (stream, status) => { stream?.getTracks().forEach((track) => { track.enabled = status; }); setState((prevState) => ({ ...prevState, isEnabled: status, })); }; setState((prevState) => ({ ...prevState, isLoading: true })); return getMedia() .then((mediasStream) => { const stop = () => { stopTracks(mediasStream); setState((prevState) => ({ ...prevState, stop: NOOP, start: () => start(getMedia), stream: null, isEnabled: false, disable: NOOP, enable: NOOP, })); }; setState((prevState) => { return { ...prevState, isLoading: false, stream: mediasStream, start: NOOP, stop: stop, disable: () => setEnable(mediasStream, false), enable: () => setEnable(mediasStream, true), isEnabled: true, }; }); return mediasStream; }) .catch((e) => { setState((prevState) => ({ ...prevState, isLoading: false, isError: true, isEnabled: false, disable: NOOP, enable: NOOP, })); return Promise.reject(e); }); }, []); useEffect(() => { if (!getMedia) return; const result = start(getMedia); return () => { result.then((mediaStream) => { stopTracks(mediaStream); setState((prevState) => ({ ...prevState, stop: NOOP, start: () => start(getMedia), stream: null, })); }); }; }, [getMedia, start]); return state; };