@stream-io/video-react-native-sdk 1.20.1 → 1.20.2
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 +14 -0
- package/dist/commonjs/components/Call/CallContent/RTCViewPipIOS.js +37 -10
- package/dist/commonjs/components/Call/CallContent/RTCViewPipIOS.js.map +1 -1
- package/dist/commonjs/components/Call/CallContent/RTCViewPipNative.js +8 -0
- package/dist/commonjs/components/Call/CallContent/RTCViewPipNative.js.map +1 -1
- package/dist/commonjs/hooks/useTrackDimensions.js +20 -7
- package/dist/commonjs/hooks/useTrackDimensions.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/module/components/Call/CallContent/RTCViewPipIOS.js +39 -12
- package/dist/module/components/Call/CallContent/RTCViewPipIOS.js.map +1 -1
- package/dist/module/components/Call/CallContent/RTCViewPipNative.js +7 -0
- package/dist/module/components/Call/CallContent/RTCViewPipNative.js.map +1 -1
- package/dist/module/hooks/useTrackDimensions.js +20 -7
- package/dist/module/hooks/useTrackDimensions.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/components/Call/CallContent/RTCViewPipIOS.d.ts.map +1 -1
- package/dist/typescript/components/Call/CallContent/RTCViewPipNative.d.ts +1 -0
- package/dist/typescript/components/Call/CallContent/RTCViewPipNative.d.ts.map +1 -1
- package/dist/typescript/hooks/useTrackDimensions.d.ts.map +1 -1
- package/dist/typescript/version.d.ts +1 -1
- package/ios/PictureInPicture/StreamPictureInPictureController.swift +4 -0
- package/ios/RTCViewPip.swift +26 -22
- package/ios/RTCViewPipManager.mm +1 -0
- package/ios/RTCViewPipManager.swift +43 -23
- package/ios/StreamVideoReactNative-Bridging-Header.h +1 -0
- package/package.json +7 -7
- package/src/components/Call/CallContent/RTCViewPipIOS.tsx +56 -12
- package/src/components/Call/CallContent/RTCViewPipNative.tsx +17 -0
- package/src/hooks/useTrackDimensions.ts +16 -5
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [1.20.2](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.20.1...@stream-io/video-react-native-sdk-1.20.2) (2025-08-05)
|
|
6
|
+
|
|
7
|
+
### Dependency Updates
|
|
8
|
+
|
|
9
|
+
- `@stream-io/noise-cancellation-react-native` updated to version `0.2.1`
|
|
10
|
+
- `@stream-io/video-filters-react-native` updated to version `0.6.1`
|
|
11
|
+
- `@stream-io/video-client` updated to version `1.27.2`
|
|
12
|
+
- `@stream-io/video-react-bindings` updated to version `1.7.11`
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- iOS PiP cleanup ([#1870](https://github.com/GetStream/stream-video-js/issues/1870)) ([88c87f4](https://github.com/GetStream/stream-video-js/commit/88c87f4c9d9b66bb5beef0464863efde720761dd)), closes [#1854](https://github.com/GetStream/stream-video-js/issues/1854)
|
|
17
|
+
- support setting iOS pip window sizes ([#1876](https://github.com/GetStream/stream-video-js/issues/1876)) ([2c553c9](https://github.com/GetStream/stream-video-js/commit/2c553c967b4ceedaf7209c1e98ab4c8025c84ca5))
|
|
18
|
+
|
|
5
19
|
## [1.20.1](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.20.0...@stream-io/video-react-native-sdk-1.20.1) (2025-08-01)
|
|
6
20
|
|
|
7
21
|
### Bug Fixes
|
|
@@ -11,6 +11,7 @@ var _reactNative = require("react-native");
|
|
|
11
11
|
var _RTCViewPipNative = require("./RTCViewPipNative");
|
|
12
12
|
var _hooks = require("../../../utils/hooks");
|
|
13
13
|
var _shouldDisableIOSLocalVideoOnBackground = require("../../../utils/internal/shouldDisableIOSLocalVideoOnBackground");
|
|
14
|
+
var _useTrackDimensions = require("../../../hooks/useTrackDimensions");
|
|
14
15
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
15
16
|
const RTCViewPipIOS = exports.RTCViewPipIOS = /*#__PURE__*/_react.default.memo(props => {
|
|
16
17
|
const {
|
|
@@ -66,22 +67,48 @@ const RTCViewPipIOS = exports.RTCViewPipIOS = /*#__PURE__*/_react.default.memo(p
|
|
|
66
67
|
subscription?.unsubscribe();
|
|
67
68
|
};
|
|
68
69
|
}, [call]);
|
|
70
|
+
const onDimensionsUpdated = (0, _react.useCallback)((width, height) => {
|
|
71
|
+
const node = (0, _reactNative.findNodeHandle)(nativeRef.current);
|
|
72
|
+
if (node !== null && width > 0 && height > 0) {
|
|
73
|
+
(0, _RTCViewPipNative.onNativeDimensionsUpdated)(node, width, height);
|
|
74
|
+
}
|
|
75
|
+
}, []);
|
|
76
|
+
const {
|
|
77
|
+
videoStream,
|
|
78
|
+
screenShareStream
|
|
79
|
+
} = participantInSpotlight;
|
|
80
|
+
const isScreenSharing = (0, _videoClient.hasScreenShare)(participantInSpotlight);
|
|
81
|
+
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
69
82
|
const streamURL = (0, _react.useMemo)(() => {
|
|
70
|
-
if (!
|
|
83
|
+
if (!videoStreamToRender) {
|
|
71
84
|
return undefined;
|
|
72
85
|
}
|
|
73
|
-
const {
|
|
74
|
-
videoStream,
|
|
75
|
-
screenShareStream
|
|
76
|
-
} = participantInSpotlight;
|
|
77
|
-
const isScreenSharing = (0, _videoClient.hasScreenShare)(participantInSpotlight);
|
|
78
|
-
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
79
86
|
return videoStreamToRender?.toURL();
|
|
80
|
-
}, [
|
|
81
|
-
return /*#__PURE__*/_react.default.createElement(_RTCViewPipNative.RTCViewPipNative, {
|
|
87
|
+
}, [videoStreamToRender]);
|
|
88
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RTCViewPipNative.RTCViewPipNative, {
|
|
82
89
|
streamURL: streamURL,
|
|
83
90
|
ref: nativeRef
|
|
84
|
-
})
|
|
91
|
+
}), /*#__PURE__*/_react.default.createElement(DimensionsUpdatedRenderless, {
|
|
92
|
+
participant: participantInSpotlight,
|
|
93
|
+
trackType: isScreenSharing ? 'screenShareTrack' : 'videoTrack',
|
|
94
|
+
onDimensionsUpdated: onDimensionsUpdated,
|
|
95
|
+
key: streamURL
|
|
96
|
+
}));
|
|
97
|
+
});
|
|
98
|
+
const DimensionsUpdatedRenderless = /*#__PURE__*/_react.default.memo(({
|
|
99
|
+
participant,
|
|
100
|
+
trackType,
|
|
101
|
+
onDimensionsUpdated
|
|
102
|
+
}) => {
|
|
103
|
+
const {
|
|
104
|
+
width,
|
|
105
|
+
height
|
|
106
|
+
} = (0, _useTrackDimensions.useTrackDimensions)(participant, trackType);
|
|
107
|
+
(0, _react.useEffect)(() => {
|
|
108
|
+
onDimensionsUpdated(width, height);
|
|
109
|
+
}, [width, height, onDimensionsUpdated]);
|
|
110
|
+
return null;
|
|
85
111
|
});
|
|
112
|
+
DimensionsUpdatedRenderless.displayName = 'DimensionsUpdatedRenderless';
|
|
86
113
|
RTCViewPipIOS.displayName = 'RTCViewPipIOS';
|
|
87
114
|
//# sourceMappingURL=RTCViewPipIOS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_interopRequireWildcard","_reactNative","_RTCViewPipNative","_hooks","_shouldDisableIOSLocalVideoOnBackground","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","RTCViewPipIOS","exports","React","memo","props","includeLocalParticipantVideo","useCall","useParticipants","useCallStateHooks","_allParticipants","sortBy","speakerLayoutSortPreset","allParticipants","useDebouncedValue","dominantSpeaker","dominantSpeaker2","filter","participant","isLocalParticipant","participantInSpotlight","useEffect","shouldDisableIOSLocalVideoOnBackgroundRef","current","nativeRef","useRef","callClosedInvokedOnce","onCallClosed","node","findNodeHandle","onNativeCallClosed","unsubFunc","on","getLogger","subscription","state","callingState$","subscribe","CallingState","LEFT","unsubscribe","
|
|
1
|
+
{"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_interopRequireWildcard","_reactNative","_RTCViewPipNative","_hooks","_shouldDisableIOSLocalVideoOnBackground","_useTrackDimensions","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","RTCViewPipIOS","exports","React","memo","props","includeLocalParticipantVideo","useCall","useParticipants","useCallStateHooks","_allParticipants","sortBy","speakerLayoutSortPreset","allParticipants","useDebouncedValue","dominantSpeaker","dominantSpeaker2","filter","participant","isLocalParticipant","participantInSpotlight","useEffect","shouldDisableIOSLocalVideoOnBackgroundRef","current","nativeRef","useRef","callClosedInvokedOnce","onCallClosed","node","findNodeHandle","onNativeCallClosed","unsubFunc","on","getLogger","subscription","state","callingState$","subscribe","CallingState","LEFT","unsubscribe","onDimensionsUpdated","useCallback","width","height","onNativeDimensionsUpdated","videoStream","screenShareStream","isScreenSharing","hasScreenShare","videoStreamToRender","streamURL","useMemo","undefined","toURL","createElement","Fragment","RTCViewPipNative","ref","DimensionsUpdatedRenderless","trackType","key","useTrackDimensions","displayName"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipIOS.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.RTCViewPipNative = void 0;
|
|
7
7
|
exports.onNativeCallClosed = onNativeCallClosed;
|
|
8
|
+
exports.onNativeDimensionsUpdated = onNativeDimensionsUpdated;
|
|
8
9
|
var _videoClient = require("@stream-io/video-client");
|
|
9
10
|
var _react = _interopRequireDefault(require("react"));
|
|
10
11
|
var _reactNative = require("react-native");
|
|
@@ -15,6 +16,13 @@ function onNativeCallClosed(reactTag) {
|
|
|
15
16
|
(0, _videoClient.getLogger)(['RTCViewPipNative'])('debug', 'onNativeCallClosed');
|
|
16
17
|
_reactNative.UIManager.dispatchViewManagerCommand(reactTag, _reactNative.UIManager.getViewManagerConfig(COMPONENT_NAME).Commands.onCallClosed, []);
|
|
17
18
|
}
|
|
19
|
+
function onNativeDimensionsUpdated(reactTag, width, height) {
|
|
20
|
+
(0, _videoClient.getLogger)(['RTCViewPipNative'])('debug', 'onNativeDimensionsUpdated', {
|
|
21
|
+
width,
|
|
22
|
+
height
|
|
23
|
+
});
|
|
24
|
+
_reactNative.UIManager.dispatchViewManagerCommand(reactTag, _reactNative.UIManager.getViewManagerConfig(COMPONENT_NAME).Commands.setPreferredContentSize, [width, height]);
|
|
25
|
+
}
|
|
18
26
|
|
|
19
27
|
/** Wrapper for the native view
|
|
20
28
|
* meant to stay private and not exposed */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_videoClient","require","_react","_interopRequireDefault","_reactNative","e","__esModule","default","COMPONENT_NAME","NativeComponent","requireNativeComponent","onNativeCallClosed","reactTag","getLogger","UIManager","dispatchViewManagerCommand","getViewManagerConfig","Commands","onCallClosed","RTCViewPipNative","exports","React","memo","forwardRef","props","ref","Platform","OS","createElement","style","StyleSheet","absoluteFill","pointerEvents","streamURL"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipNative.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_videoClient","require","_react","_interopRequireDefault","_reactNative","e","__esModule","default","COMPONENT_NAME","NativeComponent","requireNativeComponent","onNativeCallClosed","reactTag","getLogger","UIManager","dispatchViewManagerCommand","getViewManagerConfig","Commands","onCallClosed","onNativeDimensionsUpdated","width","height","setPreferredContentSize","RTCViewPipNative","exports","React","memo","forwardRef","props","ref","Platform","OS","createElement","style","StyleSheet","absoluteFill","pointerEvents","streamURL"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipNative.tsx"],"mappings":";;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AAMsB,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtB,MAAMG,cAAc,GAAG,YAAY;AAMnC,MAAMC,eAAqD,GACzD,IAAAC,mCAAsB,EAACF,cAAc,CAAC;AAEjC,SAASG,kBAAkBA,CAACC,QAAgB,EAAE;EACnD,IAAAC,sBAAS,EAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,oBAAoB,CAAC;EAC9DC,sBAAS,CAACC,0BAA0B,CAClCH,QAAQ,EACRE,sBAAS,CAACE,oBAAoB,CAACR,cAAc,CAAC,CAACS,QAAQ,CAACC,YAAY,EACpE,EACF,CAAC;AACH;AAEO,SAASC,yBAAyBA,CACvCP,QAAgB,EAChBQ,KAAa,EACbC,MAAc,EACd;EACA,IAAAR,sBAAS,EAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,2BAA2B,EAAE;IACpEO,KAAK;IACLC;EACF,CAAC,CAAC;EACFP,sBAAS,CAACC,0BAA0B,CAClCH,QAAQ,EACRE,sBAAS,CAACE,oBAAoB,CAACR,cAAc,CAAC,CAACS,QAAQ,CACpDK,uBAAuB,EAC1B,CAACF,KAAK,EAAEC,MAAM,CAChB,CAAC;AACH;;AAEA;AACA;AACO,MAAME,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,gBAAGE,cAAK,CAACC,IAAI,cACxCD,cAAK,CAACE,UAAU,CAKd,CAACC,KAAK,EAAEC,GAAG,KAAK;EAChB,IAAIC,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE,OAAO,IAAI;EAEtC,oBACE7B,MAAA,CAAAK,OAAA,CAAAyB,aAAA,CAACvB,eAAe;IACdwB,KAAK,EAAEC,uBAAU,CAACC,YAAa;IAC/BC,aAAa,EAAE;IACf;IAAA;IACAC,SAAS,EAAET,KAAK,CAACS;IACjB;IAAA;IACAR,GAAG,EAAEA;EAAI,CACV,CAAC;AAEN,CAAC,CACH,CAAC","ignoreList":[]}
|
|
@@ -33,21 +33,34 @@ function useTrackDimensions(participant, trackType) {
|
|
|
33
33
|
|
|
34
34
|
// Set up videoTrackDimensionChanged event listener for more direct dimension updates
|
|
35
35
|
(0, _react.useEffect)(() => {
|
|
36
|
-
if (!trackId || !
|
|
36
|
+
if (!trackId || !track) return;
|
|
37
37
|
const handleVideoTrackDimensionChanged = eventData => {
|
|
38
38
|
// Only handle events for this specific participant
|
|
39
39
|
if (eventData.trackId === trackId) {
|
|
40
40
|
setTrackDimensions(prev => {
|
|
41
|
-
if (prev.width
|
|
42
|
-
return
|
|
43
|
-
width: eventData.width,
|
|
44
|
-
height: eventData.height
|
|
45
|
-
};
|
|
41
|
+
if (prev.width === eventData.width && prev.height === eventData.height) {
|
|
42
|
+
return prev;
|
|
46
43
|
}
|
|
47
|
-
return
|
|
44
|
+
return {
|
|
45
|
+
width: eventData.width,
|
|
46
|
+
height: eventData.height
|
|
47
|
+
};
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
|
+
const {
|
|
52
|
+
width,
|
|
53
|
+
height
|
|
54
|
+
} = track.getSettings();
|
|
55
|
+
setTrackDimensions(prev => {
|
|
56
|
+
if (prev.width === width && prev.height === height) {
|
|
57
|
+
return prev;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
width: width ?? 0,
|
|
61
|
+
height: height ?? 0
|
|
62
|
+
};
|
|
63
|
+
});
|
|
51
64
|
const subscription = webRTCEventEmitter.addListener('videoTrackDimensionChanged', handleVideoTrackDimensionChanged);
|
|
52
65
|
return () => {
|
|
53
66
|
subscription.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","webRTCEventEmitter","NativeEventEmitter","NativeModules","WebRTCModule","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","useState","settings","getSettings","width","height","useEffect","handleVideoTrackDimensionChanged","eventData","prev","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":";;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,MAAME,kBAAkB,GAAG,IAAIC,+BAAkB,CAACC,0BAAa,CAACC,YAAY,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAM;IAC3D,MAAMC,QAAQ,GAAGP,KAAK,EAAEQ,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACA,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACT,OAAO,IAAI,
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","webRTCEventEmitter","NativeEventEmitter","NativeModules","WebRTCModule","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","useState","settings","getSettings","width","height","useEffect","handleVideoTrackDimensionChanged","eventData","prev","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":";;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,MAAME,kBAAkB,GAAG,IAAIC,+BAAkB,CAACC,0BAAa,CAACC,YAAY,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAM;IAC3D,MAAMC,QAAQ,GAAGP,KAAK,EAAEQ,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACA,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACT,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMY,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACX,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAES,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACL,KAAK,KAAKI,SAAS,CAACJ,KAAK,IAC9BK,IAAI,CAACJ,MAAM,KAAKG,SAAS,CAACH,MAAM,EAChC;YACA,OAAOI,IAAI;UACb;UACA,OAAO;YAAEL,KAAK,EAAEI,SAAS,CAACJ,KAAK;YAAEC,MAAM,EAAEG,SAAS,CAACH;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGV,KAAK,CAACQ,WAAW,CAAC,CAAC;IAC7CH,kBAAkB,CAAES,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACL,KAAK,KAAKA,KAAK,IAAIK,IAAI,CAACJ,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOI,IAAI;MACb;MACA,OAAO;QACLL,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMK,YAAY,GAAGzB,kBAAkB,CAAC0B,WAAW,CACjD,4BAA4B,EAC5BJ,gCACF,CAAC;IAED,OAAO,MAAM;MACXG,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACf,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
|
package/dist/commonjs/version.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { CallingState, getLogger, hasScreenShare, speakerLayoutSortPreset } from '@stream-io/video-client';
|
|
2
2
|
import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
3
|
-
import React, { useEffect, useMemo } from 'react';
|
|
3
|
+
import React, { useEffect, useMemo, useCallback } from 'react';
|
|
4
4
|
import { findNodeHandle } from 'react-native';
|
|
5
|
-
import { onNativeCallClosed, RTCViewPipNative } from './RTCViewPipNative';
|
|
5
|
+
import { onNativeCallClosed, onNativeDimensionsUpdated, RTCViewPipNative } from './RTCViewPipNative';
|
|
6
6
|
import { useDebouncedValue } from '../../../utils/hooks';
|
|
7
7
|
import { shouldDisableIOSLocalVideoOnBackgroundRef } from '../../../utils/internal/shouldDisableIOSLocalVideoOnBackground';
|
|
8
|
+
import { useTrackDimensions } from '../../../hooks/useTrackDimensions';
|
|
8
9
|
export const RTCViewPipIOS = /*#__PURE__*/React.memo(props => {
|
|
9
10
|
const {
|
|
10
11
|
includeLocalParticipantVideo
|
|
@@ -59,22 +60,48 @@ export const RTCViewPipIOS = /*#__PURE__*/React.memo(props => {
|
|
|
59
60
|
subscription?.unsubscribe();
|
|
60
61
|
};
|
|
61
62
|
}, [call]);
|
|
63
|
+
const onDimensionsUpdated = useCallback((width, height) => {
|
|
64
|
+
const node = findNodeHandle(nativeRef.current);
|
|
65
|
+
if (node !== null && width > 0 && height > 0) {
|
|
66
|
+
onNativeDimensionsUpdated(node, width, height);
|
|
67
|
+
}
|
|
68
|
+
}, []);
|
|
69
|
+
const {
|
|
70
|
+
videoStream,
|
|
71
|
+
screenShareStream
|
|
72
|
+
} = participantInSpotlight;
|
|
73
|
+
const isScreenSharing = hasScreenShare(participantInSpotlight);
|
|
74
|
+
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
62
75
|
const streamURL = useMemo(() => {
|
|
63
|
-
if (!
|
|
76
|
+
if (!videoStreamToRender) {
|
|
64
77
|
return undefined;
|
|
65
78
|
}
|
|
66
|
-
const {
|
|
67
|
-
videoStream,
|
|
68
|
-
screenShareStream
|
|
69
|
-
} = participantInSpotlight;
|
|
70
|
-
const isScreenSharing = hasScreenShare(participantInSpotlight);
|
|
71
|
-
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
72
79
|
return videoStreamToRender?.toURL();
|
|
73
|
-
}, [
|
|
74
|
-
return /*#__PURE__*/React.createElement(RTCViewPipNative, {
|
|
80
|
+
}, [videoStreamToRender]);
|
|
81
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(RTCViewPipNative, {
|
|
75
82
|
streamURL: streamURL,
|
|
76
83
|
ref: nativeRef
|
|
77
|
-
})
|
|
84
|
+
}), /*#__PURE__*/React.createElement(DimensionsUpdatedRenderless, {
|
|
85
|
+
participant: participantInSpotlight,
|
|
86
|
+
trackType: isScreenSharing ? 'screenShareTrack' : 'videoTrack',
|
|
87
|
+
onDimensionsUpdated: onDimensionsUpdated,
|
|
88
|
+
key: streamURL
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
const DimensionsUpdatedRenderless = /*#__PURE__*/React.memo(({
|
|
92
|
+
participant,
|
|
93
|
+
trackType,
|
|
94
|
+
onDimensionsUpdated
|
|
95
|
+
}) => {
|
|
96
|
+
const {
|
|
97
|
+
width,
|
|
98
|
+
height
|
|
99
|
+
} = useTrackDimensions(participant, trackType);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
onDimensionsUpdated(width, height);
|
|
102
|
+
}, [width, height, onDimensionsUpdated]);
|
|
103
|
+
return null;
|
|
78
104
|
});
|
|
105
|
+
DimensionsUpdatedRenderless.displayName = 'DimensionsUpdatedRenderless';
|
|
79
106
|
RTCViewPipIOS.displayName = 'RTCViewPipIOS';
|
|
80
107
|
//# sourceMappingURL=RTCViewPipIOS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CallingState","getLogger","hasScreenShare","speakerLayoutSortPreset","useCall","useCallStateHooks","React","useEffect","useMemo","findNodeHandle","onNativeCallClosed","RTCViewPipNative","useDebouncedValue","shouldDisableIOSLocalVideoOnBackgroundRef","RTCViewPipIOS","memo","props","includeLocalParticipantVideo","call","useParticipants","_allParticipants","sortBy","allParticipants","dominantSpeaker","dominantSpeaker2","filter","participant","isLocalParticipant","participantInSpotlight","current","nativeRef","useRef","callClosedInvokedOnce","onCallClosed","node","unsubFunc","on","subscription","state","callingState$","subscribe","LEFT","unsubscribe","
|
|
1
|
+
{"version":3,"names":["CallingState","getLogger","hasScreenShare","speakerLayoutSortPreset","useCall","useCallStateHooks","React","useEffect","useMemo","useCallback","findNodeHandle","onNativeCallClosed","onNativeDimensionsUpdated","RTCViewPipNative","useDebouncedValue","shouldDisableIOSLocalVideoOnBackgroundRef","useTrackDimensions","RTCViewPipIOS","memo","props","includeLocalParticipantVideo","call","useParticipants","_allParticipants","sortBy","allParticipants","dominantSpeaker","dominantSpeaker2","filter","participant","isLocalParticipant","participantInSpotlight","current","nativeRef","useRef","callClosedInvokedOnce","onCallClosed","node","unsubFunc","on","subscription","state","callingState$","subscribe","LEFT","unsubscribe","onDimensionsUpdated","width","height","videoStream","screenShareStream","isScreenSharing","videoStreamToRender","streamURL","undefined","toURL","createElement","Fragment","ref","DimensionsUpdatedRenderless","trackType","key","displayName"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipIOS.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,13 @@ export function onNativeCallClosed(reactTag) {
|
|
|
7
7
|
getLogger(['RTCViewPipNative'])('debug', 'onNativeCallClosed');
|
|
8
8
|
UIManager.dispatchViewManagerCommand(reactTag, UIManager.getViewManagerConfig(COMPONENT_NAME).Commands.onCallClosed, []);
|
|
9
9
|
}
|
|
10
|
+
export function onNativeDimensionsUpdated(reactTag, width, height) {
|
|
11
|
+
getLogger(['RTCViewPipNative'])('debug', 'onNativeDimensionsUpdated', {
|
|
12
|
+
width,
|
|
13
|
+
height
|
|
14
|
+
});
|
|
15
|
+
UIManager.dispatchViewManagerCommand(reactTag, UIManager.getViewManagerConfig(COMPONENT_NAME).Commands.setPreferredContentSize, [width, height]);
|
|
16
|
+
}
|
|
10
17
|
|
|
11
18
|
/** Wrapper for the native view
|
|
12
19
|
* meant to stay private and not exposed */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getLogger","React","Platform","requireNativeComponent","StyleSheet","UIManager","COMPONENT_NAME","NativeComponent","onNativeCallClosed","reactTag","dispatchViewManagerCommand","getViewManagerConfig","Commands","onCallClosed","RTCViewPipNative","memo","forwardRef","props","ref","OS","createElement","style","absoluteFill","pointerEvents","streamURL"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipNative.tsx"],"mappings":"AAAA,SAASA,SAAS,QAAQ,yBAAyB;AACnD,OAAOC,KAAK,MAAM,OAAO;AACzB,SAEEC,QAAQ,EACRC,sBAAsB,EACtBC,UAAU,EACVC,SAAS,QACJ,cAAc;AAErB,MAAMC,cAAc,GAAG,YAAY;AAMnC,MAAMC,eAAqD,GACzDJ,sBAAsB,CAACG,cAAc,CAAC;AAExC,OAAO,SAASE,kBAAkBA,CAACC,QAAgB,EAAE;EACnDT,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,oBAAoB,CAAC;EAC9DK,SAAS,CAACK,0BAA0B,CAClCD,QAAQ,EACRJ,SAAS,CAACM,oBAAoB,CAACL,cAAc,CAAC,CAACM,QAAQ,CAACC,YAAY,EACpE,EACF,CAAC;AACH;;AAEA;AACA;AACA,OAAO,
|
|
1
|
+
{"version":3,"names":["getLogger","React","Platform","requireNativeComponent","StyleSheet","UIManager","COMPONENT_NAME","NativeComponent","onNativeCallClosed","reactTag","dispatchViewManagerCommand","getViewManagerConfig","Commands","onCallClosed","onNativeDimensionsUpdated","width","height","setPreferredContentSize","RTCViewPipNative","memo","forwardRef","props","ref","OS","createElement","style","absoluteFill","pointerEvents","streamURL"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipNative.tsx"],"mappings":"AAAA,SAASA,SAAS,QAAQ,yBAAyB;AACnD,OAAOC,KAAK,MAAM,OAAO;AACzB,SAEEC,QAAQ,EACRC,sBAAsB,EACtBC,UAAU,EACVC,SAAS,QACJ,cAAc;AAErB,MAAMC,cAAc,GAAG,YAAY;AAMnC,MAAMC,eAAqD,GACzDJ,sBAAsB,CAACG,cAAc,CAAC;AAExC,OAAO,SAASE,kBAAkBA,CAACC,QAAgB,EAAE;EACnDT,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,oBAAoB,CAAC;EAC9DK,SAAS,CAACK,0BAA0B,CAClCD,QAAQ,EACRJ,SAAS,CAACM,oBAAoB,CAACL,cAAc,CAAC,CAACM,QAAQ,CAACC,YAAY,EACpE,EACF,CAAC;AACH;AAEA,OAAO,SAASC,yBAAyBA,CACvCL,QAAgB,EAChBM,KAAa,EACbC,MAAc,EACd;EACAhB,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,2BAA2B,EAAE;IACpEe,KAAK;IACLC;EACF,CAAC,CAAC;EACFX,SAAS,CAACK,0BAA0B,CAClCD,QAAQ,EACRJ,SAAS,CAACM,oBAAoB,CAACL,cAAc,CAAC,CAACM,QAAQ,CACpDK,uBAAuB,EAC1B,CAACF,KAAK,EAAEC,MAAM,CAChB,CAAC;AACH;;AAEA;AACA;AACA,OAAO,MAAME,gBAAgB,gBAAGjB,KAAK,CAACkB,IAAI,cACxClB,KAAK,CAACmB,UAAU,CAKd,CAACC,KAAK,EAAEC,GAAG,KAAK;EAChB,IAAIpB,QAAQ,CAACqB,EAAE,KAAK,KAAK,EAAE,OAAO,IAAI;EAEtC,oBACEtB,KAAA,CAAAuB,aAAA,CAACjB,eAAe;IACdkB,KAAK,EAAErB,UAAU,CAACsB,YAAa;IAC/BC,aAAa,EAAE;IACf;IAAA;IACAC,SAAS,EAAEP,KAAK,CAACO;IACjB;IAAA;IACAN,GAAG,EAAEA;EAAI,CACV,CAAC;AAEN,CAAC,CACH,CAAC","ignoreList":[]}
|
|
@@ -27,21 +27,34 @@ export function useTrackDimensions(participant, trackType) {
|
|
|
27
27
|
|
|
28
28
|
// Set up videoTrackDimensionChanged event listener for more direct dimension updates
|
|
29
29
|
useEffect(() => {
|
|
30
|
-
if (!trackId || !
|
|
30
|
+
if (!trackId || !track) return;
|
|
31
31
|
const handleVideoTrackDimensionChanged = eventData => {
|
|
32
32
|
// Only handle events for this specific participant
|
|
33
33
|
if (eventData.trackId === trackId) {
|
|
34
34
|
setTrackDimensions(prev => {
|
|
35
|
-
if (prev.width
|
|
36
|
-
return
|
|
37
|
-
width: eventData.width,
|
|
38
|
-
height: eventData.height
|
|
39
|
-
};
|
|
35
|
+
if (prev.width === eventData.width && prev.height === eventData.height) {
|
|
36
|
+
return prev;
|
|
40
37
|
}
|
|
41
|
-
return
|
|
38
|
+
return {
|
|
39
|
+
width: eventData.width,
|
|
40
|
+
height: eventData.height
|
|
41
|
+
};
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
|
+
const {
|
|
46
|
+
width,
|
|
47
|
+
height
|
|
48
|
+
} = track.getSettings();
|
|
49
|
+
setTrackDimensions(prev => {
|
|
50
|
+
if (prev.width === width && prev.height === height) {
|
|
51
|
+
return prev;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
width: width ?? 0,
|
|
55
|
+
height: height ?? 0
|
|
56
|
+
};
|
|
57
|
+
});
|
|
45
58
|
const subscription = webRTCEventEmitter.addListener('videoTrackDimensionChanged', handleVideoTrackDimensionChanged);
|
|
46
59
|
return () => {
|
|
47
60
|
subscription.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useState","NativeEventEmitter","NativeModules","webRTCEventEmitter","WebRTCModule","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","settings","getSettings","width","height","handleVideoTrackDimensionChanged","eventData","prev","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":"AAIA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAEhE,MAAMC,kBAAkB,GAAG,IAAIF,kBAAkB,CAACC,aAAa,CAACE,YAAY,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGhB,QAAQ,CAAC,MAAM;IAC3D,MAAMiB,QAAQ,GAAGN,KAAK,EAAEO,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACArB,SAAS,CAAC,MAAM;IACd,IAAI,CAACc,OAAO,IAAI,
|
|
1
|
+
{"version":3,"names":["useEffect","useState","NativeEventEmitter","NativeModules","webRTCEventEmitter","WebRTCModule","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","settings","getSettings","width","height","handleVideoTrackDimensionChanged","eventData","prev","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":"AAIA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAEhE,MAAMC,kBAAkB,GAAG,IAAIF,kBAAkB,CAACC,aAAa,CAACE,YAAY,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGhB,QAAQ,CAAC,MAAM;IAC3D,MAAMiB,QAAQ,GAAGN,KAAK,EAAEO,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACArB,SAAS,CAAC,MAAM;IACd,IAAI,CAACc,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMU,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACT,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAEO,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACJ,KAAK,KAAKG,SAAS,CAACH,KAAK,IAC9BI,IAAI,CAACH,MAAM,KAAKE,SAAS,CAACF,MAAM,EAChC;YACA,OAAOG,IAAI;UACb;UACA,OAAO;YAAEJ,KAAK,EAAEG,SAAS,CAACH,KAAK;YAAEC,MAAM,EAAEE,SAAS,CAACF;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGT,KAAK,CAACO,WAAW,CAAC,CAAC;IAC7CF,kBAAkB,CAAEO,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACJ,KAAK,KAAKA,KAAK,IAAII,IAAI,CAACH,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOG,IAAI;MACb;MACA,OAAO;QACLJ,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMI,YAAY,GAAGrB,kBAAkB,CAACsB,WAAW,CACjD,4BAA4B,EAC5BJ,gCACF,CAAC;IAED,OAAO,MAAM;MACXG,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACb,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
|
package/dist/module/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '1.20.
|
|
1
|
+
export const version = '1.20.2';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RTCViewPipIOS.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallContent/RTCViewPipIOS.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RTCViewPipIOS.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallContent/RTCViewPipIOS.tsx"],"names":[],"mappings":"AAUA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAW/D,KAAK,KAAK,GAAG;IACX,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,aAAa,oCAAsB,KAAK,uBAiGnD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export declare function onNativeCallClosed(reactTag: number): void;
|
|
3
|
+
export declare function onNativeDimensionsUpdated(reactTag: number, width: number, height: number): void;
|
|
3
4
|
/** Wrapper for the native view
|
|
4
5
|
* meant to stay private and not exposed */
|
|
5
6
|
export declare const RTCViewPipNative: React.NamedExoticComponent<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RTCViewPipNative.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallContent/RTCViewPipNative.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAOlD;AAED;2CAC2C;AAC3C,eAAO,MAAM,gBAAgB;gBAIX,MAAM;wCAgBvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"RTCViewPipNative.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallContent/RTCViewPipNative.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAOlD;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,QAYf;AAED;2CAC2C;AAC3C,eAAO,MAAM,gBAAgB;gBAIX,MAAM;wCAgBvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTrackDimensions.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTrackDimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAMjC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,cAAc;;;
|
|
1
|
+
{"version":3,"file":"useTrackDimensions.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTrackDimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAMjC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,cAAc;;;EAgE1B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "1.20.
|
|
1
|
+
export declare const version = "1.20.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/ios/RTCViewPip.swift
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
|
+
import React
|
|
9
10
|
|
|
10
11
|
@objc(RTCViewPip)
|
|
11
12
|
class RTCViewPip: UIView {
|
|
@@ -13,17 +14,6 @@ class RTCViewPip: UIView {
|
|
|
13
14
|
private var pictureInPictureController = StreamPictureInPictureController()
|
|
14
15
|
private var webRtcModule: WebRTCModule?
|
|
15
16
|
|
|
16
|
-
override init(frame: CGRect) {
|
|
17
|
-
super.init(frame: frame)
|
|
18
|
-
setupNotificationObserver()
|
|
19
|
-
self.pictureInPictureController?.sourceView = self
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
required init?(coder aDecoder: NSCoder) {
|
|
23
|
-
super.init(coder: aDecoder)
|
|
24
|
-
setupNotificationObserver()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
17
|
private func setupNotificationObserver() {
|
|
28
18
|
NotificationCenter.default.addObserver(
|
|
29
19
|
self,
|
|
@@ -33,10 +23,6 @@ class RTCViewPip: UIView {
|
|
|
33
23
|
)
|
|
34
24
|
}
|
|
35
25
|
|
|
36
|
-
deinit {
|
|
37
|
-
NotificationCenter.default.removeObserver(self)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
26
|
func setWebRtcModule(_ module: WebRTCModule) {
|
|
41
27
|
webRtcModule = module
|
|
42
28
|
}
|
|
@@ -64,7 +50,7 @@ class RTCViewPip: UIView {
|
|
|
64
50
|
}
|
|
65
51
|
|
|
66
52
|
DispatchQueue.main.async {
|
|
67
|
-
NSLog("PiP - Setting video track for streamURL: -\(streamURLString)")
|
|
53
|
+
NSLog("PiP - Setting video track for streamURL: -\(streamURLString) trackId: \(videoTrack.trackId)")
|
|
68
54
|
self.pictureInPictureController?.track = videoTrack
|
|
69
55
|
}
|
|
70
56
|
}
|
|
@@ -82,16 +68,34 @@ class RTCViewPip: UIView {
|
|
|
82
68
|
self.pictureInPictureController = nil
|
|
83
69
|
}
|
|
84
70
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
71
|
+
@objc
|
|
72
|
+
func setPreferredContentSize(_ size: CGSize) {
|
|
73
|
+
NSLog("PiP - RTCViewPip setPreferredContentSize \(size)")
|
|
74
|
+
self.pictureInPictureController?.setPreferredContentSize(size)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override func didMoveToSuperview() {
|
|
78
|
+
super.didMoveToSuperview()
|
|
79
|
+
if self.superview == nil {
|
|
80
|
+
NSLog("PiP - RTCViewPip has been removed from its superview.")
|
|
81
|
+
NotificationCenter.default.removeObserver(self)
|
|
91
82
|
DispatchQueue.main.async {
|
|
92
83
|
NSLog("PiP - onCallClosed called due to view detaching")
|
|
93
84
|
self.onCallClosed()
|
|
94
85
|
}
|
|
86
|
+
} else {
|
|
87
|
+
NSLog("PiP - RTCViewPip has been added to a superview.")
|
|
88
|
+
setupNotificationObserver()
|
|
89
|
+
DispatchQueue.main.async {
|
|
90
|
+
self.pictureInPictureController?.sourceView = self
|
|
91
|
+
if let reactTag = self.reactTag, let bridge = self.webRtcModule?.bridge {
|
|
92
|
+
if let manager = bridge.module(for: RTCViewPipManager.self) as? RTCViewPipManager,
|
|
93
|
+
let size = manager.getCachedSize(for: reactTag) {
|
|
94
|
+
NSLog("PiP - Applying cached size \(size) for reactTag \(reactTag)")
|
|
95
|
+
self.setPreferredContentSize(size)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
}
|
package/ios/RTCViewPipManager.mm
CHANGED
|
@@ -9,39 +9,59 @@ import Foundation
|
|
|
9
9
|
|
|
10
10
|
@objc(RTCViewPipManager)
|
|
11
11
|
class RTCViewPipManager: RCTViewManager {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// Often, the view unmounts before the `onCallClosed` command arrives and as a consequence
|
|
16
|
-
// pipView.onCallClosed() method wasn't called, as the view can't be found in the ViewRegistry
|
|
17
|
-
// causing dangling PiP window with the last video frame frozen.
|
|
18
|
-
// Now, once this happens, instead forwarding the command to the view returned by the registry,
|
|
19
|
-
// we manually apply it to the cached view. The current setup allows only one PipView, so we
|
|
20
|
-
// don't have to introduce more complex view tracking mechanism.
|
|
21
|
-
private var _view: RTCViewPip? = nil
|
|
22
|
-
|
|
12
|
+
|
|
13
|
+
private var cachedSizes: [NSNumber: CGSize] = [:]
|
|
14
|
+
|
|
23
15
|
override func view() -> UIView! {
|
|
24
16
|
let view = RTCViewPip()
|
|
25
17
|
view.setWebRtcModule(self.bridge.module(forName: "WebRTCModule") as! WebRTCModule)
|
|
26
|
-
self._view = view
|
|
27
18
|
return view
|
|
28
19
|
}
|
|
29
|
-
|
|
20
|
+
|
|
30
21
|
override static func requiresMainQueueSetup() -> Bool {
|
|
31
22
|
return true
|
|
32
23
|
}
|
|
33
|
-
|
|
34
|
-
@objc
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
|
|
25
|
+
@objc(onCallClosed:)
|
|
26
|
+
func onCallClosed(_ reactTag: NSNumber) {
|
|
27
|
+
|
|
28
|
+
bridge.uiManager.addUIBlock({ (uiManager, viewRegistry) in
|
|
29
|
+
let view = uiManager?.view(forReactTag: reactTag)
|
|
30
|
+
if let pipView = view as? RTCViewPip {
|
|
31
|
+
DispatchQueue.main.async {
|
|
32
|
+
pipView.onCallClosed()
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
NSLog("PiP - onCallClosed cant be called, Invalid view returned from registry, expecting RTCViewPip")
|
|
41
36
|
}
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@objc(setPreferredContentSize:width:height:)
|
|
42
|
+
func setPreferredContentSize(_ reactTag: NSNumber, width: CGFloat, height: CGFloat) {
|
|
43
|
+
let size = CGSize(width: width, height: height)
|
|
44
|
+
|
|
45
|
+
bridge.uiManager.addUIBlock({ (uiManager, viewRegistry) in
|
|
46
|
+
let view = uiManager?.view(forReactTag: reactTag)
|
|
47
|
+
if let pipView = view as? RTCViewPip {
|
|
48
|
+
DispatchQueue.main.async {
|
|
49
|
+
pipView.setPreferredContentSize(size)
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
// If the view is not found, cache the size.
|
|
53
|
+
// this happens when this method is called before the view can attach react super view
|
|
54
|
+
NSLog("PiP - View not found for reactTag \(reactTag), caching size.")
|
|
55
|
+
self.cachedSizes[reactTag] = size
|
|
44
56
|
}
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func getCachedSize(for reactTag: NSNumber) -> CGSize? {
|
|
61
|
+
let size = self.cachedSizes.removeValue(forKey: reactTag)
|
|
62
|
+
if size != nil {
|
|
63
|
+
NSLog("PiP - Found and removed cached size for reactTag \(reactTag).")
|
|
45
64
|
}
|
|
65
|
+
return size
|
|
46
66
|
}
|
|
47
67
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stream-io/video-react-native-sdk",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.2",
|
|
4
4
|
"description": "Stream Video SDK for React Native",
|
|
5
5
|
"author": "https://getstream.io",
|
|
6
6
|
"homepage": "https://getstream.io/video/docs/react-native/",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"!**/.*"
|
|
46
46
|
],
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@stream-io/video-client": "1.27.
|
|
49
|
-
"@stream-io/video-react-bindings": "1.7.
|
|
48
|
+
"@stream-io/video-client": "1.27.2",
|
|
49
|
+
"@stream-io/video-react-bindings": "1.7.11",
|
|
50
50
|
"intl-pluralrules": "2.0.1",
|
|
51
51
|
"lodash.merge": "^4.6.2",
|
|
52
52
|
"react-native-url-polyfill": "1.3.0",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@react-native-firebase/app": ">=17.5.0",
|
|
61
61
|
"@react-native-firebase/messaging": ">=17.5.0",
|
|
62
62
|
"@stream-io/noise-cancellation-react-native": ">=0.1.0",
|
|
63
|
-
"@stream-io/react-native-webrtc": ">=125.4.
|
|
63
|
+
"@stream-io/react-native-webrtc": ">=125.4.1",
|
|
64
64
|
"@stream-io/video-filters-react-native": ">=0.1.0",
|
|
65
65
|
"expo": ">=47.0.0",
|
|
66
66
|
"expo-build-properties": "*",
|
|
@@ -125,9 +125,9 @@
|
|
|
125
125
|
"@react-native-firebase/app": "^22.1.0",
|
|
126
126
|
"@react-native-firebase/messaging": "^22.1.0",
|
|
127
127
|
"@react-native/babel-preset": "^0.79.2",
|
|
128
|
-
"@stream-io/noise-cancellation-react-native": "^0.2.
|
|
129
|
-
"@stream-io/react-native-webrtc": "
|
|
130
|
-
"@stream-io/video-filters-react-native": "^0.6.
|
|
128
|
+
"@stream-io/noise-cancellation-react-native": "^0.2.1",
|
|
129
|
+
"@stream-io/react-native-webrtc": "125.4.1",
|
|
130
|
+
"@stream-io/video-filters-react-native": "^0.6.1",
|
|
131
131
|
"@testing-library/jest-native": "^5.4.3",
|
|
132
132
|
"@testing-library/react-native": "13.2.0",
|
|
133
133
|
"@tsconfig/node14": "14.1.3",
|
|
@@ -3,14 +3,21 @@ import {
|
|
|
3
3
|
getLogger,
|
|
4
4
|
hasScreenShare,
|
|
5
5
|
speakerLayoutSortPreset,
|
|
6
|
+
type StreamVideoParticipant,
|
|
7
|
+
type VideoTrackType,
|
|
6
8
|
} from '@stream-io/video-client';
|
|
7
9
|
import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
8
10
|
import type { MediaStream } from '@stream-io/react-native-webrtc';
|
|
9
|
-
import React, { useEffect, useMemo } from 'react';
|
|
11
|
+
import React, { useEffect, useMemo, useCallback } from 'react';
|
|
10
12
|
import { findNodeHandle } from 'react-native';
|
|
11
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
onNativeCallClosed,
|
|
15
|
+
onNativeDimensionsUpdated,
|
|
16
|
+
RTCViewPipNative,
|
|
17
|
+
} from './RTCViewPipNative';
|
|
12
18
|
import { useDebouncedValue } from '../../../utils/hooks';
|
|
13
19
|
import { shouldDisableIOSLocalVideoOnBackgroundRef } from '../../../utils/internal/shouldDisableIOSLocalVideoOnBackground';
|
|
20
|
+
import { useTrackDimensions } from '../../../hooks/useTrackDimensions';
|
|
14
21
|
|
|
15
22
|
type Props = {
|
|
16
23
|
includeLocalParticipantVideo?: boolean;
|
|
@@ -80,23 +87,60 @@ export const RTCViewPipIOS = React.memo((props: Props) => {
|
|
|
80
87
|
};
|
|
81
88
|
}, [call]);
|
|
82
89
|
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
const onDimensionsUpdated = useCallback((width: number, height: number) => {
|
|
91
|
+
const node = findNodeHandle(nativeRef.current);
|
|
92
|
+
if (node !== null && width > 0 && height > 0) {
|
|
93
|
+
onNativeDimensionsUpdated(node, width, height);
|
|
86
94
|
}
|
|
95
|
+
}, []);
|
|
87
96
|
|
|
88
|
-
|
|
97
|
+
const { videoStream, screenShareStream } = participantInSpotlight;
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
const isScreenSharing = hasScreenShare(participantInSpotlight);
|
|
91
100
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
101
|
+
const videoStreamToRender = (isScreenSharing
|
|
102
|
+
? screenShareStream
|
|
103
|
+
: videoStream) as unknown as MediaStream | undefined;
|
|
95
104
|
|
|
105
|
+
const streamURL = useMemo(() => {
|
|
106
|
+
if (!videoStreamToRender) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
96
109
|
return videoStreamToRender?.toURL();
|
|
97
|
-
}, [
|
|
110
|
+
}, [videoStreamToRender]);
|
|
98
111
|
|
|
99
|
-
return
|
|
112
|
+
return (
|
|
113
|
+
<>
|
|
114
|
+
<RTCViewPipNative streamURL={streamURL} ref={nativeRef} />
|
|
115
|
+
<DimensionsUpdatedRenderless
|
|
116
|
+
participant={participantInSpotlight}
|
|
117
|
+
trackType={isScreenSharing ? 'screenShareTrack' : 'videoTrack'}
|
|
118
|
+
onDimensionsUpdated={onDimensionsUpdated}
|
|
119
|
+
key={streamURL}
|
|
120
|
+
/>
|
|
121
|
+
</>
|
|
122
|
+
);
|
|
100
123
|
});
|
|
101
124
|
|
|
125
|
+
const DimensionsUpdatedRenderless = React.memo(
|
|
126
|
+
({
|
|
127
|
+
participant,
|
|
128
|
+
trackType,
|
|
129
|
+
onDimensionsUpdated,
|
|
130
|
+
}: {
|
|
131
|
+
participant: StreamVideoParticipant;
|
|
132
|
+
trackType: VideoTrackType;
|
|
133
|
+
onDimensionsUpdated: (width: number, height: number) => void;
|
|
134
|
+
}) => {
|
|
135
|
+
const { width, height } = useTrackDimensions(participant, trackType);
|
|
136
|
+
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
onDimensionsUpdated(width, height);
|
|
139
|
+
}, [width, height, onDimensionsUpdated]);
|
|
140
|
+
|
|
141
|
+
return null;
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
DimensionsUpdatedRenderless.displayName = 'DimensionsUpdatedRenderless';
|
|
102
146
|
RTCViewPipIOS.displayName = 'RTCViewPipIOS';
|
|
@@ -26,6 +26,23 @@ export function onNativeCallClosed(reactTag: number) {
|
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
export function onNativeDimensionsUpdated(
|
|
30
|
+
reactTag: number,
|
|
31
|
+
width: number,
|
|
32
|
+
height: number,
|
|
33
|
+
) {
|
|
34
|
+
getLogger(['RTCViewPipNative'])('debug', 'onNativeDimensionsUpdated', {
|
|
35
|
+
width,
|
|
36
|
+
height,
|
|
37
|
+
});
|
|
38
|
+
UIManager.dispatchViewManagerCommand(
|
|
39
|
+
reactTag,
|
|
40
|
+
UIManager.getViewManagerConfig(COMPONENT_NAME).Commands
|
|
41
|
+
.setPreferredContentSize,
|
|
42
|
+
[width, height],
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
29
46
|
/** Wrapper for the native view
|
|
30
47
|
* meant to stay private and not exposed */
|
|
31
48
|
export const RTCViewPipNative = React.memo(
|
|
@@ -34,7 +34,7 @@ export function useTrackDimensions(
|
|
|
34
34
|
|
|
35
35
|
// Set up videoTrackDimensionChanged event listener for more direct dimension updates
|
|
36
36
|
useEffect(() => {
|
|
37
|
-
if (!trackId || !
|
|
37
|
+
if (!trackId || !track) return;
|
|
38
38
|
|
|
39
39
|
const handleVideoTrackDimensionChanged = (eventData: {
|
|
40
40
|
pcId: string;
|
|
@@ -46,16 +46,27 @@ export function useTrackDimensions(
|
|
|
46
46
|
if (eventData.trackId === trackId) {
|
|
47
47
|
setTrackDimensions((prev) => {
|
|
48
48
|
if (
|
|
49
|
-
prev.width
|
|
50
|
-
prev.height
|
|
49
|
+
prev.width === eventData.width &&
|
|
50
|
+
prev.height === eventData.height
|
|
51
51
|
) {
|
|
52
|
-
return
|
|
52
|
+
return prev;
|
|
53
53
|
}
|
|
54
|
-
return
|
|
54
|
+
return { width: eventData.width, height: eventData.height };
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
+
const { width, height } = track.getSettings();
|
|
60
|
+
setTrackDimensions((prev) => {
|
|
61
|
+
if (prev.width === width && prev.height === height) {
|
|
62
|
+
return prev;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
width: width ?? 0,
|
|
66
|
+
height: height ?? 0,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
|
|
59
70
|
const subscription = webRTCEventEmitter.addListener(
|
|
60
71
|
'videoTrackDimensionChanged',
|
|
61
72
|
handleVideoTrackDimensionChanged,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '1.20.
|
|
1
|
+
export const version = '1.20.2';
|