@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.
Files changed (30) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/commonjs/components/Call/CallContent/RTCViewPipIOS.js +37 -10
  3. package/dist/commonjs/components/Call/CallContent/RTCViewPipIOS.js.map +1 -1
  4. package/dist/commonjs/components/Call/CallContent/RTCViewPipNative.js +8 -0
  5. package/dist/commonjs/components/Call/CallContent/RTCViewPipNative.js.map +1 -1
  6. package/dist/commonjs/hooks/useTrackDimensions.js +20 -7
  7. package/dist/commonjs/hooks/useTrackDimensions.js.map +1 -1
  8. package/dist/commonjs/version.js +1 -1
  9. package/dist/module/components/Call/CallContent/RTCViewPipIOS.js +39 -12
  10. package/dist/module/components/Call/CallContent/RTCViewPipIOS.js.map +1 -1
  11. package/dist/module/components/Call/CallContent/RTCViewPipNative.js +7 -0
  12. package/dist/module/components/Call/CallContent/RTCViewPipNative.js.map +1 -1
  13. package/dist/module/hooks/useTrackDimensions.js +20 -7
  14. package/dist/module/hooks/useTrackDimensions.js.map +1 -1
  15. package/dist/module/version.js +1 -1
  16. package/dist/typescript/components/Call/CallContent/RTCViewPipIOS.d.ts.map +1 -1
  17. package/dist/typescript/components/Call/CallContent/RTCViewPipNative.d.ts +1 -0
  18. package/dist/typescript/components/Call/CallContent/RTCViewPipNative.d.ts.map +1 -1
  19. package/dist/typescript/hooks/useTrackDimensions.d.ts.map +1 -1
  20. package/dist/typescript/version.d.ts +1 -1
  21. package/ios/PictureInPicture/StreamPictureInPictureController.swift +4 -0
  22. package/ios/RTCViewPip.swift +26 -22
  23. package/ios/RTCViewPipManager.mm +1 -0
  24. package/ios/RTCViewPipManager.swift +43 -23
  25. package/ios/StreamVideoReactNative-Bridging-Header.h +1 -0
  26. package/package.json +7 -7
  27. package/src/components/Call/CallContent/RTCViewPipIOS.tsx +56 -12
  28. package/src/components/Call/CallContent/RTCViewPipNative.tsx +17 -0
  29. package/src/hooks/useTrackDimensions.ts +16 -5
  30. 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 (!participantInSpotlight) {
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
- }, [participantInSpotlight]);
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","streamURL","useMemo","undefined","videoStream","screenShareStream","isScreenSharing","hasScreenShare","videoStreamToRender","toURL","createElement","RTCViewPipNative","ref","displayName"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipIOS.tsx"],"mappings":"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","ignoreList":[]}
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":";;;;;;;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;;AAEA;AACA;AACO,MAAMC,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,oBACEzB,MAAA,CAAAK,OAAA,CAAAqB,aAAA,CAACnB,eAAe;IACdoB,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":[]}
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 || !_reactNative.NativeModules.WebRTCModule) return;
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 !== eventData.width || prev.height !== eventData.height) {
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 prev;
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,CAACV,0BAAa,CAACC,YAAY,EAAE;IAE7C,MAAMmB,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,OAAO;cAAED,KAAK,EAAEI,SAAS,CAACJ,KAAK;cAAEC,MAAM,EAAEG,SAAS,CAACH;YAAO,CAAC;UAC7D;UACA,OAAOI,IAAI;QACb,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAMC,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":[]}
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":[]}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '1.20.1';
7
+ const version = exports.version = '1.20.2';
8
8
  //# sourceMappingURL=version.js.map
@@ -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 (!participantInSpotlight) {
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
- }, [participantInSpotlight]);
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","streamURL","undefined","videoStream","screenShareStream","isScreenSharing","videoStreamToRender","toURL","createElement","ref","displayName"],"sourceRoot":"../../../../../src","sources":["components/Call/CallContent/RTCViewPipIOS.tsx"],"mappings":"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","ignoreList":[]}
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,MAAMC,gBAAgB,gBAAGb,KAAK,CAACc,IAAI,cACxCd,KAAK,CAACe,UAAU,CAKd,CAACC,KAAK,EAAEC,GAAG,KAAK;EAChB,IAAIhB,QAAQ,CAACiB,EAAE,KAAK,KAAK,EAAE,OAAO,IAAI;EAEtC,oBACElB,KAAA,CAAAmB,aAAA,CAACb,eAAe;IACdc,KAAK,EAAEjB,UAAU,CAACkB,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":[]}
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 || !NativeModules.WebRTCModule) return;
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 !== eventData.width || prev.height !== eventData.height) {
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 prev;
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,CAACX,aAAa,CAACE,YAAY,EAAE;IAE7C,MAAMiB,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,OAAO;cAAED,KAAK,EAAEG,SAAS,CAACH,KAAK;cAAEC,MAAM,EAAEE,SAAS,CAACF;YAAO,CAAC;UAC7D;UACA,OAAOG,IAAI;QACb,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAMC,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":[]}
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":[]}
@@ -1,2 +1,2 @@
1
- export const version = '1.20.1';
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":"AAQA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAMlD,KAAK,KAAK,GAAG;IACX,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,aAAa,oCAAsB,KAAK,uBAiFnD,CAAC"}
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;;;EAqD1B"}
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";
1
+ export declare const version = "1.20.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -81,6 +81,10 @@ import Foundation
81
81
  super.init()
82
82
  }
83
83
 
84
+ func setPreferredContentSize(_ size: CGSize) {
85
+ contentViewController?.preferredContentSize = size
86
+ }
87
+
84
88
  // MARK: - AVPictureInPictureControllerDelegate
85
89
 
86
90
  func pictureInPictureController(
@@ -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
- override func didMoveToWindow() {
86
- super.didMoveToWindow()
87
- let isVisible = self.superview != nil && self.window != nil;
88
- if (!isVisible) {
89
- // view is detached so we cleanup the pip controller
90
- // taken from: https://github.com/software-mansion/react-native-screens/blob/main/Example/ios/ScreensExample/RNSSampleLifecycleAwareView.m
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
  }
@@ -12,5 +12,6 @@
12
12
 
13
13
  RCT_EXPORT_VIEW_PROPERTY(streamURL, NSString)
14
14
  RCT_EXTERN_METHOD(onCallClosed:(nonnull NSNumber*) reactTag)
15
+ RCT_EXTERN_METHOD(setPreferredContentSize:(nonnull NSNumber *)reactTag width:(CGFloat)w height:(CGFloat)h);
15
16
 
16
17
  @end
@@ -9,39 +9,59 @@ import Foundation
9
9
 
10
10
  @objc(RTCViewPipManager)
11
11
  class RTCViewPipManager: RCTViewManager {
12
-
13
- // A cached RTCViewPip reference.
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 func onCallClosed(_ reactTag: NSNumber) {
35
- self.bridge!.uiManager.addUIBlock { (_: RCTUIManager?, viewRegistry: [NSNumber: UIView]?) in
36
- guard let pipView = viewRegistry?[reactTag] as? RTCViewPip else {
37
- NSLog("PiP - onCallClosed can't be called, Invalid view returned from registry, expecting RTCViewPip. Disposing the cached view.")
38
- self._view?.onCallClosed()
39
- self._view = nil
40
- return
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
- DispatchQueue.main.async {
43
- pipView.onCallClosed()
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
  }
@@ -5,6 +5,7 @@
5
5
  #import <React/RCTUIManager.h>
6
6
  #import <React/RCTView.h>
7
7
  #import <React/RCTBridge.h>
8
+ #import <React/UIView+React.h>
8
9
 
9
10
  #import <WebRTC/RTCCVPixelBuffer.h>
10
11
  #import <WebRTC/RTCVideoFrame.h>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-native-sdk",
3
- "version": "1.20.1",
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.1",
49
- "@stream-io/video-react-bindings": "1.7.10",
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.0",
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.0",
129
- "@stream-io/react-native-webrtc": "^125.4.0",
130
- "@stream-io/video-filters-react-native": "^0.6.0",
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 { onNativeCallClosed, RTCViewPipNative } from './RTCViewPipNative';
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 streamURL = useMemo(() => {
84
- if (!participantInSpotlight) {
85
- return undefined;
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
- const { videoStream, screenShareStream } = participantInSpotlight;
97
+ const { videoStream, screenShareStream } = participantInSpotlight;
89
98
 
90
- const isScreenSharing = hasScreenShare(participantInSpotlight);
99
+ const isScreenSharing = hasScreenShare(participantInSpotlight);
91
100
 
92
- const videoStreamToRender = (isScreenSharing
93
- ? screenShareStream
94
- : videoStream) as unknown as MediaStream | undefined;
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
- }, [participantInSpotlight]);
110
+ }, [videoStreamToRender]);
98
111
 
99
- return <RTCViewPipNative streamURL={streamURL} ref={nativeRef} />;
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 || !NativeModules.WebRTCModule) return;
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 !== eventData.width ||
50
- prev.height !== eventData.height
49
+ prev.width === eventData.width &&
50
+ prev.height === eventData.height
51
51
  ) {
52
- return { width: eventData.width, height: eventData.height };
52
+ return prev;
53
53
  }
54
- return prev;
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';
1
+ export const version = '1.20.2';