@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.
106 lines (104 loc) • 2.98 kB
JavaScript
import {
useHuddle01_default
} from "./chunk-6UAH4WUQ.js";
// src/hooks/usePeerIds.ts
import { useCallback, useEffect, useState } from "react";
var usePeerIds = (props) => {
const { huddleClient } = useHuddle01_default();
const room = huddleClient.room;
const [peerIds, setPeerIds] = useState([]);
const isValidPeer = useCallback(
(data) => {
if (props?.labels) {
for (const label of data.labels) {
if (data.searchLabelSet.has(label)) {
return true;
}
}
return false;
}
if (props?.roles && data.role && !data.validRoles.has(data.role)) {
return false;
}
return true;
},
[]
);
const handleSearch = useCallback(
(peerIds2) => {
const validPeers = [];
const searchLabelSet = new Set(props?.labels);
const validRoles = new Set(props?.roles);
for (const peerId of peerIds2) {
const remotePeer = room.remotePeerExists(peerId);
const remotePeerLabels = remotePeer?.labels || [];
const role = remotePeer?.role || null;
if (isValidPeer({
searchLabelSet,
validRoles,
labels: remotePeerLabels,
role
})) {
validPeers.push(peerId);
}
}
return validPeers;
},
[props?.labels]
);
useEffect(() => {
setPeerIds(handleSearch(room.peerIds));
}, []);
useEffect(() => {
const handlePeerChange = () => {
const newPeerIds = handleSearch(room.peerIds);
setPeerIds(newPeerIds);
};
const handleStreamAdded = (data) => {
if (props?.labels?.includes(data.label)) {
setPeerIds(handleSearch(room.peerIds));
}
};
const handleRoleUpdate = (data) => {
if (props?.onPeerRoleUpdate) {
props.onPeerRoleUpdate(data);
}
if (props?.roles?.includes(data?.prevRole)) {
setPeerIds(handleSearch(room.peerIds));
} else if (props?.roles?.includes(data.newRole)) {
setPeerIds(handleSearch(room.peerIds));
}
};
if (room.state !== "connected") {
room.on("room-joined", handlePeerChange);
}
room.on("new-peer-joined", handlePeerChange);
room.on("peer-left", handlePeerChange);
if (props?.labels) {
room.on("stream-added", handleStreamAdded);
room.on("stream-closed", handleStreamAdded);
}
if (props?.roles) {
room.on("room-role-updated", handleRoleUpdate);
}
return () => {
room.off("new-peer-joined", handlePeerChange);
room.off("peer-left", handlePeerChange);
room.off("room-joined", handlePeerChange);
if (props?.labels) {
room.off("stream-added", handleStreamAdded);
room.off("stream-closed", handleStreamAdded);
}
if (props?.roles) {
room.off("room-role-updated", handleRoleUpdate);
}
};
}, [props?.labels]);
return {
peerIds
};
};
export {
usePeerIds
};
//# sourceMappingURL=chunk-AC5OZUQ2.js.map