basic setup to set devices
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
import React, { useContext, useEffect } from 'react';
|
import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';
|
||||||
|
import { useMediaDevices, useMount } from 'react-use';
|
||||||
|
|
||||||
import { useImmer } from 'use-immer';
|
import { useImmer } from 'use-immer';
|
||||||
|
import { useSnackbar } from 'notistack';
|
||||||
|
|
||||||
// device ids for different types of content
|
// device ids for different types of content
|
||||||
type DeviceSelections = { audio?: string; video?: string };
|
type DeviceSelections = { audio?: string; video?: string };
|
||||||
@@ -13,19 +15,59 @@ interface ICommunicationsContext {
|
|||||||
|
|
||||||
const CommunicationsContext = React.createContext<ICommunicationsContext>({});
|
const CommunicationsContext = React.createContext<ICommunicationsContext>({});
|
||||||
|
|
||||||
|
function useUserDevices() {
|
||||||
|
const devices = useMemo(() => {
|
||||||
|
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
|
||||||
|
console.log('enumerateDevices() not supported.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// List cameras and microphones.
|
||||||
|
let mediaDeviceInfo: MediaDeviceInfo[] = [];
|
||||||
|
|
||||||
|
navigator.mediaDevices
|
||||||
|
.enumerateDevices()
|
||||||
|
.then((devices) => {
|
||||||
|
devices.forEach((device) => {
|
||||||
|
console.log(device.kind + ': ' + device.label + ' id = ' + device.deviceId);
|
||||||
|
});
|
||||||
|
mediaDeviceInfo = devices;
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
console.log(err.name + ': ' + err.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
return mediaDeviceInfo;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const audioOutputDevices = useMemo(
|
||||||
|
() => devices.filter((device) => device.kind === 'audiooutput') ?? [],
|
||||||
|
[devices],
|
||||||
|
);
|
||||||
|
const audioInputDevices = useMemo(
|
||||||
|
() => devices.filter((device) => device.kind === 'audioinput') ?? [],
|
||||||
|
[devices],
|
||||||
|
);
|
||||||
|
const videoInputDevices = useMemo(
|
||||||
|
() => devices.filter((device) => device.kind === 'videoinput') ?? [],
|
||||||
|
[devices],
|
||||||
|
);
|
||||||
|
|
||||||
|
return { audioOutputDevices, audioInputDevices, videoInputDevices };
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo save the selected devices in localstorage
|
||||||
export function CommunicationsProvider({ children }: { children: React.ReactNode }) {
|
export function CommunicationsProvider({ children }: { children: React.ReactNode }) {
|
||||||
|
const { enqueueSnackbar } = useSnackbar();
|
||||||
const [userDeviceSelections, setUserDeviceSelections] = useImmer<DeviceSelections>({});
|
const [userDeviceSelections, setUserDeviceSelections] = useImmer<DeviceSelections>({});
|
||||||
|
|
||||||
// todo save the selected devices in localstorage
|
const devices = useUserDevices();
|
||||||
|
|
||||||
useEffect(() => {
|
// const getUserAudioDevices = useMemo(() => {
|
||||||
navigator.mediaDevices
|
// console.log(devices);
|
||||||
.getDisplayMedia()
|
// }, [devices]);
|
||||||
.then((mediaStream) => {
|
|
||||||
console.log('selected stream', mediaStream);
|
// useMount(getUserAudioDevices);
|
||||||
})
|
|
||||||
.catch(console.error);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CommunicationsContext.Provider value={{ userDeviceSelections }}>
|
<CommunicationsContext.Provider value={{ userDeviceSelections }}>
|
||||||
|
|||||||
Reference in New Issue
Block a user