@stream-io/video-react-native-sdk 0.0.1-alpha.403 → 0.0.1-alpha.404
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 +10 -0
- package/dist/src/components/Call/Lobby/Lobby.js +4 -4
- package/dist/src/components/Call/Lobby/Lobby.js.map +1 -1
- package/dist/src/components/Call/RingingCallContent/OutgoingCall.js +4 -2
- package/dist/src/components/Call/RingingCallContent/OutgoingCall.js.map +1 -1
- package/dist/src/hooks/index.d.ts +0 -1
- package/dist/src/hooks/index.js +0 -1
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/internal/useCallMediaStreamCleanup.d.ts +4 -0
- package/dist/src/hooks/internal/useCallMediaStreamCleanup.js +27 -0
- package/dist/src/hooks/internal/useCallMediaStreamCleanup.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/components/Call/Lobby/Lobby.tsx +5 -4
- package/src/components/Call/RingingCallContent/OutgoingCall.tsx +10 -4
- package/src/hooks/index.ts +0 -1
- package/src/hooks/internal/useCallMediaStreamCleanup.ts +31 -0
- package/dist/src/hooks/useLocalVideoStream.d.ts +0 -7
- package/dist/src/hooks/useLocalVideoStream.js +0 -68
- package/dist/src/hooks/useLocalVideoStream.js.map +0 -1
- package/src/hooks/useLocalVideoStream.ts +0 -77
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [0.0.1-alpha.404](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-0.0.1-alpha.403...@stream-io/video-react-native-sdk-0.0.1-alpha.404) (2023-08-31)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **react-native:** blank stream on join ([#1022](https://github.com/GetStream/stream-video-js/issues/1022)) ([d5a48f6](https://github.com/GetStream/stream-video-js/commit/d5a48f6e75bf4e1b5c0745b7f0b001fd0ac4b183))
|
|
11
|
+
* **react-native:** cleanup video streams on lobby view ([762b9bf](https://github.com/GetStream/stream-video-js/commit/762b9bfd390a7c90fc3eba381766317ea298745f))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
5
15
|
## [0.0.1-alpha.403](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-0.0.1-alpha.402...@stream-io/video-react-native-sdk-0.0.1-alpha.403) (2023-08-30)
|
|
6
16
|
|
|
7
17
|
|
|
@@ -8,13 +8,13 @@ const react_1 = __importDefault(require("react"));
|
|
|
8
8
|
const react_native_1 = require("react-native");
|
|
9
9
|
const icons_1 = require("../../../icons");
|
|
10
10
|
const video_react_bindings_1 = require("@stream-io/video-react-bindings");
|
|
11
|
-
const hooks_1 = require("../../../hooks");
|
|
12
11
|
const Avatar_1 = require("../../utility/Avatar");
|
|
13
12
|
const constants_1 = require("../../../constants");
|
|
14
13
|
const react_native_webrtc_1 = require("@stream-io/react-native-webrtc");
|
|
15
14
|
const LobbyControls_1 = require("../CallControls/LobbyControls");
|
|
16
15
|
const JoinCallButton_1 = require("./JoinCallButton");
|
|
17
16
|
const ThemeContext_1 = require("../../../contexts/ThemeContext");
|
|
17
|
+
const useCallMediaStreamCleanup_1 = require("../../../hooks/internal/useCallMediaStreamCleanup");
|
|
18
18
|
/**
|
|
19
19
|
* Components that acts as a pre-join view for the call. Where you can preview your video and audio. Check for call details and check for number of participants already in the call.
|
|
20
20
|
*/
|
|
@@ -23,12 +23,12 @@ const Lobby = ({ onJoinCallHandler, LobbyControls = LobbyControls_1.LobbyControl
|
|
|
23
23
|
const connectedUser = (0, video_react_bindings_1.useConnectedUser)();
|
|
24
24
|
const { useCameraState, useCallSession } = (0, video_react_bindings_1.useCallStateHooks)();
|
|
25
25
|
const { direction, status: cameraStatus } = useCameraState();
|
|
26
|
-
const localVideoStream = (0, hooks_1.useLocalVideoStream)();
|
|
27
|
-
const isVideoAvailable = !!localVideoStream && cameraStatus === 'enabled';
|
|
28
26
|
const call = (0, video_react_bindings_1.useCall)();
|
|
29
27
|
const session = useCallSession();
|
|
30
28
|
const { t } = (0, video_react_bindings_1.useI18n)();
|
|
29
|
+
const localVideoStream = call?.camera.state.mediaStream;
|
|
31
30
|
const participantsCount = session?.participants.length;
|
|
31
|
+
(0, useCallMediaStreamCleanup_1.useCallMediaStreamCleanup)();
|
|
32
32
|
const connectedUserAsParticipant = {
|
|
33
33
|
userId: connectedUser?.id,
|
|
34
34
|
image: connectedUser?.image,
|
|
@@ -60,7 +60,7 @@ const Lobby = ({ onJoinCallHandler, LobbyControls = LobbyControls_1.LobbyControl
|
|
|
60
60
|
{ backgroundColor: colors.disabled },
|
|
61
61
|
lobby.videoContainer,
|
|
62
62
|
]}>
|
|
63
|
-
{
|
|
63
|
+
{cameraStatus === 'enabled' ? (<react_native_webrtc_1.RTCView mirror={direction === 'front'} streamURL={localVideoStream?.toURL()} objectFit="cover" style={react_native_1.StyleSheet.absoluteFillObject}/>) : (<react_native_1.View style={[styles.avatarContainer, lobby.avatarContainer]}>
|
|
64
64
|
<Avatar_1.Avatar participant={connectedUserAsParticipant}/>
|
|
65
65
|
</react_native_1.View>)}
|
|
66
66
|
<ParticipantStatus />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lobby.js","sourceRoot":"","sources":["../../../../../src/components/Call/Lobby/Lobby.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,+CAAsD;AACtD,0CAAwC;AACxC,0EAKyC;AACzC,
|
|
1
|
+
{"version":3,"file":"Lobby.js","sourceRoot":"","sources":["../../../../../src/components/Call/Lobby/Lobby.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,13 @@ exports.OutgoingCall = void 0;
|
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const react_native_1 = require("react-native");
|
|
9
9
|
const UserInfo_1 = require("./UserInfo");
|
|
10
|
-
const useLocalVideoStream_1 = require("../../../hooks/useLocalVideoStream");
|
|
11
10
|
const constants_1 = require("../../../constants");
|
|
12
11
|
const video_react_bindings_1 = require("@stream-io/video-react-bindings");
|
|
13
12
|
const react_native_webrtc_1 = require("@stream-io/react-native-webrtc");
|
|
14
13
|
const ThemeContext_1 = require("../../../contexts/ThemeContext");
|
|
15
14
|
const CallControls_1 = require("../CallControls");
|
|
16
15
|
const CallTopView_1 = require("../CallTopView");
|
|
16
|
+
const useCallMediaStreamCleanup_1 = require("../../../hooks/internal/useCallMediaStreamCleanup");
|
|
17
17
|
/**
|
|
18
18
|
* An outgoing call with the callee's avatar, name, caller's camera in background, reject and mute buttons.
|
|
19
19
|
* Used after the user has initiated a call.
|
|
@@ -52,9 +52,11 @@ const OutgoingCall = ({ CallTopView = CallTopView_1.CallTopView, OutgoingCallCon
|
|
|
52
52
|
exports.OutgoingCall = OutgoingCall;
|
|
53
53
|
const Background = () => {
|
|
54
54
|
const { theme: { colors, outgoingCall }, } = (0, ThemeContext_1.useTheme)();
|
|
55
|
-
const
|
|
55
|
+
const call = (0, video_react_bindings_1.useCall)();
|
|
56
56
|
const { useCameraState } = (0, video_react_bindings_1.useCallStateHooks)();
|
|
57
57
|
const { status } = useCameraState();
|
|
58
|
+
const localVideoStream = call?.camera.state.mediaStream;
|
|
59
|
+
(0, useCallMediaStreamCleanup_1.useCallMediaStreamCleanup)();
|
|
58
60
|
if (status === 'disabled' || !localVideoStream) {
|
|
59
61
|
return (<react_native_1.View style={[
|
|
60
62
|
styles.background,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutgoingCall.js","sourceRoot":"","sources":["../../../../../src/components/Call/RingingCallContent/OutgoingCall.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,+CAAsD;AACtD,yCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"OutgoingCall.js","sourceRoot":"","sources":["../../../../../src/components/Call/RingingCallContent/OutgoingCall.tsx"],"names":[],"mappings":"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"}
|
package/dist/src/hooks/index.js
CHANGED
|
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./useLocalVideoStream"), exports);
|
|
18
17
|
__exportStar(require("./useIncallManager"), exports);
|
|
19
18
|
__exportStar(require("./usePermissionRequest"), exports);
|
|
20
19
|
__exportStar(require("./usePermissionNotification"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,yDAAuC;AACvC,8DAA4C;AAC5C,yCAAuB;AACvB,kEAAgD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCallMediaStreamCleanup = void 0;
|
|
4
|
+
const video_client_1 = require("@stream-io/video-client");
|
|
5
|
+
const video_react_bindings_1 = require("@stream-io/video-react-bindings");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
/**
|
|
8
|
+
* This hook is meant to be used in Lobby view or equivalent.
|
|
9
|
+
*/
|
|
10
|
+
const useCallMediaStreamCleanup = () => {
|
|
11
|
+
const call = (0, video_react_bindings_1.useCall)();
|
|
12
|
+
// keeping a reference of call to handle cleanup media stream only on unmount
|
|
13
|
+
const callRef = (0, react_1.useRef)(call);
|
|
14
|
+
callRef.current = call;
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
return () => {
|
|
17
|
+
if (!(callRef.current?.state.callingState === video_client_1.CallingState.JOINED ||
|
|
18
|
+
callRef.current?.state.callingState === video_client_1.CallingState.JOINING)) {
|
|
19
|
+
// we cleanup media stream only if call is not joined or joining
|
|
20
|
+
const mediaStream = callRef.current?.camera.state.mediaStream;
|
|
21
|
+
(0, video_client_1.disposeOfMediaStream)(mediaStream);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}, []);
|
|
25
|
+
};
|
|
26
|
+
exports.useCallMediaStreamCleanup = useCallMediaStreamCleanup;
|
|
27
|
+
//# sourceMappingURL=useCallMediaStreamCleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCallMediaStreamCleanup.js","sourceRoot":"","sources":["../../../../src/hooks/internal/useCallMediaStreamCleanup.ts"],"names":[],"mappings":";;;AACA,0DAA6E;AAC7E,0EAA0D;AAC1D,iCAA0C;AAE1C;;GAEG;AACI,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,IAAA,8BAAO,GAAE,CAAC;IACvB,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAEvB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IACE,CAAC,CACC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,2BAAY,CAAC,MAAM;gBAC3D,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,2BAAY,CAAC,OAAO,CAC7D,EACD;gBACA,gEAAgE;gBAChE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,WAErC,CAAC;gBACd,IAAA,mCAAoB,EAAC,WAAW,CAAC,CAAC;aACnC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAtBW,QAAA,yBAAyB,6BAsBpC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "0.0.1-alpha.
|
|
1
|
+
export declare const version = "0.0.1-alpha.404";
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stream-io/video-react-native-sdk",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.404",
|
|
4
4
|
"packageManager": "yarn@3.2.4",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@stream-io/i18n": "^0.1.1",
|
|
33
|
-
"@stream-io/video-client": "^0.3.
|
|
34
|
-
"@stream-io/video-react-bindings": "^0.2.
|
|
33
|
+
"@stream-io/video-client": "^0.3.11",
|
|
34
|
+
"@stream-io/video-react-bindings": "^0.2.12",
|
|
35
35
|
"intl-pluralrules": "2.0.1",
|
|
36
36
|
"lodash.merge": "^4.6.2",
|
|
37
37
|
"react-native-url-polyfill": "2.0.0",
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
useConnectedUser,
|
|
8
8
|
useI18n,
|
|
9
9
|
} from '@stream-io/video-react-bindings';
|
|
10
|
-
import { useLocalVideoStream } from '../../../hooks';
|
|
11
10
|
import { Avatar } from '../../utility/Avatar';
|
|
12
11
|
import { StreamVideoParticipant } from '@stream-io/video-client';
|
|
13
12
|
import { LOBBY_VIDEO_VIEW_HEIGHT } from '../../../constants';
|
|
@@ -18,6 +17,7 @@ import {
|
|
|
18
17
|
JoinCallButtonProps,
|
|
19
18
|
} from './JoinCallButton';
|
|
20
19
|
import { useTheme } from '../../../contexts/ThemeContext';
|
|
20
|
+
import { useCallMediaStreamCleanup } from '../../../hooks/internal/useCallMediaStreamCleanup';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Props for the Lobby Component.
|
|
@@ -51,13 +51,14 @@ export const Lobby = ({
|
|
|
51
51
|
const connectedUser = useConnectedUser();
|
|
52
52
|
const { useCameraState, useCallSession } = useCallStateHooks();
|
|
53
53
|
const { direction, status: cameraStatus } = useCameraState();
|
|
54
|
-
const localVideoStream = useLocalVideoStream();
|
|
55
|
-
const isVideoAvailable = !!localVideoStream && cameraStatus === 'enabled';
|
|
56
54
|
const call = useCall();
|
|
57
55
|
const session = useCallSession();
|
|
58
56
|
const { t } = useI18n();
|
|
57
|
+
const localVideoStream = call?.camera.state.mediaStream;
|
|
59
58
|
const participantsCount = session?.participants.length;
|
|
60
59
|
|
|
60
|
+
useCallMediaStreamCleanup();
|
|
61
|
+
|
|
61
62
|
const connectedUserAsParticipant = {
|
|
62
63
|
userId: connectedUser?.id,
|
|
63
64
|
image: connectedUser?.image,
|
|
@@ -100,7 +101,7 @@ export const Lobby = ({
|
|
|
100
101
|
lobby.videoContainer,
|
|
101
102
|
]}
|
|
102
103
|
>
|
|
103
|
-
{
|
|
104
|
+
{cameraStatus === 'enabled' ? (
|
|
104
105
|
<RTCView
|
|
105
106
|
mirror={direction === 'front'}
|
|
106
107
|
streamURL={localVideoStream?.toURL()}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StyleSheet, Text, View } from 'react-native';
|
|
3
3
|
import { UserInfo } from './UserInfo';
|
|
4
|
-
import { useLocalVideoStream } from '../../../hooks/useLocalVideoStream';
|
|
5
4
|
import { Z_INDEX } from '../../../constants';
|
|
6
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
useCall,
|
|
7
|
+
useCallStateHooks,
|
|
8
|
+
useI18n,
|
|
9
|
+
} from '@stream-io/video-react-bindings';
|
|
7
10
|
import { RTCView } from '@stream-io/react-native-webrtc';
|
|
8
11
|
import { useTheme } from '../../../contexts/ThemeContext';
|
|
9
12
|
import {
|
|
@@ -14,6 +17,7 @@ import {
|
|
|
14
17
|
CallTopView as DefaultCallTopView,
|
|
15
18
|
CallTopViewProps,
|
|
16
19
|
} from '../CallTopView';
|
|
20
|
+
import { useCallMediaStreamCleanup } from '../../../hooks/internal/useCallMediaStreamCleanup';
|
|
17
21
|
|
|
18
22
|
/**
|
|
19
23
|
* Props for the OutgoingCall Component.
|
|
@@ -83,10 +87,12 @@ const Background = () => {
|
|
|
83
87
|
const {
|
|
84
88
|
theme: { colors, outgoingCall },
|
|
85
89
|
} = useTheme();
|
|
86
|
-
|
|
87
|
-
const localVideoStream = useLocalVideoStream();
|
|
90
|
+
const call = useCall();
|
|
88
91
|
const { useCameraState } = useCallStateHooks();
|
|
89
92
|
const { status } = useCameraState();
|
|
93
|
+
const localVideoStream = call?.camera.state.mediaStream;
|
|
94
|
+
|
|
95
|
+
useCallMediaStreamCleanup();
|
|
90
96
|
|
|
91
97
|
if (status === 'disabled' || !localVideoStream) {
|
|
92
98
|
return (
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MediaStream } from '@stream-io/react-native-webrtc';
|
|
2
|
+
import { CallingState, disposeOfMediaStream } from '@stream-io/video-client';
|
|
3
|
+
import { useCall } from '@stream-io/video-react-bindings';
|
|
4
|
+
import { useEffect, useRef } from 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This hook is meant to be used in Lobby view or equivalent.
|
|
8
|
+
*/
|
|
9
|
+
export const useCallMediaStreamCleanup = () => {
|
|
10
|
+
const call = useCall();
|
|
11
|
+
// keeping a reference of call to handle cleanup media stream only on unmount
|
|
12
|
+
const callRef = useRef(call);
|
|
13
|
+
callRef.current = call;
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
return () => {
|
|
17
|
+
if (
|
|
18
|
+
!(
|
|
19
|
+
callRef.current?.state.callingState === CallingState.JOINED ||
|
|
20
|
+
callRef.current?.state.callingState === CallingState.JOINING
|
|
21
|
+
)
|
|
22
|
+
) {
|
|
23
|
+
// we cleanup media stream only if call is not joined or joining
|
|
24
|
+
const mediaStream = callRef.current?.camera.state.mediaStream as
|
|
25
|
+
| MediaStream
|
|
26
|
+
| undefined;
|
|
27
|
+
disposeOfMediaStream(mediaStream);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}, []);
|
|
31
|
+
};
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useLocalVideoStream = void 0;
|
|
4
|
-
const react_1 = require("react");
|
|
5
|
-
const video_client_1 = require("@stream-io/video-client");
|
|
6
|
-
const contexts_1 = require("../contexts");
|
|
7
|
-
const hooks_1 = require("../utils/hooks");
|
|
8
|
-
const video_react_bindings_1 = require("@stream-io/video-react-bindings");
|
|
9
|
-
/**
|
|
10
|
-
* A hook which provides the device's local video stream.
|
|
11
|
-
*
|
|
12
|
-
* @category Device Management
|
|
13
|
-
*/
|
|
14
|
-
const useLocalVideoStream = () => {
|
|
15
|
-
const [videoStream, setVideoStream] = (0, react_1.useState)(undefined);
|
|
16
|
-
const { useCameraState } = (0, video_react_bindings_1.useCallStateHooks)();
|
|
17
|
-
const { status: cameraStatus } = useCameraState();
|
|
18
|
-
const currentVideoDeviceId = (0, contexts_1.useStreamVideoStoreValue)((store) => store.currentVideoDevice)?.deviceId;
|
|
19
|
-
// Pause/Resume video stream tracks when app goes to background/foreground
|
|
20
|
-
// To save on CPU resources
|
|
21
|
-
(0, hooks_1.useAppStateListener)(() => {
|
|
22
|
-
videoStream?.getVideoTracks().forEach((track) => {
|
|
23
|
-
track.enabled = true;
|
|
24
|
-
});
|
|
25
|
-
}, () => {
|
|
26
|
-
videoStream?.getVideoTracks().forEach((track) => {
|
|
27
|
-
track.enabled = false;
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
(0, react_1.useEffect)(() => {
|
|
31
|
-
let mediaStream;
|
|
32
|
-
let interrupted = false;
|
|
33
|
-
const loadVideoStream = async () => {
|
|
34
|
-
// If there is no video device, we don't need to load a video stream.
|
|
35
|
-
if (!currentVideoDeviceId) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
const _mediaStream = await (0, video_client_1.getVideoStream)({
|
|
39
|
-
deviceId: currentVideoDeviceId,
|
|
40
|
-
});
|
|
41
|
-
if (interrupted) {
|
|
42
|
-
// device changed while we were loading the video stream, so dispose of it
|
|
43
|
-
(0, video_client_1.disposeOfMediaStream)(_mediaStream);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
mediaStream = _mediaStream;
|
|
47
|
-
setVideoStream(_mediaStream);
|
|
48
|
-
};
|
|
49
|
-
if (!cameraStatus || cameraStatus === 'disabled') {
|
|
50
|
-
if (mediaStream) {
|
|
51
|
-
(0, video_client_1.disposeOfMediaStream)(mediaStream);
|
|
52
|
-
setVideoStream(undefined);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
loadVideoStream();
|
|
57
|
-
}
|
|
58
|
-
return () => {
|
|
59
|
-
interrupted = true;
|
|
60
|
-
if (mediaStream) {
|
|
61
|
-
(0, video_client_1.disposeOfMediaStream)(mediaStream);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}, [currentVideoDeviceId, cameraStatus]);
|
|
65
|
-
return videoStream;
|
|
66
|
-
};
|
|
67
|
-
exports.useLocalVideoStream = useLocalVideoStream;
|
|
68
|
-
//# sourceMappingURL=useLocalVideoStream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useLocalVideoStream.js","sourceRoot":"","sources":["../../../src/hooks/useLocalVideoStream.ts"],"names":[],"mappings":";;;AAAA,iCAA4C;AAC5C,0DAA+E;AAE/E,0CAAuD;AACvD,0CAAqD;AACrD,0EAAoE;AAEpE;;;;GAIG;AACI,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAC5C,SAAS,CACV,CAAC;IACF,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,wCAAiB,GAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAAC;IAClD,MAAM,oBAAoB,GAAG,IAAA,mCAAwB,EACnD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACpC,EAAE,QAAQ,CAAC;IAEZ,0EAA0E;IAC1E,2BAA2B;IAC3B,IAAA,2BAAmB,EACjB,GAAG,EAAE;QACH,WAAW,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,EACD,GAAG,EAAE;QACH,WAAW,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,WAAoC,CAAC;QACzC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;YACjC,qEAAqE;YACrE,IAAI,CAAC,oBAAoB,EAAE;gBACzB,OAAO,IAAI,CAAC;aACb;YAED,MAAM,YAAY,GAAG,MAAM,IAAA,6BAAc,EAAC;gBACxC,QAAQ,EAAE,oBAAoB;aAC/B,CAAC,CAAC;YACH,IAAI,WAAW,EAAE;gBACf,0EAA0E;gBAC1E,IAAA,mCAAoB,EAAC,YAAY,CAAC,CAAC;gBACnC,OAAO;aACR;YACD,WAAW,GAAG,YAAY,CAAC;YAC3B,cAAc,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,UAAU,EAAE;YAChD,IAAI,WAAW,EAAE;gBACf,IAAA,mCAAoB,EAAC,WAAW,CAAC,CAAC;gBAClC,cAAc,CAAC,SAAS,CAAC,CAAC;aAC3B;SACF;aAAM;YACL,eAAe,EAAE,CAAC;SACnB;QAED,OAAO,GAAG,EAAE;YACV,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,WAAW,EAAE;gBACf,IAAA,mCAAoB,EAAC,WAAW,CAAC,CAAC;aACnC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzC,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAhEW,QAAA,mBAAmB,uBAgE9B"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
import { disposeOfMediaStream, getVideoStream } from '@stream-io/video-client';
|
|
3
|
-
import { MediaStream } from '@stream-io/react-native-webrtc';
|
|
4
|
-
import { useStreamVideoStoreValue } from '../contexts';
|
|
5
|
-
import { useAppStateListener } from '../utils/hooks';
|
|
6
|
-
import { useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A hook which provides the device's local video stream.
|
|
10
|
-
*
|
|
11
|
-
* @category Device Management
|
|
12
|
-
*/
|
|
13
|
-
export const useLocalVideoStream = () => {
|
|
14
|
-
const [videoStream, setVideoStream] = useState<MediaStream | undefined>(
|
|
15
|
-
undefined,
|
|
16
|
-
);
|
|
17
|
-
const { useCameraState } = useCallStateHooks();
|
|
18
|
-
const { status: cameraStatus } = useCameraState();
|
|
19
|
-
const currentVideoDeviceId = useStreamVideoStoreValue(
|
|
20
|
-
(store) => store.currentVideoDevice,
|
|
21
|
-
)?.deviceId;
|
|
22
|
-
|
|
23
|
-
// Pause/Resume video stream tracks when app goes to background/foreground
|
|
24
|
-
// To save on CPU resources
|
|
25
|
-
useAppStateListener(
|
|
26
|
-
() => {
|
|
27
|
-
videoStream?.getVideoTracks().forEach((track) => {
|
|
28
|
-
track.enabled = true;
|
|
29
|
-
});
|
|
30
|
-
},
|
|
31
|
-
() => {
|
|
32
|
-
videoStream?.getVideoTracks().forEach((track) => {
|
|
33
|
-
track.enabled = false;
|
|
34
|
-
});
|
|
35
|
-
},
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
let mediaStream: MediaStream | undefined;
|
|
40
|
-
let interrupted = false;
|
|
41
|
-
const loadVideoStream = async () => {
|
|
42
|
-
// If there is no video device, we don't need to load a video stream.
|
|
43
|
-
if (!currentVideoDeviceId) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const _mediaStream = await getVideoStream({
|
|
48
|
-
deviceId: currentVideoDeviceId,
|
|
49
|
-
});
|
|
50
|
-
if (interrupted) {
|
|
51
|
-
// device changed while we were loading the video stream, so dispose of it
|
|
52
|
-
disposeOfMediaStream(_mediaStream);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
mediaStream = _mediaStream;
|
|
56
|
-
setVideoStream(_mediaStream);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
if (!cameraStatus || cameraStatus === 'disabled') {
|
|
60
|
-
if (mediaStream) {
|
|
61
|
-
disposeOfMediaStream(mediaStream);
|
|
62
|
-
setVideoStream(undefined);
|
|
63
|
-
}
|
|
64
|
-
} else {
|
|
65
|
-
loadVideoStream();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return () => {
|
|
69
|
-
interrupted = true;
|
|
70
|
-
if (mediaStream) {
|
|
71
|
-
disposeOfMediaStream(mediaStream);
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
}, [currentVideoDeviceId, cameraStatus]);
|
|
75
|
-
|
|
76
|
-
return videoStream;
|
|
77
|
-
};
|