@connectycube/use-calls
Version:
A React hook for state management in ConnectyCube-powered audio/video calls solutions
3 lines (2 loc) • 11.8 kB
JavaScript
;var e=require("react/jsx-runtime"),a=require("react"),t=require("connectycube"),s=require("connectycube/types");const r=e=>{let a;const t=new Set,s=(e,s)=>{const r="function"==typeof e?e(a):e;if(!Object.is(r,a)){const e=a;a=(null!=s?s:"object"!=typeof r||null===r)?r:Object.assign({},a,r),t.forEach(t=>t(a,e))}},r=()=>a,i={setState:s,getState:r,getInitialState:()=>l,subscribe:e=>(t.add(e),()=>t.delete(e))},l=a=e(s,r,i);return i},i=e=>e;const l=e=>{const t=(e=>e?r(e):r)(e),s=e=>function(e,t=i){const s=a.useSyncExternalStore(e.subscribe,()=>t(e.getState()),()=>t(e.getInitialState()));return a.useDebugValue(s),s}(t,e);return Object.assign(s,t),s},n=e=>(a,t,s)=>{const r=s.subscribe;s.subscribe=(e,a,t)=>{let i=e;if(a){const r=(null==t?void 0:t.equalityFn)||Object.is;let l=e(s.getState());i=t=>{const s=e(t);if(!r(l,s)){const e=l;a(l=s,e)}},(null==t?void 0:t.fireImmediately)&&a(l,l)}return r(i)};return e(a,t,s)};var c,o;exports.ActiveMedia=void 0,(c=exports.ActiveMedia||(exports.ActiveMedia={}))[c.USER=0]="USER",c[c.DISPLAY=1]="DISPLAY",exports.CallDataType=void 0,(o=exports.CallDataType||(exports.CallDataType={})).ON_CALL="onCall",o.ON_STOP_CALLING="onStopCalling",o.ON_ACCEPT="onAccept",o.ON_REJECT="onReject",o.ON_STOP="onStop",o.ON_NOT_ANSWER="onNotAnswer",o.ON_CONNECTION_STATE="onConnectionState";const u={incomingCallCallData:null,incomingCallStopData:null,activeCallAcceptData:null,activeCallRejectData:null,activeCallStopData:null,activeCallNotAnswerData:null,activeCallConnectionStateData:null,deviceChangeEvent:null},C={localStream:null,remoteStreams:{},userMediaParams:{video:!0,audio:!0},displayMediaParams:{video:!0,audio:!1},activeMedia:exports.ActiveMedia.USER},p={activeCall:null,incomingCall:null,...u,...C,participantsIDs:new Set,hasActiveListeners:!1},d=l(n((e,a)=>({...p,setActiveCall:a=>e({activeCall:a}),resetActiveCall:()=>e({activeCall:p.activeCall}),setIncomingCall:a=>e({incomingCall:a}),resetIncomingCall:()=>e({incomingCall:p.incomingCall}),setDeviceChangeEvent:a=>e({deviceChangeEvent:a}),upsertSessionData:(a,t)=>{switch(a){case exports.CallDataType.ON_CALL:e({incomingCallCallData:t});break;case exports.CallDataType.ON_STOP_CALLING:e({incomingCallStopData:t});break;case exports.CallDataType.ON_ACCEPT:e({activeCallAcceptData:t});break;case exports.CallDataType.ON_REJECT:e({activeCallRejectData:t});break;case exports.CallDataType.ON_STOP:e({activeCallStopData:t});break;case exports.CallDataType.ON_NOT_ANSWER:e({activeCallNotAnswerData:t});break;case exports.CallDataType.ON_CONNECTION_STATE:e({activeCallConnectionStateData:t})}},resetSessionData:a=>{switch(a){case exports.CallDataType.ON_CALL:e({incomingCallCallData:u.incomingCallCallData});break;case exports.CallDataType.ON_STOP_CALLING:e({incomingCallStopData:u.incomingCallStopData});break;case exports.CallDataType.ON_ACCEPT:e({activeCallAcceptData:u.activeCallAcceptData});break;case exports.CallDataType.ON_REJECT:e({activeCallRejectData:u.activeCallRejectData});break;case exports.CallDataType.ON_STOP:e({activeCallStopData:u.activeCallStopData});break;case exports.CallDataType.ON_NOT_ANSWER:e({activeCallNotAnswerData:u.activeCallNotAnswerData});break;case exports.CallDataType.ON_CONNECTION_STATE:e({activeCallConnectionStateData:u.activeCallConnectionStateData});break;default:e(u)}},setLocalStream:a=>e({localStream:a}),resetLocalStream:()=>e({localStream:p.localStream}),addRemoteStream:(t,s)=>e({remoteStreams:{...a().remoteStreams,[t]:s}}),removeRemoteStream:t=>{const s={...a().remoteStreams};delete s[t],e({remoteStreams:s})},resetRemoteStreams:()=>e({remoteStreams:p.remoteStreams}),saveUserMediaParams:a=>e({userMediaParams:a}),resetUserMediaParams:()=>e({userMediaParams:p.userMediaParams}),saveDisplayMediaParams:a=>e({displayMediaParams:a}),resetDisplayMediaParams:()=>e({displayMediaParams:p.displayMediaParams}),saveActiveMedia:a=>e({activeMedia:a}),setParticipantsIDs:a=>e({participantsIDs:new Set(a)}),participantDidEnter:t=>{const s=new Set([...a().participantsIDs]);s.add(t),e({participantsIDs:s})},participantDidLeave:t=>{const s=new Set([...a().participantsIDs]);s.delete(t),e({participantsIDs:s})},activateCallsListeners:()=>e({hasActiveListeners:!0}),resetStore:()=>e({...p,hasActiveListeners:a().hasActiveListeners})}))),D=e=>Symbol.iterator in e,m=e=>"entries"in e,v=(e,a)=>{const t=e instanceof Map?e:new Map(e.entries()),s=a instanceof Map?a:new Map(a.entries());if(t.size!==s.size)return!1;for(const[e,a]of t)if(!Object.is(a,s.get(e)))return!1;return!0};function S(e,a){return!!Object.is(e,a)||"object"==typeof e&&null!==e&&"object"==typeof a&&null!==a&&(Object.getPrototypeOf(e)===Object.getPrototypeOf(a)&&(D(e)&&D(a)?m(e)&&m(a)?v(e,a):((e,a)=>{const t=e[Symbol.iterator](),s=a[Symbol.iterator]();let r=t.next(),i=s.next();for(;!r.done&&!i.done;){if(!Object.is(r.value,i.value))return!1;r=t.next(),i=s.next()}return!!r.done&&!!i.done})(e,a):v({entries:()=>Object.entries(e)},{entries:()=>Object.entries(a)})))}function y(e){const t=a.useRef(void 0);return a=>{const s=e(a);return S(t.current,s)?t.current:t.current=s}}const T="useCalls",O=(e,...a)=>{console.log(`[${T}][${e}][Log]:`,...a)},E=(e,...a)=>{console.error(`[${T}][${e}][Error]:`,...a)},M=e=>{const t=a.useRef(d.getState()[e]);return a.useEffect(()=>{const a=d.subscribe(a=>a[e],e=>{t.current=e});return()=>a()},[e]),t};var I;!function(e){e.MUTE_AUDIO="audio-mute",e.UNMUTE_AUDIO="audio-unmute",e.MUTE_VIDEO="video-mute",e.UNMUTE_VIDEO="video-unmute"}(I||(I={}));Object.defineProperty(exports,"CallType",{enumerable:!0,get:function(){return s.CallType}}),Object.defineProperty(exports,"MediaType",{enumerable:!0,get:function(){return s.MediaType}}),exports.LocalStreamView=({muted:t,mirror:s,style:r={},...i})=>{const[l,n,c,o]=d(y(e=>[e.localStream,e.userMediaParams,e.displayMediaParams,e.activeMedia])),u=a.useRef(null),C=o===exports.ActiveMedia.USER,p=C?n:c,D=p.elementId??"ConnectyCubeMediaStream-local",m=p.options??{},v="boolean"==typeof t?t:"boolean"!=typeof m.muted||m.muted,S={transform:("boolean"==typeof s?s:"boolean"==typeof m.mirror?m.mirror:C)?"scaleX(-1)":"none",objectFit:"contain",height:"100%",width:"100%",...r};return a.useEffect(()=>{u.current&&l&&(u.current.srcObject=l,u.current.onloadedmetadata=()=>{try{u.current?.play()}catch(e){E("<LocalStreamView/> play()",e)}})},[l]),l?e.jsx("video",{autoPlay:!0,playsInline:!0,ref:u,id:D,muted:v,style:S,...i}):null},exports.RemoteStreamView=({userID:t,mirror:s=!1,style:r={},...i})=>{const l=d(e=>e.remoteStreams),n=t&&l[t],c=a.useRef(null),o=`ConnectyCubeMediaStream-${t}`,u={transform:s?"scaleX(-1)":"none",objectFit:"contain",height:"100%",width:"100%",...r};return a.useEffect(()=>{c.current&&n&&(c.current.srcObject=n,c.current.onloadedmetadata=()=>{try{c.current?.play()}catch(e){E("<RemoteStreamView/> play()",e)}})},[n]),n?e.jsx("video",{autoPlay:!0,playsInline:!0,ref:c,id:o,style:u,...i}):null},exports.useCalls=()=>{const e=(()=>{const[e,r]=a.useState(0),[i,l,n,c,o,u,C,p,D]=d(y(e=>[e.activeCall,e.localStream,e.remoteStreams,e.userMediaParams,e.saveUserMediaParams,e.displayMediaParams,e.saveDisplayMediaParams,e.activeMedia,e.saveActiveMedia])),m=a.useMemo(()=>{const e=l?.getAudioTracks();return!e||0===e.length||e.every(e=>!e.enabled)},[l,e]),v=a.useMemo(()=>{const e=l?.getVideoTracks();return!e||0===e.length||e.every(e=>!e.enabled)},[l,e]),S=a.useCallback(async e=>{if(i){switch(e){case I.MUTE_AUDIO:i.mute(s.MediaType.AUDIO);break;case I.MUTE_VIDEO:i.mute(s.MediaType.VIDEO);break;case I.UNMUTE_AUDIO:i.unmute(s.MediaType.AUDIO);break;case I.UNMUTE_VIDEO:i.unmute(s.MediaType.VIDEO)}r(e=>e+1)}},[i]);return{isLocalAudioMuted:m,isLocalVideoMuted:v,muteAudio:()=>{S(I.MUTE_AUDIO)},muteVideo:()=>{S(I.MUTE_VIDEO)},unmuteAudio:()=>{S(I.UNMUTE_AUDIO)},unmuteVideo:()=>{S(I.UNMUTE_VIDEO)},localStream:l,remoteStreams:n,getUserMedia:async e=>{try{const a=await(i?.getUserMedia(e??c));return D(exports.ActiveMedia.USER),a}catch(e){E("getUserMedia",{error:e})}},getDisplayMedia:async e=>{try{const a=await(i?.getDisplayMedia(e??u));return D(exports.ActiveMedia.DISPLAY),a}catch(e){E("getDisplayMedia",{error:e})}},getMediaDevices:async e=>{try{return await t.videochat.getMediaDevices(e)}catch(e){E("getMediaDevices",{error:e})}},switchMediaTracks:async e=>{try{return await(i?.switchMediaTracks(e))}catch(e){E("switchMediaTracks",{error:e})}},userMediaParams:c,setUserMediaParams:async e=>{e&&o(e)},displayMediaParams:u,setDisplayMediaParams:async e=>{e&&C(e)},activeMedia:p,setActiveMedia:async e=>{e&&D(e)}}})(),[r,i,l,n,c,o,u,C,p,D,m,v,S,T,A,N,b,g,f,_]=d(y(e=>[e.activeCall,e.setActiveCall,e.incomingCall,e.resetIncomingCall,e.setLocalStream,e.userMediaParams,e.displayMediaParams,e.activeMedia,e.deviceChangeEvent,e.incomingCallCallData,e.incomingCallStopData,e.activeCallAcceptData,e.activeCallRejectData,e.activeCallStopData,e.activeCallNotAnswerData,e.activeCallConnectionStateData,e.resetSessionData,e.participantsIDs,e.setParticipantsIDs,e.resetStore])),P=M("hasActiveListeners"),{setupListeners:x}=(()=>{const[e,a,r,i,l,n,c,o,u]=d(y(e=>[e.setIncomingCall,e.resetIncomingCall,e.addRemoteStream,e.removeRemoteStream,e.setDeviceChangeEvent,e.upsertSessionData,e.participantDidEnter,e.participantDidLeave,e.activateCallsListeners])),C=M("activeCall"),p=M("incomingCall"),D=(a,t)=>{a.initiatorID!==a.currentUserID&&(e(a),n(exports.CallDataType.ON_CALL,{userInfo:t}),O("onCall",{session:a,ext:t}))},m=(e,a,t)=>{c(a),n(exports.CallDataType.ON_ACCEPT,{userID:a,userInfo:t}),O("onAccept",{session:e,userID:a,ext:t})},v=(e,a,t)=>{o(a),n(exports.CallDataType.ON_REJECT,{userID:a,userInfo:t}),O("onReject",{session:e,userID:a,ext:t})},S=(e,t,s)=>{C.current?.ID===e.ID&&(o(t),i(t),n(exports.CallDataType.ON_STOP,{userID:t,userInfo:s})),p.current?.ID===e.ID&&(n(exports.CallDataType.ON_STOP_CALLING,{userID:t,userInfo:s}),a()),O("onStop",{session:e,userID:t,ext:s})},T=(e,a)=>{o(a),n(exports.CallDataType.ON_NOT_ANSWER,{userID:a}),O("onNotAnswer",{session:e,userID:a})},E=(e,a,t)=>{r(a,t),O("onRemoteStream",{session:e,userID:a,stream:t})},I=(e,a,t)=>{n(exports.CallDataType.ON_CONNECTION_STATE,{userID:a,connectionState:t}),O("onConnectionState",{session:e,userID:a,connectionState:t})},A=e=>{l(e),O("onDevicesChange",{event:e})};return{setupListeners:()=>{t.videochat.addListener(s.CallEvent.CALL,D),t.videochat.addListener(s.CallEvent.ACCEPT,m),t.videochat.addListener(s.CallEvent.REJECT,v),t.videochat.addListener(s.CallEvent.STOP,S),t.videochat.addListener(s.CallEvent.NOT_ANSWER,T),t.videochat.addListener(s.CallEvent.REMOTE_STREAM,E),t.videochat.addListener(s.CallEvent.CONNECTION_STATE,I),t.videochat.addListener(s.CallEvent.DEVICES,A),u()}}})(),L=a.useCallback(async e=>{if(l){const{currentUserID:a,initiatorID:t,opponentsIDs:s}=l,r=[...s,t].filter(e=>e!==a);b(),f(r);try{await R(l),l.accept(e),n()}catch(a){E("acceptCall",a),l.stop(e)}finally{n()}}},[l]),h=a.useCallback(e=>{l?.reject(e),n()},[l]),U=a.useCallback(e=>{_(),r?.stop(e)},[r]),R=a.useCallback(async e=>{const a=C===exports.ActiveMedia.DISPLAY?await e.getDisplayMedia(u):await e.getUserMedia(o);e.callType===s.CallType.AUDIO&&a.getVideoTracks().forEach(e=>e.enabled=!1),c(a),i(e)},[C,o,u]);return a.useEffect(()=>{r&&0===g.size&&U()},[r,g]),a.useEffect(()=>{P.current||x()},[]),{startCall:async(e=[],a=s.CallType.VIDEO,r)=>{const i=Array.isArray(e)?e:[e],l=t.videochat.createNewSession(i,a);try{b(),f(i),await R(l),l.call(r)}catch(e){E("startCall",e),f([])}},acceptCall:L,rejectCall:h,stopCall:U,activeCall:r,incomingCall:l,deviceChangeEvent:p,incomingCallCallData:D,incomingCallStopData:m,activeCallAcceptData:v,activeCallRejectData:S,activeCallStopData:T,activeCallNotAnswerData:A,activeCallConnectionStateData:N,resetSessionData:b,participantsIds:[...g],...e}};
//# sourceMappingURL=index.cjs.map