@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.
- package/CHANGELOG.md +7 -0
- package/dist/commonjs/components/Call/CallControls/ScreenShareToggleButton.js +6 -76
- package/dist/commonjs/components/Call/CallControls/ScreenShareToggleButton.js.map +1 -1
- package/dist/commonjs/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js +7 -69
- package/dist/commonjs/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js.map +1 -1
- package/dist/commonjs/components/Livestream/LivestreamPlayer/LivestreamPlayer.js +6 -5
- package/dist/commonjs/components/Livestream/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
- package/dist/commonjs/hooks/index.js +11 -0
- package/dist/commonjs/hooks/index.js.map +1 -1
- package/dist/commonjs/hooks/useScreenShareButton.js +89 -0
- package/dist/commonjs/hooks/useScreenShareButton.js.map +1 -0
- package/dist/commonjs/version.js +1 -1
- package/dist/module/components/Call/CallControls/ScreenShareToggleButton.js +8 -78
- package/dist/module/components/Call/CallControls/ScreenShareToggleButton.js.map +1 -1
- package/dist/module/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js +7 -68
- package/dist/module/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js.map +1 -1
- package/dist/module/components/Livestream/LivestreamPlayer/LivestreamPlayer.js +3 -2
- package/dist/module/components/Livestream/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
- package/dist/module/hooks/index.js +1 -0
- package/dist/module/hooks/index.js.map +1 -1
- package/dist/module/hooks/useScreenShareButton.js +83 -0
- package/dist/module/hooks/useScreenShareButton.js.map +1 -0
- package/dist/module/version.js +1 -1
- package/dist/typescript/components/Call/CallControls/ScreenShareToggleButton.d.ts.map +1 -1
- package/dist/typescript/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.d.ts +1 -1
- package/dist/typescript/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.d.ts.map +1 -1
- package/dist/typescript/components/Livestream/LivestreamPlayer/LivestreamPlayer.d.ts +1 -1
- package/dist/typescript/components/Livestream/LivestreamPlayer/LivestreamPlayer.d.ts.map +1 -1
- package/dist/typescript/hooks/index.d.ts +1 -0
- package/dist/typescript/hooks/index.d.ts.map +1 -1
- package/dist/typescript/hooks/useScreenShareButton.d.ts +9 -0
- package/dist/typescript/hooks/useScreenShareButton.d.ts.map +1 -0
- package/dist/typescript/version.d.ts +1 -1
- package/expo-config-plugin/dist/withAndroidManifest.js +6 -6
- package/expo-config-plugin/dist/withMainActivity.js +17 -0
- package/package.json +3 -3
- package/src/components/Call/CallControls/ScreenShareToggleButton.tsx +9 -95
- package/src/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.tsx +6 -91
- package/src/components/Livestream/LivestreamPlayer/LivestreamPlayer.tsx +4 -3
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useScreenShareButton.ts +128 -0
- package/src/version.ts +1 -1
package/dist/module/components/Livestream/LivestreamControls/LivestreamScreenShareToggleButton.js
CHANGED
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
import { useTheme } from '../../../contexts/ThemeContext';
|
|
3
|
-
import {
|
|
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 {
|
|
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
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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","
|
|
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","
|
|
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":[]}
|
|
@@ -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":[]}
|
package/dist/module/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '0.8.
|
|
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,
|
|
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
|
|
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,
|
|
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 +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,
|
|
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"}
|
|
@@ -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.
|
|
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(
|
|
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
|
|
10
|
+
android:foregroundServiceType="mediaProjection" />
|
|
11
11
|
*/
|
|
12
12
|
let foregroundServiceType = 'microphone';
|
|
13
|
-
if (enableScreenshare) {
|
|
14
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
139
|
-
"expo-task-manager": "11.
|
|
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, {
|
|
2
|
-
import {
|
|
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 {
|
|
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
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
40
|
+
const { onPress, hasPublishedScreenShare } = useScreenShareButton(
|
|
41
|
+
screenCapturePickerViewiOSRef,
|
|
42
|
+
onScreenShareStartedHandler,
|
|
43
|
+
onScreenShareStoppedHandler
|
|
63
44
|
);
|
|
64
45
|
|
|
65
|
-
|
|
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={{
|