async function fetchGroupCall( client, roomIdOrAlias, viaServers = undefined, timeout = 5000 ) { const { roomId } = await client.joinRoom(roomIdOrAlias, { viaServers }); return new Promise((resolve, reject) => { let timeoutId; function onGroupCallIncoming(groupCall) { if (groupCall && groupCall.room.roomId === roomId) { clearTimeout(timeoutId); client.removeListener("GroupCall.incoming", onGroupCallIncoming); resolve(groupCall); } } const groupCall = client.getGroupCallForRoom(roomId); if (groupCall) { resolve(groupCall); } client.on("GroupCall.incoming", onGroupCallIncoming); if (timeout) { timeoutId = setTimeout(() => { client.removeListener("GroupCall.incoming", onGroupCallIncoming); reject(new Error("Fetching group call timed out.")); }, timeout); } }); } export function useLoadGroupCall(client, roomId, viaServers) { const [state, setState] = useState({ loading: true, error: undefined, groupCall: undefined, }); useEffect(() => { setState({ loading: true }); fetchGroupCall(client, roomId, viaServers, 30000) .then((groupCall) => setState({ loading: false, groupCall })) .catch((error) => setState({ loading: false, error })); }, [client, roomId]); return state; }