From 6afb1f33522e93dddd5589ec4d011ded336cdca1 Mon Sep 17 00:00:00 2001 From: talksik Date: Sun, 19 Jun 2022 17:01:35 -0500 Subject: [PATCH] showing devices in dropdown --- packages/desktop/src/hooks/useDevices.tsx | 50 +++++++++++++++++++ .../src/providers/ConversationProvider.tsx | 31 ------------ packages/desktop/src/tree/FooterControls.tsx | 44 +++++++++------- 3 files changed, 77 insertions(+), 48 deletions(-) create mode 100644 packages/desktop/src/hooks/useDevices.tsx diff --git a/packages/desktop/src/hooks/useDevices.tsx b/packages/desktop/src/hooks/useDevices.tsx new file mode 100644 index 0000000..84b2442 --- /dev/null +++ b/packages/desktop/src/hooks/useDevices.tsx @@ -0,0 +1,50 @@ +import { useEffect, useState } from 'react'; + +export default function useDevices() { + const [devices, setDevices] = useState<{ + audioInputDevices: MediaDeviceInfo[]; + videoDevices: MediaDeviceInfo[]; + }>({ audioInputDevices: [], videoDevices: [] }); + + useEffect(() => { + navigator.mediaDevices.enumerateDevices().then((devices) => { + const uniqueDevices: MediaDeviceInfo[] = []; + + const uniqueGroupIds = []; + devices.forEach((device) => { + if (!uniqueGroupIds.includes(device.groupId)) { + uniqueDevices.push(device); + uniqueGroupIds.push(device.groupId); + } + }); + + const audioInputDevices: MediaDeviceInfo[] = []; + const videoInputDevices: MediaDeviceInfo[] = []; + + uniqueDevices.map((uniqueDevice) => { + if (uniqueDevice.kind === 'audioinput') { + audioInputDevices.push(uniqueDevice); + return; + } + + if (uniqueDevice.kind === 'videoinput') { + videoInputDevices.push(uniqueDevice); + return; + } + }); + + setDevices({ audioInputDevices: audioInputDevices, videoDevices: videoInputDevices }); + }); + }, []); + + // navigator.mediaDevices + // .getUserMedia({ + // video: videoConstraints, + // audio: true, + // }) + // .then((localMediaStream: MediaStream) => { + // setUserLocalStream(localMediaStream); + // }); + + return devices; +} diff --git a/packages/desktop/src/providers/ConversationProvider.tsx b/packages/desktop/src/providers/ConversationProvider.tsx index 0da48c5..41328ea 100644 --- a/packages/desktop/src/providers/ConversationProvider.tsx +++ b/packages/desktop/src/providers/ConversationProvider.tsx @@ -419,37 +419,6 @@ const iceServers = [ // }, ]; -function useDevices() { - const [devices, setDevices] = useState([]); - - useEffect(() => { - navigator.mediaDevices.enumerateDevices().then((devices) => { - const uniqueDevices: MediaDeviceInfo[] = []; - - const uniqueGroupIds = []; - devices.forEach((device) => { - if (!uniqueGroupIds.includes(device.groupId)) { - uniqueDevices.push(device); - uniqueGroupIds.push(device.groupId); - } - }); - - setDevices(uniqueDevices); - }); - }, []); - - // navigator.mediaDevices - // .getUserMedia({ - // video: videoConstraints, - // audio: true, - // }) - // .then((localMediaStream: MediaStream) => { - // setUserLocalStream(localMediaStream); - // }); - - return devices; -} - // renderless component to manage a room and send data upward for other components // - decoupled from sockets and other data, render if you want to join x room // - unmount if you want to leave room diff --git a/packages/desktop/src/tree/FooterControls.tsx b/packages/desktop/src/tree/FooterControls.tsx index 4537423..665bae6 100644 --- a/packages/desktop/src/tree/FooterControls.tsx +++ b/packages/desktop/src/tree/FooterControls.tsx @@ -44,6 +44,7 @@ import { SUPPORT_DISPLAY_NAME } from '../util/support'; import { blueGrey } from '@mui/material/colors'; import useAuth from '../providers/AuthProvider'; import useConversations from '../providers/ConversationProvider'; +import useDevices from '../hooks/useDevices'; import useSearch from '../providers/SearchProvider'; import useZen from '../providers/ZenProvider'; @@ -242,8 +243,11 @@ export default function FooterControls() { ); } +const NO_DEVICE_SELECTION = 'NA'; + function UserSettingsDialog({ open, handleClose }: { handleClose: () => void; open: boolean }) { const { user, handleLogout } = useAuth(); + const devices = useDevices(); const { omniSearch } = useSearch(); const handleQuickDialSupport = useCallback(() => { @@ -289,15 +293,18 @@ function UserSettingsDialog({ open, handleClose }: { handleClose: () => void; op Microphone - + None - - {'Macbook Pro High Definition'} - - Twenty - Thirty + {devices.audioInputDevices.map((deviceInfo) => ( + + {deviceInfo.label} + + ))} Your speaker selection should be done on your computer status or taskbar. Please @@ -308,25 +315,28 @@ function UserSettingsDialog({ open, handleClose }: { handleClose: () => void; op Video - + None - {'HD Macbook Pro'} - Twenty - Thirty + {devices.videoDevices.map((deviceInfo) => ( + + {deviceInfo.label} + + ))} Screen - + None - - {'Chrome browser - stack overflow'} - + {'coming soon'} Twenty Thirty