@stream-io/video-react-sdk 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/src/components/CallParticipantsList/CallParticipantListingItem.d.ts +2 -1
- package/dist/src/components/CallParticipantsList/CallParticipantListingItem.js +24 -3
- package/dist/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
- package/dist/src/core/components/ParticipantView/DefaultParticipantViewUI.js +2 -2
- package/dist/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
- package/dist/src/core/contexts/MediaDevicesContext.js +11 -6
- package/dist/src/core/contexts/MediaDevicesContext.js.map +1 -1
- package/dist/src/core/hooks/useAudioPublisher.d.ts +2 -1
- package/dist/src/core/hooks/useAudioPublisher.js +3 -3
- package/dist/src/core/hooks/useAudioPublisher.js.map +1 -1
- package/dist/src/core/hooks/useDevices.d.ts +28 -8
- package/dist/src/core/hooks/useDevices.js +68 -9
- package/dist/src/core/hooks/useDevices.js.map +1 -1
- package/dist/src/core/hooks/useVideoPublisher.d.ts +2 -1
- package/dist/src/core/hooks/useVideoPublisher.js +3 -3
- package/dist/src/core/hooks/useVideoPublisher.js.map +1 -1
- package/package.json +3 -3
- package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +55 -1
- package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +2 -1
- package/src/core/contexts/MediaDevicesContext.tsx +13 -3
- package/src/core/hooks/useAudioPublisher.ts +4 -2
- package/src/core/hooks/useDevices.ts +75 -8
- package/src/core/hooks/useVideoPublisher.ts +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
### [0.0.19](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-0.0.18...@stream-io/video-react-sdk-0.0.19) (2023-06-09)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **react-sdk:** do not try to watch devices, if browser permission is not granted ([#617](https://github.com/GetStream/stream-video-js/issues/617)) ([abff44d](https://github.com/GetStream/stream-video-js/commit/abff44d2e66d6c4c515c7d4590fb3767b2560e64))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Documentation
|
|
14
|
+
|
|
15
|
+
* **react-sdk:** rename 13-custom-call-layout.mdx to 04-video-layout.mdx ([#586](https://github.com/GetStream/stream-video-js/issues/586)) ([e832092](https://github.com/GetStream/stream-video-js/commit/e832092aac5b2de2327294d1a45bcc02d33db4a4))
|
|
16
|
+
|
|
17
|
+
### [0.0.18](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-0.0.17...@stream-io/video-react-sdk-0.0.18) (2023-06-09)
|
|
18
|
+
|
|
19
|
+
### Dependency Updates
|
|
20
|
+
|
|
21
|
+
* `@stream-io/video-client` updated to version `0.0.1`
|
|
22
|
+
* `@stream-io/video-react-bindings` updated to version `0.0.8`
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* **react-sdk:** Picture-in-Picture Pronto integration + guide ([#614](https://github.com/GetStream/stream-video-js/issues/614)) ([5b7662a](https://github.com/GetStream/stream-video-js/commit/5b7662a8d17f151796d58c6eed2d9fed7d3d9ba8))
|
|
27
|
+
|
|
5
28
|
### [0.0.17](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-0.0.16...@stream-io/video-react-sdk-0.0.17) (2023-06-08)
|
|
6
29
|
|
|
7
30
|
|
|
@@ -9,8 +9,9 @@ type CallParticipantListingItemProps = {
|
|
|
9
9
|
}>;
|
|
10
10
|
};
|
|
11
11
|
export declare const CallParticipantListingItem: ({ participant, DisplayName, }: CallParticipantListingItemProps) => JSX.Element;
|
|
12
|
-
export declare const ParticipantActionsContextMenu: ({ participant, participantViewElement, }: {
|
|
12
|
+
export declare const ParticipantActionsContextMenu: ({ participant, participantViewElement, videoElement, }: {
|
|
13
13
|
participant: StreamVideoParticipant;
|
|
14
14
|
participantViewElement?: HTMLDivElement | null | undefined;
|
|
15
|
+
videoElement?: HTMLVideoElement | null | undefined;
|
|
15
16
|
}) => JSX.Element;
|
|
16
17
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import clsx from 'clsx';
|
|
3
|
-
import { forwardRef, useState } from 'react';
|
|
3
|
+
import { forwardRef, useEffect, useState, } from 'react';
|
|
4
4
|
import { Restricted, useCall, useConnectedUser, } from '@stream-io/video-react-bindings';
|
|
5
5
|
import { OwnCapability, SfuModels, } from '@stream-io/video-client';
|
|
6
6
|
import { IconButton } from '../Button';
|
|
@@ -34,8 +34,9 @@ const DefaultDisplayName = ({ participant }) => {
|
|
|
34
34
|
const ToggleButton = forwardRef((props, ref) => {
|
|
35
35
|
return _jsx(IconButton, { enabled: props.menuShown, icon: "ellipsis", ref: ref });
|
|
36
36
|
});
|
|
37
|
-
export const ParticipantActionsContextMenu = ({ participant, participantViewElement, }) => {
|
|
37
|
+
export const ParticipantActionsContextMenu = ({ participant, participantViewElement, videoElement, }) => {
|
|
38
38
|
const [fullscreenModeOn, setFullscreenModeOn] = useState(!!document.fullscreenElement);
|
|
39
|
+
const [pictureInPictureElement, setPictureInPictureElement] = useState(document.pictureInPictureElement);
|
|
39
40
|
const activeCall = useCall();
|
|
40
41
|
const blockUser = () => {
|
|
41
42
|
activeCall === null || activeCall === void 0 ? void 0 : activeCall.blockUser(participant.userId);
|
|
@@ -80,6 +81,26 @@ export const ParticipantActionsContextMenu = ({ participant, participantViewElem
|
|
|
80
81
|
.catch(console.error)
|
|
81
82
|
.finally(() => setFullscreenModeOn(false));
|
|
82
83
|
};
|
|
83
|
-
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (!videoElement)
|
|
86
|
+
return;
|
|
87
|
+
const handlePictureInPicture = () => {
|
|
88
|
+
setPictureInPictureElement(document.pictureInPictureElement);
|
|
89
|
+
};
|
|
90
|
+
videoElement.addEventListener('enterpictureinpicture', handlePictureInPicture);
|
|
91
|
+
videoElement.addEventListener('leavepictureinpicture', handlePictureInPicture);
|
|
92
|
+
return () => {
|
|
93
|
+
videoElement.removeEventListener('enterpictureinpicture', handlePictureInPicture);
|
|
94
|
+
videoElement.removeEventListener('leavepictureinpicture', handlePictureInPicture);
|
|
95
|
+
};
|
|
96
|
+
}, [videoElement]);
|
|
97
|
+
const togglePictureInPicture = () => {
|
|
98
|
+
if (videoElement && pictureInPictureElement !== videoElement)
|
|
99
|
+
return videoElement
|
|
100
|
+
.requestPictureInPicture()
|
|
101
|
+
.catch(console.error);
|
|
102
|
+
document.exitPictureInPicture().catch(console.error);
|
|
103
|
+
};
|
|
104
|
+
return (_jsxs(GenericMenu, { children: [_jsxs(GenericMenuButtonItem, Object.assign({ onClick: toggleParticipantPinnedAt }, { children: [_jsx(Icon, { icon: "pin" }), participant.pinnedAt ? 'Unpin' : 'Pin'] })), _jsx(Restricted, Object.assign({ requiredGrants: [OwnCapability.BLOCK_USERS] }, { children: _jsxs(GenericMenuButtonItem, Object.assign({ onClick: blockUser }, { children: [_jsx(Icon, { icon: "not-allowed" }), "Block"] })) })), _jsxs(Restricted, Object.assign({ requiredGrants: [OwnCapability.MUTE_USERS] }, { children: [_jsxs(GenericMenuButtonItem, Object.assign({ disabled: !participant.publishedTracks.includes(SfuModels.TrackType.VIDEO), onClick: muteVideo }, { children: [_jsx(Icon, { icon: "camera-off-outline" }), "Turn off video"] })), _jsxs(GenericMenuButtonItem, Object.assign({ disabled: !participant.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE), onClick: muteScreenShare }, { children: [_jsx(Icon, { icon: "screen-share-off" }), "Turn off screen share"] })), _jsxs(GenericMenuButtonItem, Object.assign({ disabled: !participant.publishedTracks.includes(SfuModels.TrackType.AUDIO), onClick: muteAudio }, { children: [_jsx(Icon, { icon: "no-audio" }), "Mute audio"] }))] })), participantViewElement && (_jsxs(GenericMenuButtonItem, Object.assign({ onClick: toggleFullscreenMode }, { children: [fullscreenModeOn ? 'Leave' : 'Enter', " fullscreen"] }))), videoElement && document.pictureInPictureEnabled && (_jsxs(GenericMenuButtonItem, Object.assign({ onClick: togglePictureInPicture }, { children: [pictureInPictureElement === videoElement ? 'Leave' : 'Enter', ' ', "picture-in-picture"] }))), _jsxs(Restricted, Object.assign({ requiredGrants: [OwnCapability.UPDATE_CALL_PERMISSIONS] }, { children: [_jsx(GenericMenuButtonItem, Object.assign({ onClick: grantPermission(OwnCapability.SEND_AUDIO) }, { children: "Allow audio" })), _jsx(GenericMenuButtonItem, Object.assign({ onClick: grantPermission(OwnCapability.SEND_VIDEO) }, { children: "Allow video" })), _jsx(GenericMenuButtonItem, Object.assign({ onClick: grantPermission(OwnCapability.SCREENSHARE) }, { children: "Allow screen sharing" })), _jsx(GenericMenuButtonItem, Object.assign({ onClick: revokePermission(OwnCapability.SEND_AUDIO) }, { children: "Disable audio" })), _jsx(GenericMenuButtonItem, Object.assign({ onClick: revokePermission(OwnCapability.SEND_VIDEO) }, { children: "Disable video" })), _jsx(GenericMenuButtonItem, Object.assign({ onClick: revokePermission(OwnCapability.SCREENSHARE) }, { children: "Disable screen sharing" }))] }))] }));
|
|
84
105
|
};
|
|
85
106
|
//# sourceMappingURL=CallParticipantListingItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallParticipantListingItem.js","sourceRoot":"","sources":["../../../../src/components/CallParticipantsList/CallParticipantListingItem.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"CallParticipantListingItem.js","sourceRoot":"","sources":["../../../../src/components/CallParticipantsList/CallParticipantListingItem.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,12 +21,12 @@ export const DefaultScreenShareOverlay = () => {
|
|
|
21
21
|
};
|
|
22
22
|
export const DefaultParticipantViewUI = ({ indicatorsVisible = true, menuPlacement = 'bottom-end', showMenuButton = true, }) => {
|
|
23
23
|
const call = useCall();
|
|
24
|
-
const { participant, participantViewElement, videoKind } = useParticipantViewContext();
|
|
24
|
+
const { participant, participantViewElement, videoKind, videoElement } = useParticipantViewContext();
|
|
25
25
|
const { reaction, sessionId, publishedTracks } = participant;
|
|
26
26
|
const hasScreenShare = publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);
|
|
27
27
|
if (participant.isLoggedInUser && hasScreenShare && videoKind === 'screen')
|
|
28
28
|
return (_jsxs(_Fragment, { children: [_jsx(DefaultScreenShareOverlay, {}), _jsx(ParticipantDetails, { indicatorsVisible: indicatorsVisible })] }));
|
|
29
|
-
return (_jsxs(_Fragment, { children: [showMenuButton && (_jsx(MenuToggle, Object.assign({ strategy: "fixed", placement: menuPlacement, ToggleButton: ToggleButton }, { children: _jsx(ParticipantActionsContextMenu, { participantViewElement: participantViewElement, participant: participant }) }))), reaction && (_jsx(Reaction, { reaction: reaction, sessionId: sessionId, call: call })), _jsx(ParticipantDetails, { indicatorsVisible: indicatorsVisible })] }));
|
|
29
|
+
return (_jsxs(_Fragment, { children: [showMenuButton && (_jsx(MenuToggle, Object.assign({ strategy: "fixed", placement: menuPlacement, ToggleButton: ToggleButton }, { children: _jsx(ParticipantActionsContextMenu, { participantViewElement: participantViewElement, participant: participant, videoElement: videoElement }) }))), reaction && (_jsx(Reaction, { reaction: reaction, sessionId: sessionId, call: call })), _jsx(ParticipantDetails, { indicatorsVisible: indicatorsVisible })] }));
|
|
30
30
|
};
|
|
31
31
|
export const ParticipantDetails = ({ indicatorsVisible = true, }) => {
|
|
32
32
|
const { participant } = useParticipantViewContext();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultParticipantViewUI.js","sourceRoot":"","sources":["../../../../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,6BAA6B,GAE9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAiB9D,MAAM,YAAY,GAAG,UAAU,CAC7B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,OAAO,KAAC,UAAU,IAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAC,UAAU,EAAC,GAAG,EAAE,GAAG,GAAI,CAAC;AAC5E,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,iCAAiC,iBAC9C,KAAC,IAAI,IAAC,IAAI,EAAC,kBAAkB,GAAG,EAChC,6BAAM,SAAS,EAAC,wCAAwC,oDAEjD,EACP,gCACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,yCAAyC,iBAEnD,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAG,6BACd,KACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,iBAAiB,GAAG,IAAI,EACxB,aAAa,GAAG,YAAY,EAC5B,cAAc,GAAG,IAAI,GACS,EAAE,EAAE;IAClC,MAAM,IAAI,GAAG,OAAO,EAAG,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"DefaultParticipantViewUI.js","sourceRoot":"","sources":["../../../../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ import { createContext, useCallback, useContext, useEffect, useState, } from 're
|
|
|
12
12
|
import { map } from 'rxjs';
|
|
13
13
|
import { CallingState, checkIfAudioOutputChangeSupported, disposeOfMediaStream, getAudioStream, getVideoStream, SfuModels, watchForDisconnectedAudioOutputDevice, } from '@stream-io/video-client';
|
|
14
14
|
import { useCall, useCallCallingState, useCallMetadata, useCallState, } from '@stream-io/video-react-bindings';
|
|
15
|
-
import { useAudioInputDeviceFallback, useAudioOutputDeviceFallback, useAudioPublisher, useVideoDeviceFallback, useVideoPublisher, } from '../hooks';
|
|
15
|
+
import { useAudioInputDeviceFallback, useAudioOutputDeviceFallback, useAudioPublisher, useHasBrowserPermissions, useVideoDeviceFallback, useVideoPublisher, } from '../hooks';
|
|
16
16
|
const DEVICE_STATE_TOGGLE = {
|
|
17
17
|
starting: 'stopped',
|
|
18
18
|
playing: 'stopped',
|
|
@@ -57,6 +57,8 @@ export const MediaDevicesProvider = ({ children, initialAudioEnabled, initialVid
|
|
|
57
57
|
const callState = useCallState();
|
|
58
58
|
const metadata = useCallMetadata();
|
|
59
59
|
const { localParticipant$ } = callState;
|
|
60
|
+
const canObserveVideo = useHasBrowserPermissions('camera');
|
|
61
|
+
const canObserveAudio = useHasBrowserPermissions('microphone');
|
|
60
62
|
const [selectedAudioInputDeviceId, selectAudioInputDeviceId] = useState(initialAudioInputDeviceId);
|
|
61
63
|
const [selectedAudioOutputDeviceId, selectAudioOutputDeviceId] = useState(initialAudioOutputDeviceId);
|
|
62
64
|
const [selectedVideoDeviceId, selectVideoDeviceId] = useState(initialVideoInputDeviceId);
|
|
@@ -121,16 +123,19 @@ export const MediaDevicesProvider = ({ children, initialAudioEnabled, initialVid
|
|
|
121
123
|
selectAudioOutputDeviceId(deviceId);
|
|
122
124
|
}
|
|
123
125
|
}, []);
|
|
124
|
-
useAudioInputDeviceFallback(() => switchDevice('audioinput', DEFAULT_DEVICE_ID), selectedAudioInputDeviceId);
|
|
125
|
-
useAudioOutputDeviceFallback(() => switchDevice('audiooutput', DEFAULT_DEVICE_ID),
|
|
126
|
-
|
|
126
|
+
useAudioInputDeviceFallback(() => switchDevice('audioinput', DEFAULT_DEVICE_ID), canObserveAudio, selectedAudioInputDeviceId);
|
|
127
|
+
useAudioOutputDeviceFallback(() => switchDevice('audiooutput', DEFAULT_DEVICE_ID),
|
|
128
|
+
// audiooutput devices can be enumerated only with microphone permissions
|
|
129
|
+
canObserveAudio, selectedAudioOutputDeviceId);
|
|
130
|
+
useVideoDeviceFallback(() => switchDevice('videoinput', DEFAULT_DEVICE_ID), canObserveVideo, selectedVideoDeviceId);
|
|
127
131
|
useEffect(() => {
|
|
128
132
|
if (!call || callingState !== CallingState.JOINED)
|
|
129
133
|
return;
|
|
130
134
|
call.setAudioOutputDevice(selectedAudioOutputDeviceId);
|
|
131
135
|
}, [call, callingState, selectedAudioOutputDeviceId]);
|
|
132
136
|
useEffect(() => {
|
|
133
|
-
|
|
137
|
+
// audiooutput devices can be enumerated only with microphone permissions
|
|
138
|
+
if (!localParticipant$ || !canObserveAudio)
|
|
134
139
|
return;
|
|
135
140
|
const subscription = watchForDisconnectedAudioOutputDevice(localParticipant$.pipe(map((p) => p === null || p === void 0 ? void 0 : p.audioOutputDeviceId))).subscribe(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
136
141
|
selectAudioOutputDeviceId(DEFAULT_DEVICE_ID);
|
|
@@ -138,7 +143,7 @@ export const MediaDevicesProvider = ({ children, initialAudioEnabled, initialVid
|
|
|
138
143
|
return () => {
|
|
139
144
|
subscription.unsubscribe();
|
|
140
145
|
};
|
|
141
|
-
}, [localParticipant$]);
|
|
146
|
+
}, [canObserveAudio, localParticipant$]);
|
|
142
147
|
const contextValue = {
|
|
143
148
|
disposeOfMediaStream,
|
|
144
149
|
getAudioStream,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaDevicesContext.js","sourceRoot":"","sources":["../../../../src/core/contexts/MediaDevicesContext.tsx"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,EACL,aAAa,EAEb,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,iCAAiC,EACjC,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,SAAS,EACT,qCAAqC,GACtC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,eAAe,EACf,YAAY,GACb,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AA0BlB,MAAM,mBAAmB,GAAoD;IAC3E,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,UAAU;IACnB,aAAa,EAAE,UAAU;IACzB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAMrB;IACF,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE;IAC7C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IAC5C,aAAa,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE;IACxD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;CACtD,CAAC;AAEF,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAsGpC,MAAM,mBAAmB,GAAG,aAAa,CAAgC,IAAI,CAAC,CAAC;AA6B/E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,GAAG,iBAAiB,EAC7C,0BAA0B,GAAG,iBAAiB,EAC9C,yBAAyB,GAAG,iBAAiB,GACA,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"MediaDevicesContext.js","sourceRoot":"","sources":["../../../../src/core/contexts/MediaDevicesContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @internal
|
|
3
3
|
*/
|
|
4
4
|
export type AudioPublisherInit = {
|
|
5
|
+
canObserveAudio?: boolean;
|
|
5
6
|
initialAudioMuted?: boolean;
|
|
6
7
|
audioDeviceId?: string;
|
|
7
8
|
};
|
|
@@ -9,4 +10,4 @@ export type AudioPublisherInit = {
|
|
|
9
10
|
* @internal
|
|
10
11
|
* @category Device Management
|
|
11
12
|
*/
|
|
12
|
-
export declare const useAudioPublisher: ({ initialAudioMuted, audioDeviceId, }: AudioPublisherInit) => () => Promise<void>;
|
|
13
|
+
export declare const useAudioPublisher: ({ canObserveAudio, initialAudioMuted, audioDeviceId, }: AudioPublisherInit) => () => Promise<void>;
|
|
@@ -15,7 +15,7 @@ import { useCall, useCallCallingState, useCallState, useLocalParticipant, } from
|
|
|
15
15
|
* @internal
|
|
16
16
|
* @category Device Management
|
|
17
17
|
*/
|
|
18
|
-
export const useAudioPublisher = ({ initialAudioMuted, audioDeviceId, }) => {
|
|
18
|
+
export const useAudioPublisher = ({ canObserveAudio, initialAudioMuted, audioDeviceId, }) => {
|
|
19
19
|
const call = useCall();
|
|
20
20
|
const callState = useCallState();
|
|
21
21
|
const callingState = useCallCallingState();
|
|
@@ -46,7 +46,7 @@ export const useAudioPublisher = ({ initialAudioMuted, audioDeviceId, }) => {
|
|
|
46
46
|
}
|
|
47
47
|
}, [callingState, initialAudioMuted, publishAudioStream]);
|
|
48
48
|
useEffect(() => {
|
|
49
|
-
if (!localParticipant$)
|
|
49
|
+
if (!localParticipant$ || !canObserveAudio)
|
|
50
50
|
return;
|
|
51
51
|
const subscription = watchForDisconnectedAudioDevice(localParticipant$.pipe(map((p) => p === null || p === void 0 ? void 0 : p.audioDeviceId))).subscribe(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
52
52
|
if (!call)
|
|
@@ -57,7 +57,7 @@ export const useAudioPublisher = ({ initialAudioMuted, audioDeviceId, }) => {
|
|
|
57
57
|
return () => {
|
|
58
58
|
subscription.unsubscribe();
|
|
59
59
|
};
|
|
60
|
-
}, [localParticipant$, call]);
|
|
60
|
+
}, [canObserveAudio, localParticipant$, call]);
|
|
61
61
|
useEffect(() => {
|
|
62
62
|
if (!(participant === null || participant === void 0 ? void 0 : participant.audioStream) || !call || !isPublishingAudio)
|
|
63
63
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAudioPublisher.js","sourceRoot":"","sources":["../../../../src/core/hooks/useAudioPublisher.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"useAudioPublisher.js","sourceRoot":"","sources":["../../../../src/core/hooks/useAudioPublisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
export declare const useHasBrowserPermissions: (permissionName: PermissionName) => boolean;
|
|
2
3
|
/**
|
|
3
4
|
* Observes changes in connected devices and maintains an up-to-date array of connected MediaDeviceInfo objects.
|
|
4
5
|
* @param observeDevices
|
|
@@ -23,57 +24,76 @@ export declare const useAudioOutputDevices: () => MediaDeviceInfo[];
|
|
|
23
24
|
/**
|
|
24
25
|
* Verifies that newly selected device id exists among the registered devices.
|
|
25
26
|
* If the selected device id is not found among existing devices, switches to the default device.
|
|
27
|
+
* The media devices are observed only if a given permission ('camera' resp. 'microphone') is granted in browser.
|
|
28
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
29
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
30
|
+
* @param canObserve
|
|
26
31
|
* @param devices$
|
|
27
32
|
* @param switchToDefaultDevice
|
|
28
33
|
* @param selectedDeviceId
|
|
29
34
|
* @category Device Management
|
|
30
35
|
*/
|
|
31
|
-
export declare const useDeviceFallback: (devices$: Observable<MediaDeviceInfo[]>, switchToDefaultDevice: () => void, selectedDeviceId?: string) => void;
|
|
36
|
+
export declare const useDeviceFallback: (canObserve: boolean, devices$: Observable<MediaDeviceInfo[]>, switchToDefaultDevice: () => void, selectedDeviceId?: string) => void;
|
|
32
37
|
/**
|
|
33
38
|
* Verifies that newly selected video device id exists among the registered devices.
|
|
34
39
|
* If the selected device id is not found among existing devices, switches to the default video device.
|
|
40
|
+
* The media devices are observed only if 'camera' permission is granted in browser.
|
|
41
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
42
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
43
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
35
44
|
* @param switchToDefaultDevice
|
|
45
|
+
* @param canObserve
|
|
36
46
|
* @param selectedDeviceId
|
|
37
47
|
* @category Device Management
|
|
38
48
|
*/
|
|
39
|
-
export declare const useVideoDeviceFallback: (switchToDefaultDevice: () => void, selectedDeviceId?: string) => void;
|
|
49
|
+
export declare const useVideoDeviceFallback: (switchToDefaultDevice: () => void, canObserve: boolean, selectedDeviceId?: string) => void;
|
|
40
50
|
/**
|
|
41
51
|
* Verifies that newly selected audio input device id exists among the registered devices.
|
|
42
52
|
* If the selected device id is not found among existing devices, switches to the default audio input device.
|
|
53
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
54
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
55
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
56
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
43
57
|
* @param switchToDefaultDevice
|
|
58
|
+
* @param canObserve
|
|
44
59
|
* @param selectedDeviceId
|
|
45
60
|
* @category Device Management
|
|
46
61
|
*/
|
|
47
|
-
export declare const useAudioInputDeviceFallback: (switchToDefaultDevice: () => void, selectedDeviceId?: string) => void;
|
|
62
|
+
export declare const useAudioInputDeviceFallback: (switchToDefaultDevice: () => void, canObserve: boolean, selectedDeviceId?: string) => void;
|
|
48
63
|
/**
|
|
49
64
|
* Verifies that newly selected audio output device id exists among the registered devices.
|
|
50
65
|
* If the selected device id is not found among existing devices, switches to the default audio output device.
|
|
66
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
67
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
68
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
69
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
51
70
|
* @param switchToDefaultDevice
|
|
71
|
+
* @param canObserve
|
|
52
72
|
* @param selectedDeviceId
|
|
53
73
|
* @category Device Management
|
|
54
74
|
*/
|
|
55
|
-
export declare const useAudioOutputDeviceFallback: (switchToDefaultDevice: () => void, selectedDeviceId?: string) => void;
|
|
75
|
+
export declare const useAudioOutputDeviceFallback: (switchToDefaultDevice: () => void, canObserve: boolean, selectedDeviceId?: string) => void;
|
|
56
76
|
/**
|
|
57
|
-
* Observes devices of certain kind are made unavailable and executes onDisconnect callback
|
|
77
|
+
* Observes devices of certain kind are made unavailable and executes onDisconnect callback.
|
|
58
78
|
* @param observeDevices
|
|
59
79
|
* @param onDisconnect
|
|
60
80
|
* @category Device Management
|
|
61
81
|
*/
|
|
62
82
|
export declare const useOnUnavailableDevices: (observeDevices: Observable<MediaDeviceInfo[]>, onDisconnect: () => void) => void;
|
|
63
83
|
/**
|
|
64
|
-
* Observes disconnect of all video devices and executes onDisconnect callback
|
|
84
|
+
* Observes disconnect of all video devices and executes onDisconnect callback.
|
|
65
85
|
* @param onDisconnect
|
|
66
86
|
* @category Device Management
|
|
67
87
|
*/
|
|
68
88
|
export declare const useOnUnavailableVideoDevices: (onDisconnect: () => void) => void;
|
|
69
89
|
/**
|
|
70
|
-
* Observes disconnect of all audio input devices and executes onDisconnect callback
|
|
90
|
+
* Observes disconnect of all audio input devices and executes onDisconnect callback.
|
|
71
91
|
* @param onDisconnect
|
|
72
92
|
* @category Device Management
|
|
73
93
|
*/
|
|
74
94
|
export declare const useOnUnavailableAudioInputDevices: (onDisconnect: () => void) => void;
|
|
75
95
|
/**
|
|
76
|
-
* Observes disconnect of all audio output devices and executes onDisconnect callback
|
|
96
|
+
* Observes disconnect of all audio output devices and executes onDisconnect callback.
|
|
77
97
|
* @param onDisconnect
|
|
78
98
|
* @category Device Management
|
|
79
99
|
*/
|
|
@@ -1,6 +1,44 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { useEffect, useState } from 'react';
|
|
2
11
|
import { pairwise } from 'rxjs';
|
|
3
12
|
import { getAudioDevices, getAudioOutputDevices, getVideoDevices, } from '@stream-io/video-client';
|
|
13
|
+
export const useHasBrowserPermissions = (permissionName) => {
|
|
14
|
+
const [canSubscribe, enableSubscription] = useState(false);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
let permissionState;
|
|
17
|
+
const handlePermissionChange = (e) => {
|
|
18
|
+
const { state } = e.target;
|
|
19
|
+
enableSubscription(state === 'granted');
|
|
20
|
+
};
|
|
21
|
+
const checkPermissions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
|
+
try {
|
|
23
|
+
permissionState = yield navigator.permissions.query({
|
|
24
|
+
name: permissionName,
|
|
25
|
+
});
|
|
26
|
+
permissionState.addEventListener('change', handlePermissionChange);
|
|
27
|
+
enableSubscription(permissionState.state === 'granted');
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
// permission does not exist - cannot be queried
|
|
31
|
+
// an example would be Firefox - camera, neither microphone perms can be queried
|
|
32
|
+
enableSubscription(true);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
checkPermissions();
|
|
36
|
+
return () => {
|
|
37
|
+
permissionState === null || permissionState === void 0 ? void 0 : permissionState.removeEventListener('change', handlePermissionChange);
|
|
38
|
+
};
|
|
39
|
+
}, [permissionName]);
|
|
40
|
+
return canSubscribe;
|
|
41
|
+
};
|
|
4
42
|
/**
|
|
5
43
|
* Observes changes in connected devices and maintains an up-to-date array of connected MediaDeviceInfo objects.
|
|
6
44
|
* @param observeDevices
|
|
@@ -34,13 +72,19 @@ export const useAudioOutputDevices = () => useDevices(getAudioOutputDevices);
|
|
|
34
72
|
/**
|
|
35
73
|
* Verifies that newly selected device id exists among the registered devices.
|
|
36
74
|
* If the selected device id is not found among existing devices, switches to the default device.
|
|
75
|
+
* The media devices are observed only if a given permission ('camera' resp. 'microphone') is granted in browser.
|
|
76
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
77
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
78
|
+
* @param canObserve
|
|
37
79
|
* @param devices$
|
|
38
80
|
* @param switchToDefaultDevice
|
|
39
81
|
* @param selectedDeviceId
|
|
40
82
|
* @category Device Management
|
|
41
83
|
*/
|
|
42
|
-
export const useDeviceFallback = (devices$, switchToDefaultDevice, selectedDeviceId) => {
|
|
84
|
+
export const useDeviceFallback = (canObserve, devices$, switchToDefaultDevice, selectedDeviceId) => {
|
|
43
85
|
useEffect(() => {
|
|
86
|
+
if (!canObserve)
|
|
87
|
+
return;
|
|
44
88
|
const validateDeviceId = devices$.pipe().subscribe((devices) => {
|
|
45
89
|
const deviceFound = devices.find((device) => device.deviceId === selectedDeviceId);
|
|
46
90
|
if (!deviceFound)
|
|
@@ -49,34 +93,49 @@ export const useDeviceFallback = (devices$, switchToDefaultDevice, selectedDevic
|
|
|
49
93
|
return () => {
|
|
50
94
|
validateDeviceId.unsubscribe();
|
|
51
95
|
};
|
|
52
|
-
}, [devices$, selectedDeviceId, switchToDefaultDevice]);
|
|
96
|
+
}, [canObserve, devices$, selectedDeviceId, switchToDefaultDevice]);
|
|
53
97
|
};
|
|
54
98
|
/**
|
|
55
99
|
* Verifies that newly selected video device id exists among the registered devices.
|
|
56
100
|
* If the selected device id is not found among existing devices, switches to the default video device.
|
|
101
|
+
* The media devices are observed only if 'camera' permission is granted in browser.
|
|
102
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
103
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
104
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
57
105
|
* @param switchToDefaultDevice
|
|
106
|
+
* @param canObserve
|
|
58
107
|
* @param selectedDeviceId
|
|
59
108
|
* @category Device Management
|
|
60
109
|
*/
|
|
61
|
-
export const useVideoDeviceFallback = (switchToDefaultDevice, selectedDeviceId) => useDeviceFallback(getVideoDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
110
|
+
export const useVideoDeviceFallback = (switchToDefaultDevice, canObserve, selectedDeviceId) => useDeviceFallback(canObserve, getVideoDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
62
111
|
/**
|
|
63
112
|
* Verifies that newly selected audio input device id exists among the registered devices.
|
|
64
113
|
* If the selected device id is not found among existing devices, switches to the default audio input device.
|
|
114
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
115
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
116
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
117
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
65
118
|
* @param switchToDefaultDevice
|
|
119
|
+
* @param canObserve
|
|
66
120
|
* @param selectedDeviceId
|
|
67
121
|
* @category Device Management
|
|
68
122
|
*/
|
|
69
|
-
export const useAudioInputDeviceFallback = (switchToDefaultDevice, selectedDeviceId) => useDeviceFallback(getAudioDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
123
|
+
export const useAudioInputDeviceFallback = (switchToDefaultDevice, canObserve, selectedDeviceId) => useDeviceFallback(canObserve, getAudioDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
70
124
|
/**
|
|
71
125
|
* Verifies that newly selected audio output device id exists among the registered devices.
|
|
72
126
|
* If the selected device id is not found among existing devices, switches to the default audio output device.
|
|
127
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
128
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
129
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
130
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
73
131
|
* @param switchToDefaultDevice
|
|
132
|
+
* @param canObserve
|
|
74
133
|
* @param selectedDeviceId
|
|
75
134
|
* @category Device Management
|
|
76
135
|
*/
|
|
77
|
-
export const useAudioOutputDeviceFallback = (switchToDefaultDevice, selectedDeviceId) => useDeviceFallback(getAudioOutputDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
136
|
+
export const useAudioOutputDeviceFallback = (switchToDefaultDevice, canObserve, selectedDeviceId) => useDeviceFallback(canObserve, getAudioOutputDevices(), switchToDefaultDevice, selectedDeviceId);
|
|
78
137
|
/**
|
|
79
|
-
* Observes devices of certain kind are made unavailable and executes onDisconnect callback
|
|
138
|
+
* Observes devices of certain kind are made unavailable and executes onDisconnect callback.
|
|
80
139
|
* @param observeDevices
|
|
81
140
|
* @param onDisconnect
|
|
82
141
|
* @category Device Management
|
|
@@ -93,19 +152,19 @@ export const useOnUnavailableDevices = (observeDevices, onDisconnect) => {
|
|
|
93
152
|
}, [observeDevices, onDisconnect]);
|
|
94
153
|
};
|
|
95
154
|
/**
|
|
96
|
-
* Observes disconnect of all video devices and executes onDisconnect callback
|
|
155
|
+
* Observes disconnect of all video devices and executes onDisconnect callback.
|
|
97
156
|
* @param onDisconnect
|
|
98
157
|
* @category Device Management
|
|
99
158
|
*/
|
|
100
159
|
export const useOnUnavailableVideoDevices = (onDisconnect) => useOnUnavailableDevices(getVideoDevices(), onDisconnect);
|
|
101
160
|
/**
|
|
102
|
-
* Observes disconnect of all audio input devices and executes onDisconnect callback
|
|
161
|
+
* Observes disconnect of all audio input devices and executes onDisconnect callback.
|
|
103
162
|
* @param onDisconnect
|
|
104
163
|
* @category Device Management
|
|
105
164
|
*/
|
|
106
165
|
export const useOnUnavailableAudioInputDevices = (onDisconnect) => useOnUnavailableDevices(getAudioDevices(), onDisconnect);
|
|
107
166
|
/**
|
|
108
|
-
* Observes disconnect of all audio output devices and executes onDisconnect callback
|
|
167
|
+
* Observes disconnect of all audio output devices and executes onDisconnect callback.
|
|
109
168
|
* @param onDisconnect
|
|
110
169
|
* @category Device Management
|
|
111
170
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDevices.js","sourceRoot":"","sources":["../../../../src/core/hooks/useDevices.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"useDevices.js","sourceRoot":"","sources":["../../../../src/core/hooks/useDevices.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @internal
|
|
3
3
|
*/
|
|
4
4
|
export type VideoPublisherInit = {
|
|
5
|
+
canObserveVideo?: boolean;
|
|
5
6
|
initialVideoMuted?: boolean;
|
|
6
7
|
videoDeviceId?: string;
|
|
7
8
|
};
|
|
@@ -9,4 +10,4 @@ export type VideoPublisherInit = {
|
|
|
9
10
|
* @internal
|
|
10
11
|
* @category Device Management
|
|
11
12
|
*/
|
|
12
|
-
export declare const useVideoPublisher: ({ initialVideoMuted, videoDeviceId, }: VideoPublisherInit) => () => Promise<void>;
|
|
13
|
+
export declare const useVideoPublisher: ({ canObserveVideo, initialVideoMuted, videoDeviceId, }: VideoPublisherInit) => () => Promise<void>;
|
|
@@ -16,7 +16,7 @@ import { useDebugPreferredVideoCodec } from '../../components/Debug/useIsDebugMo
|
|
|
16
16
|
* @internal
|
|
17
17
|
* @category Device Management
|
|
18
18
|
*/
|
|
19
|
-
export const useVideoPublisher = ({ initialVideoMuted, videoDeviceId, }) => {
|
|
19
|
+
export const useVideoPublisher = ({ canObserveVideo, initialVideoMuted, videoDeviceId, }) => {
|
|
20
20
|
const call = useCall();
|
|
21
21
|
const callState = useCallState();
|
|
22
22
|
const callingState = useCallCallingState();
|
|
@@ -61,7 +61,7 @@ export const useVideoPublisher = ({ initialVideoMuted, videoDeviceId, }) => {
|
|
|
61
61
|
}
|
|
62
62
|
}, [callingState, initialVideoMuted, publishVideoStream]);
|
|
63
63
|
useEffect(() => {
|
|
64
|
-
if (!localParticipant$)
|
|
64
|
+
if (!localParticipant$ || !canObserveVideo)
|
|
65
65
|
return;
|
|
66
66
|
const subscription = watchForDisconnectedVideoDevice(localParticipant$.pipe(map((p) => p === null || p === void 0 ? void 0 : p.videoDeviceId))).subscribe(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
67
|
if (!call)
|
|
@@ -72,7 +72,7 @@ export const useVideoPublisher = ({ initialVideoMuted, videoDeviceId, }) => {
|
|
|
72
72
|
return () => {
|
|
73
73
|
subscription.unsubscribe();
|
|
74
74
|
};
|
|
75
|
-
}, [localParticipant$, call]);
|
|
75
|
+
}, [canObserveVideo, localParticipant$, call]);
|
|
76
76
|
useEffect(() => {
|
|
77
77
|
if (!(participant === null || participant === void 0 ? void 0 : participant.videoStream) || !call || !isPublishingVideo)
|
|
78
78
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVideoPublisher.js","sourceRoot":"","sources":["../../../../src/core/hooks/useVideoPublisher.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"useVideoPublisher.js","sourceRoot":"","sources":["../../../../src/core/hooks/useVideoPublisher.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"@nivo/core": "^0.80.0",
|
|
27
27
|
"@nivo/line": "^0.80.0",
|
|
28
28
|
"@stream-io/i18n": "^0.0.2",
|
|
29
|
-
"@stream-io/video-client": "^0.0.
|
|
30
|
-
"@stream-io/video-react-bindings": "^0.0.
|
|
29
|
+
"@stream-io/video-client": "^0.0.8",
|
|
30
|
+
"@stream-io/video-react-bindings": "^0.0.8",
|
|
31
31
|
"clsx": "^1.2.1",
|
|
32
32
|
"rxjs": "~7.8.1"
|
|
33
33
|
},
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"typedoc": "^0.24.7",
|
|
48
48
|
"typescript": "^4.9.5"
|
|
49
49
|
},
|
|
50
|
-
"version": "0.0.
|
|
50
|
+
"version": "0.0.19"
|
|
51
51
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
ComponentProps,
|
|
4
|
+
ComponentType,
|
|
5
|
+
forwardRef,
|
|
6
|
+
useEffect,
|
|
7
|
+
useState,
|
|
8
|
+
} from 'react';
|
|
3
9
|
import {
|
|
4
10
|
Restricted,
|
|
5
11
|
useCall,
|
|
@@ -120,13 +126,18 @@ const ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(
|
|
|
120
126
|
export const ParticipantActionsContextMenu = ({
|
|
121
127
|
participant,
|
|
122
128
|
participantViewElement,
|
|
129
|
+
videoElement,
|
|
123
130
|
}: {
|
|
124
131
|
participant: StreamVideoParticipant;
|
|
125
132
|
participantViewElement?: HTMLDivElement | null;
|
|
133
|
+
videoElement?: HTMLVideoElement | null;
|
|
126
134
|
}) => {
|
|
127
135
|
const [fullscreenModeOn, setFullscreenModeOn] = useState(
|
|
128
136
|
!!document.fullscreenElement,
|
|
129
137
|
);
|
|
138
|
+
const [pictureInPictureElement, setPictureInPictureElement] = useState(
|
|
139
|
+
document.pictureInPictureElement,
|
|
140
|
+
);
|
|
130
141
|
const activeCall = useCall();
|
|
131
142
|
|
|
132
143
|
const blockUser = () => {
|
|
@@ -186,6 +197,43 @@ export const ParticipantActionsContextMenu = ({
|
|
|
186
197
|
.finally(() => setFullscreenModeOn(false));
|
|
187
198
|
};
|
|
188
199
|
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
if (!videoElement) return;
|
|
202
|
+
|
|
203
|
+
const handlePictureInPicture = () => {
|
|
204
|
+
setPictureInPictureElement(document.pictureInPictureElement);
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
videoElement.addEventListener(
|
|
208
|
+
'enterpictureinpicture',
|
|
209
|
+
handlePictureInPicture,
|
|
210
|
+
);
|
|
211
|
+
videoElement.addEventListener(
|
|
212
|
+
'leavepictureinpicture',
|
|
213
|
+
handlePictureInPicture,
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
return () => {
|
|
217
|
+
videoElement.removeEventListener(
|
|
218
|
+
'enterpictureinpicture',
|
|
219
|
+
handlePictureInPicture,
|
|
220
|
+
);
|
|
221
|
+
videoElement.removeEventListener(
|
|
222
|
+
'leavepictureinpicture',
|
|
223
|
+
handlePictureInPicture,
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
}, [videoElement]);
|
|
227
|
+
|
|
228
|
+
const togglePictureInPicture = () => {
|
|
229
|
+
if (videoElement && pictureInPictureElement !== videoElement)
|
|
230
|
+
return videoElement
|
|
231
|
+
.requestPictureInPicture()
|
|
232
|
+
.catch(console.error) as Promise<void>;
|
|
233
|
+
|
|
234
|
+
document.exitPictureInPicture().catch(console.error);
|
|
235
|
+
};
|
|
236
|
+
|
|
189
237
|
return (
|
|
190
238
|
<GenericMenu>
|
|
191
239
|
<GenericMenuButtonItem onClick={toggleParticipantPinnedAt}>
|
|
@@ -237,6 +285,12 @@ export const ParticipantActionsContextMenu = ({
|
|
|
237
285
|
{fullscreenModeOn ? 'Leave' : 'Enter'} fullscreen
|
|
238
286
|
</GenericMenuButtonItem>
|
|
239
287
|
)}
|
|
288
|
+
{videoElement && document.pictureInPictureEnabled && (
|
|
289
|
+
<GenericMenuButtonItem onClick={togglePictureInPicture}>
|
|
290
|
+
{pictureInPictureElement === videoElement ? 'Leave' : 'Enter'}{' '}
|
|
291
|
+
picture-in-picture
|
|
292
|
+
</GenericMenuButtonItem>
|
|
293
|
+
)}
|
|
240
294
|
<Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>
|
|
241
295
|
<GenericMenuButtonItem
|
|
242
296
|
onClick={grantPermission(OwnCapability.SEND_AUDIO)}
|
|
@@ -69,7 +69,7 @@ export const DefaultParticipantViewUI = ({
|
|
|
69
69
|
showMenuButton = true,
|
|
70
70
|
}: DefaultParticipantViewUIProps) => {
|
|
71
71
|
const call = useCall()!;
|
|
72
|
-
const { participant, participantViewElement, videoKind } =
|
|
72
|
+
const { participant, participantViewElement, videoKind, videoElement } =
|
|
73
73
|
useParticipantViewContext();
|
|
74
74
|
const { reaction, sessionId, publishedTracks } = participant;
|
|
75
75
|
|
|
@@ -96,6 +96,7 @@ export const DefaultParticipantViewUI = ({
|
|
|
96
96
|
<ParticipantActionsContextMenu
|
|
97
97
|
participantViewElement={participantViewElement}
|
|
98
98
|
participant={participant}
|
|
99
|
+
videoElement={videoElement}
|
|
99
100
|
/>
|
|
100
101
|
</MenuToggle>
|
|
101
102
|
)}
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
useAudioInputDeviceFallback,
|
|
28
28
|
useAudioOutputDeviceFallback,
|
|
29
29
|
useAudioPublisher,
|
|
30
|
+
useHasBrowserPermissions,
|
|
30
31
|
useVideoDeviceFallback,
|
|
31
32
|
useVideoPublisher,
|
|
32
33
|
} from '../hooks';
|
|
@@ -243,7 +244,10 @@ export const MediaDevicesProvider = ({
|
|
|
243
244
|
const callState = useCallState();
|
|
244
245
|
const metadata = useCallMetadata();
|
|
245
246
|
const { localParticipant$ } = callState;
|
|
246
|
-
|
|
247
|
+
const canObserveVideo = useHasBrowserPermissions('camera' as PermissionName);
|
|
248
|
+
const canObserveAudio = useHasBrowserPermissions(
|
|
249
|
+
'microphone' as PermissionName,
|
|
250
|
+
);
|
|
247
251
|
const [selectedAudioInputDeviceId, selectAudioInputDeviceId] = useState<
|
|
248
252
|
MediaDevicesContextAPI['selectedAudioInputDeviceId']
|
|
249
253
|
>(initialAudioInputDeviceId);
|
|
@@ -345,14 +349,18 @@ export const MediaDevicesProvider = ({
|
|
|
345
349
|
|
|
346
350
|
useAudioInputDeviceFallback(
|
|
347
351
|
() => switchDevice('audioinput', DEFAULT_DEVICE_ID),
|
|
352
|
+
canObserveAudio,
|
|
348
353
|
selectedAudioInputDeviceId,
|
|
349
354
|
);
|
|
350
355
|
useAudioOutputDeviceFallback(
|
|
351
356
|
() => switchDevice('audiooutput', DEFAULT_DEVICE_ID),
|
|
357
|
+
// audiooutput devices can be enumerated only with microphone permissions
|
|
358
|
+
canObserveAudio,
|
|
352
359
|
selectedAudioOutputDeviceId,
|
|
353
360
|
);
|
|
354
361
|
useVideoDeviceFallback(
|
|
355
362
|
() => switchDevice('videoinput', DEFAULT_DEVICE_ID),
|
|
363
|
+
canObserveVideo,
|
|
356
364
|
selectedVideoDeviceId,
|
|
357
365
|
);
|
|
358
366
|
|
|
@@ -362,7 +370,9 @@ export const MediaDevicesProvider = ({
|
|
|
362
370
|
}, [call, callingState, selectedAudioOutputDeviceId]);
|
|
363
371
|
|
|
364
372
|
useEffect(() => {
|
|
365
|
-
|
|
373
|
+
// audiooutput devices can be enumerated only with microphone permissions
|
|
374
|
+
if (!localParticipant$ || !canObserveAudio) return;
|
|
375
|
+
|
|
366
376
|
const subscription = watchForDisconnectedAudioOutputDevice(
|
|
367
377
|
localParticipant$.pipe(map((p) => p?.audioOutputDeviceId)),
|
|
368
378
|
).subscribe(async () => {
|
|
@@ -371,7 +381,7 @@ export const MediaDevicesProvider = ({
|
|
|
371
381
|
return () => {
|
|
372
382
|
subscription.unsubscribe();
|
|
373
383
|
};
|
|
374
|
-
}, [localParticipant$]);
|
|
384
|
+
}, [canObserveAudio, localParticipant$]);
|
|
375
385
|
|
|
376
386
|
const contextValue: MediaDevicesContextAPI = {
|
|
377
387
|
disposeOfMediaStream,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
* @internal
|
|
20
20
|
*/
|
|
21
21
|
export type AudioPublisherInit = {
|
|
22
|
+
canObserveAudio?: boolean;
|
|
22
23
|
initialAudioMuted?: boolean;
|
|
23
24
|
audioDeviceId?: string;
|
|
24
25
|
};
|
|
@@ -28,6 +29,7 @@ export type AudioPublisherInit = {
|
|
|
28
29
|
* @category Device Management
|
|
29
30
|
*/
|
|
30
31
|
export const useAudioPublisher = ({
|
|
32
|
+
canObserveAudio,
|
|
31
33
|
initialAudioMuted,
|
|
32
34
|
audioDeviceId,
|
|
33
35
|
}: AudioPublisherInit) => {
|
|
@@ -65,7 +67,7 @@ export const useAudioPublisher = ({
|
|
|
65
67
|
}, [callingState, initialAudioMuted, publishAudioStream]);
|
|
66
68
|
|
|
67
69
|
useEffect(() => {
|
|
68
|
-
if (!localParticipant$) return;
|
|
70
|
+
if (!localParticipant$ || !canObserveAudio) return;
|
|
69
71
|
const subscription = watchForDisconnectedAudioDevice(
|
|
70
72
|
localParticipant$.pipe(map((p) => p?.audioDeviceId)),
|
|
71
73
|
).subscribe(async () => {
|
|
@@ -76,7 +78,7 @@ export const useAudioPublisher = ({
|
|
|
76
78
|
return () => {
|
|
77
79
|
subscription.unsubscribe();
|
|
78
80
|
};
|
|
79
|
-
}, [localParticipant$, call]);
|
|
81
|
+
}, [canObserveAudio, localParticipant$, call]);
|
|
80
82
|
|
|
81
83
|
useEffect(() => {
|
|
82
84
|
if (!participant?.audioStream || !call || !isPublishingAudio) return;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
1
|
+
import { ChangeEvent, useEffect, useState } from 'react';
|
|
2
2
|
import { Observable, pairwise } from 'rxjs';
|
|
3
3
|
import {
|
|
4
4
|
getAudioDevices,
|
|
@@ -6,6 +6,38 @@ import {
|
|
|
6
6
|
getVideoDevices,
|
|
7
7
|
} from '@stream-io/video-client';
|
|
8
8
|
|
|
9
|
+
export const useHasBrowserPermissions = (permissionName: PermissionName) => {
|
|
10
|
+
const [canSubscribe, enableSubscription] = useState(false);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let permissionState: PermissionStatus;
|
|
14
|
+
const handlePermissionChange = (e: Event) => {
|
|
15
|
+
const { state } = (e as unknown as ChangeEvent<PermissionStatus>).target;
|
|
16
|
+
enableSubscription(state === 'granted');
|
|
17
|
+
};
|
|
18
|
+
const checkPermissions = async () => {
|
|
19
|
+
try {
|
|
20
|
+
permissionState = await navigator.permissions.query({
|
|
21
|
+
name: permissionName,
|
|
22
|
+
});
|
|
23
|
+
permissionState.addEventListener('change', handlePermissionChange);
|
|
24
|
+
enableSubscription(permissionState.state === 'granted');
|
|
25
|
+
} catch (e) {
|
|
26
|
+
// permission does not exist - cannot be queried
|
|
27
|
+
// an example would be Firefox - camera, neither microphone perms can be queried
|
|
28
|
+
enableSubscription(true);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
checkPermissions();
|
|
32
|
+
|
|
33
|
+
return () => {
|
|
34
|
+
permissionState?.removeEventListener('change', handlePermissionChange);
|
|
35
|
+
};
|
|
36
|
+
}, [permissionName]);
|
|
37
|
+
|
|
38
|
+
return canSubscribe;
|
|
39
|
+
};
|
|
40
|
+
|
|
9
41
|
/**
|
|
10
42
|
* Observes changes in connected devices and maintains an up-to-date array of connected MediaDeviceInfo objects.
|
|
11
43
|
* @param observeDevices
|
|
@@ -48,17 +80,23 @@ export const useAudioOutputDevices = () => useDevices(getAudioOutputDevices);
|
|
|
48
80
|
/**
|
|
49
81
|
* Verifies that newly selected device id exists among the registered devices.
|
|
50
82
|
* If the selected device id is not found among existing devices, switches to the default device.
|
|
83
|
+
* The media devices are observed only if a given permission ('camera' resp. 'microphone') is granted in browser.
|
|
84
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
85
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
86
|
+
* @param canObserve
|
|
51
87
|
* @param devices$
|
|
52
88
|
* @param switchToDefaultDevice
|
|
53
89
|
* @param selectedDeviceId
|
|
54
90
|
* @category Device Management
|
|
55
91
|
*/
|
|
56
92
|
export const useDeviceFallback = (
|
|
93
|
+
canObserve: boolean,
|
|
57
94
|
devices$: Observable<MediaDeviceInfo[]>,
|
|
58
95
|
switchToDefaultDevice: () => void,
|
|
59
96
|
selectedDeviceId?: string,
|
|
60
97
|
) => {
|
|
61
98
|
useEffect(() => {
|
|
99
|
+
if (!canObserve) return;
|
|
62
100
|
const validateDeviceId = devices$.pipe().subscribe((devices) => {
|
|
63
101
|
const deviceFound = devices.find(
|
|
64
102
|
(device) => device.deviceId === selectedDeviceId,
|
|
@@ -69,54 +107,83 @@ export const useDeviceFallback = (
|
|
|
69
107
|
return () => {
|
|
70
108
|
validateDeviceId.unsubscribe();
|
|
71
109
|
};
|
|
72
|
-
}, [devices$, selectedDeviceId, switchToDefaultDevice]);
|
|
110
|
+
}, [canObserve, devices$, selectedDeviceId, switchToDefaultDevice]);
|
|
73
111
|
};
|
|
74
112
|
|
|
75
113
|
/**
|
|
76
114
|
* Verifies that newly selected video device id exists among the registered devices.
|
|
77
115
|
* If the selected device id is not found among existing devices, switches to the default video device.
|
|
116
|
+
* The media devices are observed only if 'camera' permission is granted in browser.
|
|
117
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
118
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
119
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
78
120
|
* @param switchToDefaultDevice
|
|
121
|
+
* @param canObserve
|
|
79
122
|
* @param selectedDeviceId
|
|
80
123
|
* @category Device Management
|
|
81
124
|
*/
|
|
82
125
|
export const useVideoDeviceFallback = (
|
|
83
126
|
switchToDefaultDevice: () => void,
|
|
127
|
+
canObserve: boolean,
|
|
84
128
|
selectedDeviceId?: string,
|
|
85
129
|
) =>
|
|
86
|
-
useDeviceFallback(
|
|
130
|
+
useDeviceFallback(
|
|
131
|
+
canObserve,
|
|
132
|
+
getVideoDevices(),
|
|
133
|
+
switchToDefaultDevice,
|
|
134
|
+
selectedDeviceId,
|
|
135
|
+
);
|
|
87
136
|
|
|
88
137
|
/**
|
|
89
138
|
* Verifies that newly selected audio input device id exists among the registered devices.
|
|
90
139
|
* If the selected device id is not found among existing devices, switches to the default audio input device.
|
|
140
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
141
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
142
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
143
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
91
144
|
* @param switchToDefaultDevice
|
|
145
|
+
* @param canObserve
|
|
92
146
|
* @param selectedDeviceId
|
|
93
147
|
* @category Device Management
|
|
94
148
|
*/
|
|
95
149
|
export const useAudioInputDeviceFallback = (
|
|
96
150
|
switchToDefaultDevice: () => void,
|
|
151
|
+
canObserve: boolean,
|
|
97
152
|
selectedDeviceId?: string,
|
|
98
153
|
) =>
|
|
99
|
-
useDeviceFallback(
|
|
154
|
+
useDeviceFallback(
|
|
155
|
+
canObserve,
|
|
156
|
+
getAudioDevices(),
|
|
157
|
+
switchToDefaultDevice,
|
|
158
|
+
selectedDeviceId,
|
|
159
|
+
);
|
|
100
160
|
|
|
101
161
|
/**
|
|
102
162
|
* Verifies that newly selected audio output device id exists among the registered devices.
|
|
103
163
|
* If the selected device id is not found among existing devices, switches to the default audio output device.
|
|
164
|
+
* The media devices are observed only if 'microphone' permission is granted in browser.
|
|
165
|
+
* It is integrators responsibility to instruct users how to enable required permissions.
|
|
166
|
+
* Regardless of current permissions settings, an intent to observe devices will take place in Firefox.
|
|
167
|
+
* This is due to the fact that Firefox does not allow to query for 'camera' and 'microphone' permissions.
|
|
104
168
|
* @param switchToDefaultDevice
|
|
169
|
+
* @param canObserve
|
|
105
170
|
* @param selectedDeviceId
|
|
106
171
|
* @category Device Management
|
|
107
172
|
*/
|
|
108
173
|
export const useAudioOutputDeviceFallback = (
|
|
109
174
|
switchToDefaultDevice: () => void,
|
|
175
|
+
canObserve: boolean,
|
|
110
176
|
selectedDeviceId?: string,
|
|
111
177
|
) =>
|
|
112
178
|
useDeviceFallback(
|
|
179
|
+
canObserve,
|
|
113
180
|
getAudioOutputDevices(),
|
|
114
181
|
switchToDefaultDevice,
|
|
115
182
|
selectedDeviceId,
|
|
116
183
|
);
|
|
117
184
|
|
|
118
185
|
/**
|
|
119
|
-
* Observes devices of certain kind are made unavailable and executes onDisconnect callback
|
|
186
|
+
* Observes devices of certain kind are made unavailable and executes onDisconnect callback.
|
|
120
187
|
* @param observeDevices
|
|
121
188
|
* @param onDisconnect
|
|
122
189
|
* @category Device Management
|
|
@@ -137,7 +204,7 @@ export const useOnUnavailableDevices = (
|
|
|
137
204
|
};
|
|
138
205
|
|
|
139
206
|
/**
|
|
140
|
-
* Observes disconnect of all video devices and executes onDisconnect callback
|
|
207
|
+
* Observes disconnect of all video devices and executes onDisconnect callback.
|
|
141
208
|
* @param onDisconnect
|
|
142
209
|
* @category Device Management
|
|
143
210
|
*/
|
|
@@ -145,7 +212,7 @@ export const useOnUnavailableVideoDevices = (onDisconnect: () => void) =>
|
|
|
145
212
|
useOnUnavailableDevices(getVideoDevices(), onDisconnect);
|
|
146
213
|
|
|
147
214
|
/**
|
|
148
|
-
* Observes disconnect of all audio input devices and executes onDisconnect callback
|
|
215
|
+
* Observes disconnect of all audio input devices and executes onDisconnect callback.
|
|
149
216
|
* @param onDisconnect
|
|
150
217
|
* @category Device Management
|
|
151
218
|
*/
|
|
@@ -153,7 +220,7 @@ export const useOnUnavailableAudioInputDevices = (onDisconnect: () => void) =>
|
|
|
153
220
|
useOnUnavailableDevices(getAudioDevices(), onDisconnect);
|
|
154
221
|
|
|
155
222
|
/**
|
|
156
|
-
* Observes disconnect of all audio output devices and executes onDisconnect callback
|
|
223
|
+
* Observes disconnect of all audio output devices and executes onDisconnect callback.
|
|
157
224
|
* @param onDisconnect
|
|
158
225
|
* @category Device Management
|
|
159
226
|
*/
|
|
@@ -22,6 +22,7 @@ import { useDebugPreferredVideoCodec } from '../../components/Debug/useIsDebugMo
|
|
|
22
22
|
* @internal
|
|
23
23
|
*/
|
|
24
24
|
export type VideoPublisherInit = {
|
|
25
|
+
canObserveVideo?: boolean;
|
|
25
26
|
initialVideoMuted?: boolean;
|
|
26
27
|
videoDeviceId?: string;
|
|
27
28
|
};
|
|
@@ -31,6 +32,7 @@ export type VideoPublisherInit = {
|
|
|
31
32
|
* @category Device Management
|
|
32
33
|
*/
|
|
33
34
|
export const useVideoPublisher = ({
|
|
35
|
+
canObserveVideo,
|
|
34
36
|
initialVideoMuted,
|
|
35
37
|
videoDeviceId,
|
|
36
38
|
}: VideoPublisherInit) => {
|
|
@@ -82,7 +84,7 @@ export const useVideoPublisher = ({
|
|
|
82
84
|
}, [callingState, initialVideoMuted, publishVideoStream]);
|
|
83
85
|
|
|
84
86
|
useEffect(() => {
|
|
85
|
-
if (!localParticipant$) return;
|
|
87
|
+
if (!localParticipant$ || !canObserveVideo) return;
|
|
86
88
|
const subscription = watchForDisconnectedVideoDevice(
|
|
87
89
|
localParticipant$.pipe(map((p) => p?.videoDeviceId)),
|
|
88
90
|
).subscribe(async () => {
|
|
@@ -93,7 +95,7 @@ export const useVideoPublisher = ({
|
|
|
93
95
|
return () => {
|
|
94
96
|
subscription.unsubscribe();
|
|
95
97
|
};
|
|
96
|
-
}, [localParticipant$, call]);
|
|
98
|
+
}, [canObserveVideo, localParticipant$, call]);
|
|
97
99
|
|
|
98
100
|
useEffect(() => {
|
|
99
101
|
if (!participant?.videoStream || !call || !isPublishingVideo) return;
|