@stream-io/video-react-native-sdk 0.8.7 → 0.8.8

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 (42) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/commonjs/components/Call/CallControls/ScreenShareToggleButton.js +6 -76
  3. package/dist/commonjs/components/Call/CallControls/ScreenShareToggleButton.js.map +1 -1
  4. package/dist/commonjs/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js +7 -69
  5. package/dist/commonjs/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js.map +1 -1
  6. package/dist/commonjs/components/Livestream/LivestreamPlayer/LivestreamPlayer.js +6 -5
  7. package/dist/commonjs/components/Livestream/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  8. package/dist/commonjs/hooks/index.js +11 -0
  9. package/dist/commonjs/hooks/index.js.map +1 -1
  10. package/dist/commonjs/hooks/useScreenShareButton.js +89 -0
  11. package/dist/commonjs/hooks/useScreenShareButton.js.map +1 -0
  12. package/dist/commonjs/version.js +1 -1
  13. package/dist/module/components/Call/CallControls/ScreenShareToggleButton.js +8 -78
  14. package/dist/module/components/Call/CallControls/ScreenShareToggleButton.js.map +1 -1
  15. package/dist/module/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js +7 -68
  16. package/dist/module/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js.map +1 -1
  17. package/dist/module/components/Livestream/LivestreamPlayer/LivestreamPlayer.js +3 -2
  18. package/dist/module/components/Livestream/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  19. package/dist/module/hooks/index.js +1 -0
  20. package/dist/module/hooks/index.js.map +1 -1
  21. package/dist/module/hooks/useScreenShareButton.js +83 -0
  22. package/dist/module/hooks/useScreenShareButton.js.map +1 -0
  23. package/dist/module/version.js +1 -1
  24. package/dist/typescript/components/Call/CallControls/ScreenShareToggleButton.d.ts.map +1 -1
  25. package/dist/typescript/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.d.ts +1 -1
  26. package/dist/typescript/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.d.ts.map +1 -1
  27. package/dist/typescript/components/Livestream/LivestreamPlayer/LivestreamPlayer.d.ts +1 -1
  28. package/dist/typescript/components/Livestream/LivestreamPlayer/LivestreamPlayer.d.ts.map +1 -1
  29. package/dist/typescript/hooks/index.d.ts +1 -0
  30. package/dist/typescript/hooks/index.d.ts.map +1 -1
  31. package/dist/typescript/hooks/useScreenShareButton.d.ts +9 -0
  32. package/dist/typescript/hooks/useScreenShareButton.d.ts.map +1 -0
  33. package/dist/typescript/version.d.ts +1 -1
  34. package/expo-config-plugin/dist/withAndroidManifest.js +6 -6
  35. package/expo-config-plugin/dist/withMainActivity.js +17 -0
  36. package/package.json +3 -3
  37. package/src/components/Call/CallControls/ScreenShareToggleButton.tsx +9 -95
  38. package/src/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx +6 -91
  39. package/src/components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx +4 -3
  40. package/src/hooks/index.ts +1 -0
  41. package/src/hooks/useScreenShareButton.ts +128 -0
  42. package/src/version.ts +1 -1
@@ -1,18 +1,10 @@
1
- import React, { useEffect } from 'react';
1
+ import React from 'react';
2
2
  import { useTheme } from '../../../contexts/ThemeContext';
3
- import { findNodeHandle, NativeModules, Platform, Pressable, StyleSheet, View } from 'react-native';
3
+ import { Platform, Pressable, StyleSheet, View } from 'react-native';
4
4
  import { ScreenShare } from '../../../icons/ScreenShare';
5
5
  import { StopScreenShare } from '../../../icons/StopScreenShare';
6
6
  import { ScreenCapturePickerView } from '@stream-io/react-native-webrtc';
7
- import { hasScreenShare, SfuModels } from '@stream-io/video-client';
8
- import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
9
- import { useIsIosScreenshareBroadcastStarted } from '../../../hooks/useIsIosScreenshareBroadcastStarted';
10
- import { usePrevious } from '../../../utils/hooks/usePrevious';
11
- // ios >= 14.0 or android - platform restrictions
12
- const CanDeviceScreenShare = Platform.OS === 'ios' &&
13
- // @ts-ignore
14
- Number.parseInt(Platform.Version.split('.')[0], 10) >= 14 || Platform.OS === 'android';
15
-
7
+ import { useScreenShareButton } from '../../../hooks/useScreenShareButton';
16
8
  /**
17
9
  * The LivestreamVideoControlButton controls the screenshare stream publish/unpublish while in the livestream for the host.
18
10
  */
@@ -27,64 +19,11 @@ export const LivestreamScreenShareToggleButton = () => {
27
19
  livestreamScreenShareToggleButton
28
20
  }
29
21
  } = useTheme();
30
- const call = useCall();
31
- const {
32
- useLocalParticipant,
33
- useCallSettings
34
- } = useCallStateHooks();
35
- const callSettings = useCallSettings();
36
- const isScreenSharingEnabledInCall = callSettings?.screensharing.enabled;
37
- const iosScreenShareStartedFromSystem = useIsIosScreenshareBroadcastStarted();
38
- const prevIosScreenShareStartedFromSystem = usePrevious(iosScreenShareStartedFromSystem);
39
- const localParticipant = useLocalParticipant();
40
- const hasPublishedScreenShare = localParticipant && hasScreenShare(localParticipant);
41
-
42
- // listens to iOS screen share broadcast started event from the system
43
- useEffect(() => {
44
- const run = async () => {
45
- if (Platform.OS !== 'ios') {
46
- return;
47
- }
48
- if (iosScreenShareStartedFromSystem && !prevIosScreenShareStartedFromSystem) {
49
- const media = await navigator.mediaDevices.getDisplayMedia({
50
- // @ts-ignore
51
- deviceId: 'broadcast',
52
- video: true,
53
- audio: true
54
- });
55
- await call?.publishScreenShareStream(media);
56
- } else if (!iosScreenShareStartedFromSystem && prevIosScreenShareStartedFromSystem) {
57
- await call?.stopPublish(SfuModels.TrackType.SCREEN_SHARE);
58
- }
59
- };
60
- run();
61
- }, [call, iosScreenShareStartedFromSystem, prevIosScreenShareStartedFromSystem]);
62
22
  const screenCapturePickerViewiOSRef = React.useRef(null);
63
- const onPress = async () => {
64
- if (!hasPublishedScreenShare) {
65
- if (Platform.OS === 'ios') {
66
- const reactTag = findNodeHandle(screenCapturePickerViewiOSRef.current);
67
- await NativeModules.ScreenCapturePickerViewManager.show(reactTag);
68
- // After this the iOS screen share broadcast started/stopped event will be triggered
69
- // and the useEffect listener will handle the rest
70
- } else {
71
- try {
72
- const media = await navigator.mediaDevices.getDisplayMedia({
73
- video: true,
74
- audio: true
75
- });
76
- await call?.publishScreenShareStream(media);
77
- } catch (e) {
78
- // ignored.. user didnt allow the screen share in the popup
79
- }
80
- }
81
- } else if (hasPublishedScreenShare) {
82
- await call?.stopPublish(SfuModels.TrackType.SCREEN_SHARE);
83
- }
84
- };
85
- if (!isScreenSharingEnabledInCall || !CanDeviceScreenShare) {
86
- return null;
87
- }
23
+ const {
24
+ onPress,
25
+ hasPublishedScreenShare
26
+ } = useScreenShareButton(screenCapturePickerViewiOSRef);
88
27
  return /*#__PURE__*/React.createElement(Pressable, {
89
28
  onPress: onPress,
90
29
  style: [styles.container, {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useTheme","findNodeHandle","NativeModules","Platform","Pressable","StyleSheet","View","ScreenShare","StopScreenShare","ScreenCapturePickerView","hasScreenShare","SfuModels","useCall","useCallStateHooks","useIsIosScreenshareBroadcastStarted","usePrevious","CanDeviceScreenShare","OS","Number","parseInt","Version","split","LivestreamScreenShareToggleButton","theme","colors","variants","iconSizes","buttonSizes","livestreamScreenShareToggleButton","call","useLocalParticipant","useCallSettings","callSettings","isScreenSharingEnabledInCall","screensharing","enabled","iosScreenShareStartedFromSystem","prevIosScreenShareStartedFromSystem","localParticipant","hasPublishedScreenShare","run","media","navigator","mediaDevices","getDisplayMedia","deviceId","video","audio","publishScreenShareStream","stopPublish","TrackType","SCREEN_SHARE","screenCapturePickerViewiOSRef","useRef","onPress","reactTag","current","ScreenCapturePickerViewManager","show","e","createElement","style","styles","container","backgroundColor","error","dark_gray","height","xs","width","icon","sm","color","static_white","ref","create","justifyContent","alignItems","marginHorizontal","borderRadius"],"sourceRoot":"../../../../../src","sources":["components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useTheme","Platform","Pressable","StyleSheet","View","ScreenShare","StopScreenShare","ScreenCapturePickerView","useScreenShareButton","LivestreamScreenShareToggleButton","theme","colors","variants","iconSizes","buttonSizes","livestreamScreenShareToggleButton","screenCapturePickerViewiOSRef","useRef","onPress","hasPublishedScreenShare","createElement","style","styles","container","backgroundColor","error","dark_gray","height","xs","width","icon","sm","color","static_white","OS","ref","create","justifyContent","alignItems","marginHorizontal","borderRadius"],"sourceRoot":"../../../../../src","sources":["components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,gCAAgC;AACzD,SAASC,QAAQ,EAAEC,SAAS,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AACpE,SAASC,WAAW,QAAQ,4BAA4B;AACxD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,uBAAuB,QAAQ,gCAAgC;AACxE,SAASC,oBAAoB,QAAQ,qCAAqC;AAI1E;AACA;AACA;AACA,OAAO,MAAMC,iCAAiC,GAAGA,CAAA,KAAM;EACrD,MAAM;IACJC,KAAK,EAAE;MACLC,MAAM;MACNC,QAAQ,EAAE;QAAEC,SAAS;QAAEC;MAAY,CAAC;MACpCC;IACF;EACF,CAAC,GAAGf,QAAQ,CAAC,CAAC;EAEd,MAAMgB,6BAA6B,GAAGjB,KAAK,CAACkB,MAAM,CAAC,IAAI,CAAC;EAExD,MAAM;IAAEC,OAAO;IAAEC;EAAwB,CAAC,GAAGX,oBAAoB,CAC/DQ,6BACF,CAAC;EAED,oBACEjB,KAAA,CAAAqB,aAAA,CAAClB,SAAS;IACRgB,OAAO,EAAEA,OAAQ;IACjBG,KAAK,EAAE,CACLC,MAAM,CAACC,SAAS,EAChB;MACEC,eAAe,EAAEL,uBAAuB,GACpCR,MAAM,CAACc,KAAK,GACZd,MAAM,CAACe,SAAS;MACpBC,MAAM,EAAEb,WAAW,CAACc,EAAE;MACtBC,KAAK,EAAEf,WAAW,CAACc;IACrB,CAAC,EACDb,iCAAiC,CAACQ,SAAS;EAC3C,gBAEFxB,KAAA,CAAAqB,aAAA,CAAChB,IAAI;IACHiB,KAAK,EAAE,CACLC,MAAM,CAACQ,IAAI,EACX;MACEH,MAAM,EAAEd,SAAS,CAACkB,EAAE;MACpBF,KAAK,EAAEhB,SAAS,CAACkB;IACnB,CAAC,EACDhB,iCAAiC,CAACe,IAAI;EACtC,GAEDX,uBAAuB,gBACtBpB,KAAA,CAAAqB,aAAA,CAACd,eAAe;IAAC0B,KAAK,EAAErB,MAAM,CAACsB;EAAa,CAAE,CAAC,gBAE/ClC,KAAA,CAAAqB,aAAA,CAACf,WAAW;IAAC2B,KAAK,EAAErB,MAAM,CAACsB;EAAa,CAAE,CAExC,CAAC,EACNhC,QAAQ,CAACiC,EAAE,KAAK,KAAK,iBACpBnC,KAAA,CAAAqB,aAAA,CAACb,uBAAuB;IAAC4B,GAAG,EAAEnB;EAA8B,CAAE,CAEvD,CAAC;AAEhB,CAAC;AAED,MAAMM,MAAM,GAAGnB,UAAU,CAACiC,MAAM,CAAC;EAC/Bb,SAAS,EAAE;IACTc,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,gBAAgB,EAAE,CAAC;IACnBC,YAAY,EAAE;EAChB,CAAC;EACDV,IAAI,EAAE,CAAC;AACT,CAAC,CAAC","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { ViewerLivestream as DefaultViewerLivestream } from '..';
3
- import { StreamCall, useStreamVideoClient } from '../../..';
2
+ import { ViewerLivestream as DefaultViewerLivestream } from '../ViewerLivestream';
4
3
  import { CallingState, getLogger } from '@stream-io/video-client';
4
+ import { StreamCall } from '../../../providers/StreamCall';
5
+ import { useStreamVideoClient } from '@stream-io/video-react-bindings';
5
6
  export const LivestreamPlayer = ({
6
7
  callType,
7
8
  callId,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useState","ViewerLivestream","DefaultViewerLivestream","StreamCall","useStreamVideoClient","CallingState","getLogger","LivestreamPlayer","callType","callId","client","call","setCall","myCall","join","catch","e","logger","state","callingState","LEFT","leave","undefined","createElement"],"sourceRoot":"../../../../../src","sources":["components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SACEC,gBAAgB,IAAIC,uBAAuB,QAEtC,IAAI;AACX,SAAeC,UAAU,EAAEC,oBAAoB,QAAQ,UAAU;AACjE,SAASC,YAAY,EAAEC,SAAS,QAAQ,yBAAyB;AAkBjE,OAAO,MAAMC,gBAAgB,GAAGA,CAAC;EAC/BC,QAAQ;EACRC,MAAM;EACNR,gBAAgB,GAAGC;AACE,CAAC,KAAK;EAC3B,MAAMQ,MAAM,GAAGN,oBAAoB,CAAC,CAAC;EAErC,MAAM,CAACO,IAAI,EAAEC,OAAO,CAAC,GAAGZ,QAAQ,CAAO,CAAC;EAExCD,SAAS,CAAC,MAAM;IACd,IAAI,CAACW,MAAM,EAAE;MACX;IACF;IACA,MAAMG,MAAM,GAAGH,MAAM,CAACC,IAAI,CAACH,QAAQ,EAAEC,MAAM,CAAC;IAC5CG,OAAO,CAACC,MAAM,CAAC;IACfA,MAAM,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAEC,CAAC,IAAK;MACzB,MAAMC,MAAM,GAAGX,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;MAC9CW,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,OAAO,MAAM;MACX,IAAIH,MAAM,CAACK,KAAK,CAACC,YAAY,KAAKd,YAAY,CAACe,IAAI,EAAE;QACnDP,MAAM,CAACQ,KAAK,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK;UAC1B,MAAMC,MAAM,GAAGX,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;UAC9CW,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;QAC3C,CAAC,CAAC;MACJ;MACAJ,OAAO,CAACU,SAAS,CAAC;IACpB,CAAC;EACH,CAAC,EAAE,CAACb,MAAM,EAAED,QAAQ,EAAEE,MAAM,CAAC,CAAC;EAE9BX,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX;MACA,IAAIY,IAAI,EAAEO,KAAK,CAACC,YAAY,KAAKd,YAAY,CAACe,IAAI,EAAE;QAClDT,IAAI,EAAEU,KAAK,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK;UACzB,MAAMC,MAAM,GAAGX,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;UAC9CW,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;QAC3C,CAAC,CAAC;MACJ;IACF,CAAC;EACH,CAAC,EAAE,CAACL,IAAI,CAAC,CAAC;EAEV,IAAI,CAACA,IAAI,EAAE;IACT,OAAO,IAAI;EACb;EAEA,oBACEb,KAAA,CAAAyB,aAAA,CAACpB,UAAU;IAACQ,IAAI,EAAEA;EAAK,gBACrBb,KAAA,CAAAyB,aAAA,CAACtB,gBAAgB,MAAE,CACT,CAAC;AAEjB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useState","ViewerLivestream","DefaultViewerLivestream","CallingState","getLogger","StreamCall","useStreamVideoClient","LivestreamPlayer","callType","callId","client","call","setCall","myCall","join","catch","e","logger","state","callingState","LEFT","leave","undefined","createElement"],"sourceRoot":"../../../../../src","sources":["components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SACEC,gBAAgB,IAAIC,uBAAuB,QAEtC,qBAAqB;AAC5B,SAAeC,YAAY,EAAEC,SAAS,QAAQ,yBAAyB;AACvE,SAASC,UAAU,QAAQ,+BAA+B;AAC1D,SAASC,oBAAoB,QAAQ,iCAAiC;AAkBtE,OAAO,MAAMC,gBAAgB,GAAGA,CAAC;EAC/BC,QAAQ;EACRC,MAAM;EACNR,gBAAgB,GAAGC;AACE,CAAC,KAAK;EAC3B,MAAMQ,MAAM,GAAGJ,oBAAoB,CAAC,CAAC;EAErC,MAAM,CAACK,IAAI,EAAEC,OAAO,CAAC,GAAGZ,QAAQ,CAAO,CAAC;EAExCD,SAAS,CAAC,MAAM;IACd,IAAI,CAACW,MAAM,EAAE;MACX;IACF;IACA,MAAMG,MAAM,GAAGH,MAAM,CAACC,IAAI,CAACH,QAAQ,EAAEC,MAAM,CAAC;IAC5CG,OAAO,CAACC,MAAM,CAAC;IACfA,MAAM,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAEC,CAAC,IAAK;MACzB,MAAMC,MAAM,GAAGb,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;MAC9Ca,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,OAAO,MAAM;MACX,IAAIH,MAAM,CAACK,KAAK,CAACC,YAAY,KAAKhB,YAAY,CAACiB,IAAI,EAAE;QACnDP,MAAM,CAACQ,KAAK,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK;UAC1B,MAAMC,MAAM,GAAGb,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;UAC9Ca,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;QAC3C,CAAC,CAAC;MACJ;MACAJ,OAAO,CAACU,SAAS,CAAC;IACpB,CAAC;EACH,CAAC,EAAE,CAACb,MAAM,EAAED,QAAQ,EAAEE,MAAM,CAAC,CAAC;EAE9BX,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX;MACA,IAAIY,IAAI,EAAEO,KAAK,CAACC,YAAY,KAAKhB,YAAY,CAACiB,IAAI,EAAE;QAClDT,IAAI,EAAEU,KAAK,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK;UACzB,MAAMC,MAAM,GAAGb,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;UAC9Ca,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAED,CAAC,CAAC;QAC3C,CAAC,CAAC;MACJ;IACF,CAAC;EACH,CAAC,EAAE,CAACL,IAAI,CAAC,CAAC;EAEV,IAAI,CAACA,IAAI,EAAE;IACT,OAAO,IAAI;EACb;EAEA,oBACEb,KAAA,CAAAyB,aAAA,CAAClB,UAAU;IAACM,IAAI,EAAEA;EAAK,gBACrBb,KAAA,CAAAyB,aAAA,CAACtB,gBAAgB,MAAE,CACT,CAAC;AAEjB,CAAC","ignoreList":[]}
@@ -6,4 +6,5 @@ export * from './useIsIosScreenshareBroadcastStarted';
6
6
  export * from './useIsInPiPMode';
7
7
  export * from './useAutoEnterPiPEffect';
8
8
  export * from './useApplyDefaultMediaStreamSettings';
9
+ export * from './useScreenShareButton';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":"AAAA,cAAc,wBAAwB;AACtC,cAAc,6BAA6B;AAC3C,cAAc,QAAQ;AACtB,cAAc,iCAAiC;AAC/C,cAAc,uCAAuC;AACrD,cAAc,kBAAkB;AAChC,cAAc,yBAAyB;AACvC,cAAc,sCAAsC","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":"AAAA,cAAc,wBAAwB;AACtC,cAAc,6BAA6B;AAC3C,cAAc,QAAQ;AACtB,cAAc,iCAAiC;AAC/C,cAAc,uCAAuC;AACrD,cAAc,kBAAkB;AAChC,cAAc,yBAAyB;AACvC,cAAc,sCAAsC;AACpD,cAAc,wBAAwB","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ import { getLogger, hasScreenShare, OwnCapability } from '@stream-io/video-client';
2
+ import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
3
+ import { useRef, useEffect } from 'react';
4
+ import { Platform, findNodeHandle, NativeModules } from 'react-native';
5
+ import { usePrevious } from '../utils/hooks';
6
+ import { useIsIosScreenshareBroadcastStarted } from './useIsIosScreenshareBroadcastStarted';
7
+
8
+ // ios >= 14.0 or android - platform restrictions
9
+ const CanDeviceScreenShare = (Platform.OS === 'ios' &&
10
+ // @ts-ignore
11
+ Number.parseInt(Platform.Version.split('.')[0], 10) >= 14, 10) || Platform.OS === 'android';
12
+ export const useScreenShareButton = (screenCapturePickerViewiOSRef, onScreenShareStartedHandler, onScreenShareStoppedHandler, onMissingScreenShareStreamPermission) => {
13
+ const call = useCall();
14
+ const {
15
+ useLocalParticipant,
16
+ useCallSettings,
17
+ useOwnCapabilities
18
+ } = useCallStateHooks();
19
+ const callSettings = useCallSettings();
20
+ const ownCapabilities = useOwnCapabilities();
21
+ const hasScreenSharingPermissions = ownCapabilities?.includes(OwnCapability.SCREENSHARE);
22
+ const isScreenSharingEnabledInCall = callSettings?.screensharing.enabled;
23
+ const onScreenShareStartedHandlerRef = useRef(onScreenShareStartedHandler);
24
+ onScreenShareStartedHandlerRef.current = onScreenShareStartedHandler;
25
+ const onScreenShareStoppedHandlerRef = useRef(onScreenShareStoppedHandler);
26
+ onScreenShareStoppedHandlerRef.current = onScreenShareStoppedHandler;
27
+ const iosScreenShareStartedFromSystem = useIsIosScreenshareBroadcastStarted();
28
+ const prevIosScreenShareStartedFromSystem = usePrevious(iosScreenShareStartedFromSystem);
29
+ const localParticipant = useLocalParticipant();
30
+ const hasPublishedScreenShare = localParticipant && hasScreenShare(localParticipant);
31
+
32
+ // listens to iOS screen share broadcast started event from the system
33
+ useEffect(() => {
34
+ if (Platform.OS !== 'ios') {
35
+ return;
36
+ }
37
+ if (iosScreenShareStartedFromSystem && !prevIosScreenShareStartedFromSystem) {
38
+ onScreenShareStartedHandlerRef.current?.();
39
+ call?.screenShare.enable();
40
+ } else if (!iosScreenShareStartedFromSystem && prevIosScreenShareStartedFromSystem) {
41
+ onScreenShareStoppedHandlerRef.current?.();
42
+ call?.screenShare.disable(true);
43
+ }
44
+ }, [call, iosScreenShareStartedFromSystem, prevIosScreenShareStartedFromSystem]);
45
+ const onPress = async () => {
46
+ if (!hasScreenSharingPermissions) {
47
+ const logger = getLogger(['useScreenShareButton']);
48
+ logger('info', 'User does not have permissions to stream the screen share media, calling onMissingScreenShareStreamPermission handler if present');
49
+ onMissingScreenShareStreamPermission?.();
50
+ }
51
+ if (!hasPublishedScreenShare) {
52
+ if (Platform.OS === 'ios') {
53
+ const reactTag = findNodeHandle(screenCapturePickerViewiOSRef.current);
54
+ await NativeModules.ScreenCapturePickerViewManager.show(reactTag);
55
+ // After this the iOS screen share broadcast started/stopped event will be triggered
56
+ // and the useEffect listener will handle the rest
57
+ } else {
58
+ try {
59
+ await call?.screenShare.enable();
60
+ onScreenShareStartedHandler?.();
61
+ } catch (error) {
62
+ // ignored.. user didnt allow the screen share in the popup
63
+ const logger = getLogger(['useScreenShareButton']);
64
+ logger('info', 'User opted to not give permissions to start a screen share stream', error);
65
+ }
66
+ }
67
+ } else if (hasPublishedScreenShare) {
68
+ onScreenShareStoppedHandler?.();
69
+ await call?.screenShare.disable(true);
70
+ }
71
+ };
72
+ if (!isScreenSharingEnabledInCall || !CanDeviceScreenShare) {
73
+ return {
74
+ onPress: undefined,
75
+ hasPublishedScreenShare: false
76
+ };
77
+ }
78
+ return {
79
+ onPress,
80
+ hasPublishedScreenShare
81
+ };
82
+ };
83
+ //# sourceMappingURL=useScreenShareButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getLogger","hasScreenShare","OwnCapability","useCall","useCallStateHooks","useRef","useEffect","Platform","findNodeHandle","NativeModules","usePrevious","useIsIosScreenshareBroadcastStarted","CanDeviceScreenShare","OS","Number","parseInt","Version","split","useScreenShareButton","screenCapturePickerViewiOSRef","onScreenShareStartedHandler","onScreenShareStoppedHandler","onMissingScreenShareStreamPermission","call","useLocalParticipant","useCallSettings","useOwnCapabilities","callSettings","ownCapabilities","hasScreenSharingPermissions","includes","SCREENSHARE","isScreenSharingEnabledInCall","screensharing","enabled","onScreenShareStartedHandlerRef","current","onScreenShareStoppedHandlerRef","iosScreenShareStartedFromSystem","prevIosScreenShareStartedFromSystem","localParticipant","hasPublishedScreenShare","screenShare","enable","disable","onPress","logger","reactTag","ScreenCapturePickerViewManager","show","error","undefined"],"sourceRoot":"../../../src","sources":["hooks/useScreenShareButton.ts"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export const version = '0.8.7';
1
+ export const version = '0.8.8';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenShareToggleButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallControls/ScreenShareToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAmBjD;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,kEAGjC,4BAA4B,6BA8G9B,CAAC"}
1
+ {"version":3,"file":"ScreenShareToggleButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/Call/CallControls/ScreenShareToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAStC;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,kEAGjC,4BAA4B,6BAkC9B,CAAC"}
@@ -3,5 +3,5 @@ export type LivestreamScreenShareToggleButtonProps = {};
3
3
  /**
4
4
  * The LivestreamVideoControlButton controls the screenshare stream publish/unpublish while in the livestream for the host.
5
5
  */
6
- export declare const LivestreamScreenShareToggleButton: () => React.JSX.Element | null;
6
+ export declare const LivestreamScreenShareToggleButton: () => React.JSX.Element;
7
7
  //# sourceMappingURL=LivestreamScreenShareToggleButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LivestreamScreenShareToggleButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAkBzC,MAAM,MAAM,sCAAsC,GAAG,EAAE,CAAC;AASxD;;GAEG;AACH,eAAO,MAAM,iCAAiC,gCAuH7C,CAAC"}
1
+ {"version":3,"file":"LivestreamScreenShareToggleButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,iCAAiC,yBAmD7C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ViewerLivestreamProps } from '..';
2
+ import { ViewerLivestreamProps } from '../ViewerLivestream';
3
3
  export type LivestreamPlayerProps = {
4
4
  /**
5
5
  * The call type. Usually `livestream`.
@@ -1 +1 @@
1
- {"version":3,"file":"LivestreamPlayer.d.ts","sourceRoot":"","sources":["../../../../../src/components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,qBAAqB,EACtB,MAAM,IAAI,CAAC;AAIZ,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,4CAI1B,qBAAqB,6BA+CvB,CAAC"}
1
+ {"version":3,"file":"LivestreamPlayer.d.ts","sourceRoot":"","sources":["../../../../../src/components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAEL,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAK7B,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,4CAI1B,qBAAqB,6BA+CvB,CAAC"}
@@ -6,4 +6,5 @@ export * from './useIsIosScreenshareBroadcastStarted';
6
6
  export * from './useIsInPiPMode';
7
7
  export * from './useAutoEnterPiPEffect';
8
8
  export * from './useApplyDefaultMediaStreamSettings';
9
+ export * from './useScreenShareButton';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export declare const useScreenShareButton: (screenCapturePickerViewiOSRef: React.MutableRefObject<any>, onScreenShareStartedHandler?: () => void, onScreenShareStoppedHandler?: () => void, onMissingScreenShareStreamPermission?: () => void) => {
3
+ onPress: undefined;
4
+ hasPublishedScreenShare: boolean;
5
+ } | {
6
+ onPress: () => Promise<void>;
7
+ hasPublishedScreenShare: boolean | undefined;
8
+ };
9
+ //# sourceMappingURL=useScreenShareButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScreenShareButton.d.ts","sourceRoot":"","sources":["../../../src/hooks/useScreenShareButton.ts"],"names":[],"mappings":"AAMA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAYjD,eAAO,MAAM,oBAAoB,kCAKA,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,gCAK5B,MAAM,IAAI,gCAKV,MAAM,IAAI,yCAKD,MAAM,IAAI;;;;;;CAyFlD,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "0.8.7";
1
+ export declare const version = "0.8.8";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -2,17 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const config_plugins_1 = require("@expo/config-plugins");
4
4
  const { prefixAndroidKeys, getMainApplicationOrThrow, getMainActivityOrThrow } = config_plugins_1.AndroidConfig.Manifest;
5
- function getNotifeeService(enableScreenshare = false) {
5
+ function getNotifeeService() {
6
6
  /*
7
7
  <service
8
8
  android:name="app.notifee.core.ForegroundService"
9
9
  android:stopWithTask="true"
10
- android:foregroundServiceType="mediaProjection|microphone" />
10
+ android:foregroundServiceType="mediaProjection" />
11
11
  */
12
12
  let foregroundServiceType = 'microphone';
13
- if (enableScreenshare) {
14
- foregroundServiceType = 'mediaProjection|' + foregroundServiceType;
15
- }
13
+ // if (enableScreenshare) {
14
+ // foregroundServiceType = 'mediaProjection|' + foregroundServiceType;
15
+ // }
16
16
  const head = prefixAndroidKeys({
17
17
  name: 'app.notifee.core.ForegroundService',
18
18
  stopWithTask: 'true',
@@ -31,7 +31,7 @@ const withStreamVideoReactNativeSDKManifest = (configuration, props) => {
31
31
  let services = mainApplication.service ?? [];
32
32
  // we filter out the existing notifee service (if any) so that we can override it
33
33
  services = services.filter((service) => service.$['android:name'] !== 'app.notifee.core.ForegroundService');
34
- services.push(getNotifeeService(props?.enableScreenshare));
34
+ services.push(getNotifeeService());
35
35
  mainApplication.service = services;
36
36
  if (props?.androidPictureInPicture) {
37
37
  const mainActivity = getMainActivityOrThrow(androidManifest);
@@ -16,11 +16,15 @@ const withStreamVideoReactNativeSDKMainActivity = (configuration, props) => {
16
16
  'android.util.Rational',
17
17
  'androidx.lifecycle.Lifecycle',
18
18
  'android.app.PictureInPictureParams',
19
+ 'com.oney.WebRTCModule.WebRTCModuleOptions',
19
20
  ], isMainActivityJava);
20
21
  config.modResults.contents = addOnPictureInPictureModeChanged(config.modResults.contents, isMainActivityJava);
21
22
  if (props?.androidPictureInPicture?.enableAutomaticEnter) {
22
23
  config.modResults.contents = addOnUserLeaveHint(config.modResults.contents, isMainActivityJava);
23
24
  }
25
+ if (props?.enableScreenshare) {
26
+ config.modResults.contents = addInsideOnCreate(config.modResults.contents, isMainActivityJava);
27
+ }
24
28
  }
25
29
  catch (error) {
26
30
  throw new Error("Cannot add StreamVideoReactNativeSDK to the project's MainApplication because it's malformed.");
@@ -89,4 +93,17 @@ function addOnUserLeaveHint(contents, isJava) {
89
93
  }
90
94
  return contents;
91
95
  }
96
+ function addInsideOnCreate(contents, isJava) {
97
+ const addScreenShareServiceEnablerBlock = isJava
98
+ ? `WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();
99
+ options.enableMediaProjectionService = true;
100
+ `
101
+ : `val options: WebRTCModuleOptions = WebRTCModuleOptions.getInstance()
102
+ options.enableMediaProjectionService = true
103
+ `;
104
+ if (!contents.includes('options.enableMediaProjectionService = true')) {
105
+ contents = (0, codeMod_1.appendContentsInsideDeclarationBlock)(contents, 'onCreate', addScreenShareServiceEnablerBlock);
106
+ }
107
+ return contents;
108
+ }
92
109
  exports.default = withStreamVideoReactNativeSDKMainActivity;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-native-sdk",
3
- "version": "0.8.7",
3
+ "version": "0.8.8",
4
4
  "packageManager": "yarn@3.2.4",
5
5
  "main": "dist/commonjs/index.js",
6
6
  "module": "dist/module/index.js",
@@ -135,8 +135,8 @@
135
135
  "expo": "50.0.19",
136
136
  "expo-build-properties": "^0.12.3",
137
137
  "expo-modules-core": "1.12.16",
138
- "expo-notifications": "0.28.9",
139
- "expo-task-manager": "11.8.2",
138
+ "expo-notifications": "~0.27.8",
139
+ "expo-task-manager": "~11.7.3",
140
140
  "jest": "^29.7.0",
141
141
  "react-native": "0.71.8",
142
142
  "react-native-builder-bob": "^0.23.2",
@@ -1,21 +1,11 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import { findNodeHandle, NativeModules, Platform } from 'react-native';
1
+ import React, { useRef } from 'react';
2
+ import { Platform } from 'react-native';
3
3
  import { ScreenCapturePickerView } from '@stream-io/react-native-webrtc';
4
4
  import { ScreenShare } from '../../../icons/ScreenShare';
5
5
  import { StopScreenShare } from '../../../icons/StopScreenShare';
6
6
  import { CallControlsButton } from './CallControlsButton';
7
7
  import { useTheme } from '../../../contexts/ThemeContext';
8
- import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
9
- import { useIsIosScreenshareBroadcastStarted } from '../../../hooks/useIsIosScreenshareBroadcastStarted';
10
- import { hasScreenShare, SfuModels } from '@stream-io/video-client';
11
- import { usePrevious } from '../../../utils/hooks/usePrevious';
12
-
13
- // ios >= 14.0 or android - platform restrictions
14
- const CanDeviceScreenShare =
15
- (Platform.OS === 'ios' &&
16
- // @ts-ignore
17
- Number.parseInt(Platform.Version.split('.')[0], 10) >= 14) ||
18
- Platform.OS === 'android';
8
+ import { useScreenShareButton } from '../../../hooks/useScreenShareButton';
19
9
 
20
10
  /**
21
11
  * The props for the Screen Share button in the Call Controls.
@@ -45,94 +35,18 @@ export const ScreenShareToggleButton = ({
45
35
  theme: { colors, screenShareToggleButton },
46
36
  } = useTheme();
47
37
 
48
- const call = useCall();
49
- const { useLocalParticipant, useCallSettings } = useCallStateHooks();
50
- const callSettings = useCallSettings();
51
- const isScreenSharingEnabledInCall = callSettings?.screensharing.enabled;
52
- const isScreenSharingAccessRequestEnabled =
53
- callSettings?.screensharing.access_request_enabled;
54
-
55
- const onScreenShareStartedHandlerRef = useRef(onScreenShareStartedHandler);
56
- onScreenShareStartedHandlerRef.current = onScreenShareStartedHandler;
57
- const onScreenShareStoppedHandlerRef = useRef(onScreenShareStoppedHandler);
58
- onScreenShareStoppedHandlerRef.current = onScreenShareStoppedHandler;
38
+ const screenCapturePickerViewiOSRef = useRef(null);
59
39
 
60
- const iosScreenShareStartedFromSystem = useIsIosScreenshareBroadcastStarted();
61
- const prevIosScreenShareStartedFromSystem = usePrevious(
62
- iosScreenShareStartedFromSystem
40
+ const { onPress, hasPublishedScreenShare } = useScreenShareButton(
41
+ screenCapturePickerViewiOSRef,
42
+ onScreenShareStartedHandler,
43
+ onScreenShareStoppedHandler
63
44
  );
64
45
 
65
- const localParticipant = useLocalParticipant();
66
- const hasPublishedScreenShare =
67
- localParticipant && hasScreenShare(localParticipant);
68
-
69
- // listens to iOS screen share broadcast started event from the system
70
- useEffect(() => {
71
- const run = async () => {
72
- if (Platform.OS !== 'ios') {
73
- return;
74
- }
75
- if (
76
- iosScreenShareStartedFromSystem &&
77
- !prevIosScreenShareStartedFromSystem
78
- ) {
79
- onScreenShareStartedHandlerRef.current?.();
80
- const media = await navigator.mediaDevices.getDisplayMedia({
81
- // @ts-ignore
82
- deviceId: 'broadcast',
83
- video: true,
84
- audio: true,
85
- });
86
- await call?.publishScreenShareStream(media);
87
- } else if (
88
- !iosScreenShareStartedFromSystem &&
89
- prevIosScreenShareStartedFromSystem
90
- ) {
91
- onScreenShareStoppedHandlerRef.current?.();
92
- await call?.stopPublish(SfuModels.TrackType.SCREEN_SHARE);
93
- }
94
- };
95
- run();
96
- }, [
97
- call,
98
- iosScreenShareStartedFromSystem,
99
- prevIosScreenShareStartedFromSystem,
100
- ]);
101
-
102
- const screenCapturePickerViewiOSRef = React.useRef(null);
103
-
104
- const onPress = async () => {
105
- if (!hasPublishedScreenShare) {
106
- if (Platform.OS === 'ios') {
107
- const reactTag = findNodeHandle(screenCapturePickerViewiOSRef.current);
108
- await NativeModules.ScreenCapturePickerViewManager.show(reactTag);
109
- // After this the iOS screen share broadcast started/stopped event will be triggered
110
- // and the useEffect listener will handle the rest
111
- } else {
112
- try {
113
- const media = await navigator.mediaDevices.getDisplayMedia({
114
- video: true,
115
- audio: true,
116
- });
117
- onScreenShareStartedHandler?.();
118
- await call?.publishScreenShareStream(media);
119
- } catch (e) {
120
- // ignored.. user didnt allow the screen share in the popup
121
- }
122
- }
123
- } else if (hasPublishedScreenShare) {
124
- onScreenShareStoppedHandler?.();
125
- await call?.stopPublish(SfuModels.TrackType.SCREEN_SHARE);
126
- }
127
- };
128
-
129
- if (!isScreenSharingEnabledInCall || !CanDeviceScreenShare) {
130
- return null;
131
- }
46
+ if (!onPress) return null;
132
47
 
133
48
  return (
134
49
  <CallControlsButton
135
- disabled={!isScreenSharingAccessRequestEnabled}
136
50
  onPress={onPress}
137
51
  color={hasPublishedScreenShare ? colors.error : colors.static_white}
138
52
  style={{