@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
JavaScript
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