UNPKG

@huddle01/react

Version:

The Huddle01 React SDK offers a comprehensive suite of hooks, methods and event listeners that allow for seamless real-time audio and video communication with minimal coding required.

103 lines (101 loc) 3.17 kB
import { useHuddle01_default } from "./chunk-6UAH4WUQ.js"; // src/hooks/useDevices.ts import { useCallback, useEffect, useState } from "react"; var useDevices = (props) => { const { type } = props; const { huddleClient } = useHuddle01_default(); const localPeer = huddleClient.localPeer; const deviceHandler = localPeer.deviceHandler; const [devices, setDevices] = useState([]); const [preferredDeviceId, setPreferredDeviceId] = useState( deviceHandler.preferredDevices.get(type) || null ); const fetchDevices = () => { return deviceHandler.getMediaDevices(type); }; const handlePermissionGranted = (data) => { if (data.deviceKind === type) { props.onPermissionGranted?.(); } }; const handlePermissionDenied = (data) => { if (data.deviceKind === type) { props.onPermissionDenied?.(); } }; const handleDeviceChange = useCallback(() => { fetchDevices().then((devices2) => { setDevices(devices2); }); }, []); const handlePrefferedDeviceChange = (data) => { if (data.deviceKind === type) { setPreferredDeviceId(data.deviceId); } if (data.deviceId && props?.onDeviceChanged) { props.onDeviceChanged(data.deviceId); } }; useEffect(() => { deviceHandler.once("permission-granted", handlePermissionGranted); deviceHandler.once("permission-denied", handlePermissionDenied); deviceHandler.on("device-change", handleDeviceChange); deviceHandler.on("preferred-device-change", handlePrefferedDeviceChange); if (devices.length === 0) { handleDeviceChange(); } return () => { deviceHandler.off("permission-granted", handlePermissionGranted); deviceHandler.off("permission-denied", handlePermissionDenied); deviceHandler.off("device-change", handleDeviceChange); deviceHandler.off("preferred-device-change", handlePrefferedDeviceChange); }; }, [handleDeviceChange]); const getPermission = async () => { if (typeof navigator !== "undefined" && navigator.mediaDevices) { return { permission: "denied", error: { message: "getUserMedia is not supported in this browser", blocked: { byDeviceInUse: false, byDeviceMissing: false, byPermissions: true } } }; } const stream = await navigator.mediaDevices.getUserMedia({ audio: type === "mic", video: type === "cam" }); for (const track of stream.getTracks()) { track.stop(); } return deviceHandler.getMediaPermission({ mediaDeviceKind: type }); }; const refreshDevices = handleDeviceChange; const fetchStream = deviceHandler.fetchStream; const setPreferredDevice = (deviceId) => { return deviceHandler.setPreferredDevice({ deviceKind: type, deviceId }); }; const preferredDevice = devices.find((device) => device.deviceId === preferredDeviceId) || null; return { devices, refreshDevices, preferredDeviceId, preferredDevice, fetchStream, getPermission, setPreferredDevice }; }; export { useDevices }; //# sourceMappingURL=chunk-TXOYPRCR.js.map