@fishjam-cloud/react-native-client 0.4.1 → 0.6.0

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 (127) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +104 -20
  3. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +83 -99
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +21 -30
  5. package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +6 -2
  6. package/android/src/main/java/io/fishjam/reactnative/VideoView.kt +41 -3
  7. package/android/src/main/java/io/fishjam/reactnative/extensions/CaptureDevice.kt +17 -0
  8. package/android/src/main/java/io/fishjam/reactnative/foregroundService/FishjamForegroundService.kt +10 -4
  9. package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt +41 -70
  10. package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceState.kt +46 -0
  11. package/android/src/main/java/io/fishjam/reactnative/managers/ListenerManager.kt +22 -0
  12. package/android/src/main/java/io/fishjam/reactnative/managers/LocalCameraTracksChangedListenersManager.kt +2 -15
  13. package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt +1 -11
  14. package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt +1 -15
  15. package/build/RNFishjamClientModule.d.ts +28 -12
  16. package/build/RNFishjamClientModule.d.ts.map +1 -1
  17. package/build/RNFishjamClientModule.js +19 -4
  18. package/build/RNFishjamClientModule.js.map +1 -1
  19. package/build/common/client.d.ts +0 -4
  20. package/build/common/client.d.ts.map +1 -1
  21. package/build/common/client.js +0 -4
  22. package/build/common/client.js.map +1 -1
  23. package/build/common/metadata.d.ts +1 -1
  24. package/build/common/metadata.js +1 -1
  25. package/build/common/metadata.js.map +1 -1
  26. package/build/common/webRTC.d.ts +2 -1
  27. package/build/common/webRTC.d.ts.map +1 -1
  28. package/build/common/webRTC.js.map +1 -1
  29. package/build/components/FishjamRoom/GridTrackItem.d.ts +11 -0
  30. package/build/components/FishjamRoom/GridTrackItem.d.ts.map +1 -0
  31. package/build/components/FishjamRoom/GridTrackItem.js +56 -0
  32. package/build/components/FishjamRoom/GridTrackItem.js.map +1 -0
  33. package/build/components/FishjamRoom/VideosGrid.d.ts +3 -0
  34. package/build/components/FishjamRoom/VideosGrid.d.ts.map +1 -0
  35. package/build/components/FishjamRoom/VideosGrid.js +20 -0
  36. package/build/components/FishjamRoom/VideosGrid.js.map +1 -0
  37. package/build/components/FishjamRoom/index.d.ts +6 -0
  38. package/build/components/FishjamRoom/index.d.ts.map +1 -0
  39. package/build/components/FishjamRoom/index.js +29 -0
  40. package/build/components/FishjamRoom/index.js.map +1 -0
  41. package/build/components/FishjamRoom/parsePeersToTracks.d.ts +4 -0
  42. package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -0
  43. package/build/components/FishjamRoom/parsePeersToTracks.js +34 -0
  44. package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -0
  45. package/build/components/VideoRendererView.d.ts +6 -1
  46. package/build/components/VideoRendererView.d.ts.map +1 -1
  47. package/build/components/VideoRendererView.js.map +1 -1
  48. package/build/debug/stats/useRTCStatistics.d.ts.map +1 -1
  49. package/build/debug/stats/useRTCStatistics.js +13 -13
  50. package/build/debug/stats/useRTCStatistics.js.map +1 -1
  51. package/build/hooks/internal/useFishjamEvent.d.ts +3 -0
  52. package/build/hooks/internal/useFishjamEvent.d.ts.map +1 -0
  53. package/build/hooks/internal/useFishjamEvent.js +11 -0
  54. package/build/hooks/internal/useFishjamEvent.js.map +1 -0
  55. package/build/hooks/internal/useFishjamEventState.d.ts +3 -0
  56. package/build/hooks/internal/useFishjamEventState.d.ts.map +1 -0
  57. package/build/hooks/internal/useFishjamEventState.js +18 -0
  58. package/build/hooks/internal/useFishjamEventState.js.map +1 -0
  59. package/build/hooks/useAppScreenShare.d.ts.map +1 -1
  60. package/build/hooks/useAppScreenShare.js +6 -8
  61. package/build/hooks/useAppScreenShare.js.map +1 -1
  62. package/build/hooks/useAudioSettings.d.ts.map +1 -1
  63. package/build/hooks/useAudioSettings.js +8 -11
  64. package/build/hooks/useAudioSettings.js.map +1 -1
  65. package/build/hooks/useBandwidthEstimation.d.ts.map +1 -1
  66. package/build/hooks/useBandwidthEstimation.js +3 -4
  67. package/build/hooks/useBandwidthEstimation.js.map +1 -1
  68. package/build/hooks/useCamera.d.ts +6 -2
  69. package/build/hooks/useCamera.d.ts.map +1 -1
  70. package/build/hooks/useCamera.js +19 -23
  71. package/build/hooks/useCamera.js.map +1 -1
  72. package/build/hooks/useConnection.d.ts +42 -0
  73. package/build/hooks/useConnection.d.ts.map +1 -0
  74. package/build/hooks/useConnection.js +33 -0
  75. package/build/hooks/useConnection.js.map +1 -0
  76. package/build/hooks/useForegroundService.d.ts +12 -20
  77. package/build/hooks/useForegroundService.d.ts.map +1 -1
  78. package/build/hooks/useForegroundService.js +14 -4
  79. package/build/hooks/useForegroundService.js.map +1 -1
  80. package/build/hooks/useMicrophone.d.ts.map +1 -1
  81. package/build/hooks/useMicrophone.js +5 -11
  82. package/build/hooks/useMicrophone.js.map +1 -1
  83. package/build/hooks/usePeerStatus.d.ts +2 -3
  84. package/build/hooks/usePeerStatus.d.ts.map +1 -1
  85. package/build/hooks/usePeerStatus.js +4 -10
  86. package/build/hooks/usePeerStatus.js.map +1 -1
  87. package/build/hooks/usePeers.d.ts +50 -11
  88. package/build/hooks/usePeers.d.ts.map +1 -1
  89. package/build/hooks/usePeers.js +42 -18
  90. package/build/hooks/usePeers.js.map +1 -1
  91. package/build/hooks/useReconnection.d.ts +1 -1
  92. package/build/hooks/useReconnection.d.ts.map +1 -1
  93. package/build/hooks/useReconnection.js +4 -10
  94. package/build/hooks/useReconnection.js.map +1 -1
  95. package/build/hooks/useScreenShare.d.ts.map +1 -1
  96. package/build/hooks/useScreenShare.js +11 -16
  97. package/build/hooks/useScreenShare.js.map +1 -1
  98. package/build/hooks/useUpdatePeerMetadata.d.ts +15 -0
  99. package/build/hooks/useUpdatePeerMetadata.d.ts.map +1 -0
  100. package/build/hooks/useUpdatePeerMetadata.js +21 -0
  101. package/build/hooks/useUpdatePeerMetadata.js.map +1 -0
  102. package/build/index.d.ts +24 -16
  103. package/build/index.d.ts.map +1 -1
  104. package/build/index.js +18 -6
  105. package/build/index.js.map +1 -1
  106. package/build/types.d.ts +1 -1
  107. package/build/types.d.ts.map +1 -1
  108. package/build/types.js.map +1 -1
  109. package/build/utils/errorListener.d.ts.map +1 -1
  110. package/build/utils/errorListener.js +3 -4
  111. package/build/utils/errorListener.js.map +1 -1
  112. package/ios/Events.swift +94 -19
  113. package/ios/RNFishjamClient.podspec +1 -1
  114. package/ios/RNFishjamClient.swift +84 -114
  115. package/ios/RNFishjamClientModule.swift +14 -10
  116. package/ios/Utils.swift +0 -20
  117. package/ios/VideoPreviewView.swift +13 -13
  118. package/ios/VideoRendererView.swift +28 -25
  119. package/ios/VideoRendererViewModule.swift +8 -4
  120. package/ios/extensions/AVCaptureDevice.swift +20 -0
  121. package/package.json +11 -14
  122. package/plugin/build/withFishjamAndroid.js +18 -20
  123. package/plugin/build/withFishjamIos.js +99 -103
  124. package/build/hooks/useFishjamEvent.d.ts +0 -18
  125. package/build/hooks/useFishjamEvent.d.ts.map +0 -1
  126. package/build/hooks/useFishjamEvent.js +0 -27
  127. package/build/hooks/useFishjamEvent.js.map +0 -1
@@ -2,7 +2,7 @@ import { GenericMetadata } from '../types';
2
2
  /**
3
3
  * Updates metadata send to other peers
4
4
  * @param peerMetadata string indexed record with metadata, that will be available to all other peers
5
- * @category Connection
5
+ * @deprecated
6
6
  */
7
7
  export declare function updatePeerMetadata<PeerMetadata extends GenericMetadata = GenericMetadata>(peerMetadata: PeerMetadata): Promise<void>;
8
8
  //# sourceMappingURL=metadata.d.ts.map
@@ -2,7 +2,7 @@ import RNFishjamClientModule from '../RNFishjamClientModule';
2
2
  /**
3
3
  * Updates metadata send to other peers
4
4
  * @param peerMetadata string indexed record with metadata, that will be available to all other peers
5
- * @category Connection
5
+ * @deprecated
6
6
  */
7
7
  export async function updatePeerMetadata(peerMetadata) {
8
8
  await RNFishjamClientModule.updatePeerMetadata(peerMetadata);
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAEtC,YAA0B;IAC1B,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\n/**\n * Updates metadata send to other peers\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @category Connection\n */\nexport async function updatePeerMetadata<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(peerMetadata: PeerMetadata) {\n await RNFishjamClientModule.updatePeerMetadata(peerMetadata);\n}\n"]}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAEtC,YAA0B;IAC1B,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\n/**\n * Updates metadata send to other peers\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @deprecated\n */\nexport async function updatePeerMetadata<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(peerMetadata: PeerMetadata) {\n await RNFishjamClientModule.updatePeerMetadata(peerMetadata);\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { TrackEncoding } from '../types';
2
+ import type { TrackId } from '../hooks/usePeers';
2
3
  /**
3
4
  * sets track encoding that server should send to the client library.
4
5
  * The encoding will be sent whenever it is available. If chooses encoding is
@@ -9,5 +10,5 @@ import { TrackEncoding } from '../types';
9
10
  * @param encoding encoding to select
10
11
  * @category Debugging
11
12
  */
12
- export declare function setTargetTrackEncoding(trackId: string, encoding: TrackEncoding): Promise<void>;
13
+ export declare function setTargetTrackEncoding(trackId: TrackId, encoding: TrackEncoding): Promise<void>;
13
14
  //# sourceMappingURL=webRTC.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webRTC.d.ts","sourceRoot":"","sources":["../../src/common/webRTC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,iBAGxB"}
1
+ {"version":3,"file":"webRTC.d.ts","sourceRoot":"","sources":["../../src/common/webRTC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,iBAGxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"webRTC.js","sourceRoot":"","sources":["../../src/common/webRTC.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,QAAuB;IAEvB,MAAM,qBAAqB,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import { TrackEncoding } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\n/**\n * sets track encoding that server should send to the client library.\n * The encoding will be sent whenever it is available. If chooses encoding is\n * temporarily unavailable, some other encoding will be sent until choose encoding\n * becomes active again.\n *\n * @param trackId id of a track which encoding you want to select\n * @param encoding encoding to select\n * @category Debugging\n */\nexport async function setTargetTrackEncoding(\n trackId: string,\n encoding: TrackEncoding,\n) {\n await RNFishjamClientModule.setTargetTrackEncoding(trackId, encoding);\n}\n"]}
1
+ {"version":3,"file":"webRTC.js","sourceRoot":"","sources":["../../src/common/webRTC.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAG7D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAgB,EAChB,QAAuB;IAEvB,MAAM,qBAAqB,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import { TrackEncoding } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\nimport type { TrackId } from '../hooks/usePeers';\n\n/**\n * sets track encoding that server should send to the client library.\n * The encoding will be sent whenever it is available. If chooses encoding is\n * temporarily unavailable, some other encoding will be sent until choose encoding\n * becomes active again.\n *\n * @param trackId id of a track which encoding you want to select\n * @param encoding encoding to select\n * @category Debugging\n */\nexport async function setTargetTrackEncoding(\n trackId: TrackId,\n encoding: TrackEncoding,\n) {\n await RNFishjamClientModule.setTargetTrackEncoding(trackId, encoding);\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { Track } from '../../hooks/usePeers';
2
+ export type GridTrack = {
3
+ track: Track | null;
4
+ peerId: string;
5
+ isLocal: boolean;
6
+ isVadActive: boolean;
7
+ };
8
+ export declare const GridTrackItem: ({ peer }: {
9
+ peer: GridTrack;
10
+ }) => import("react").JSX.Element;
11
+ //# sourceMappingURL=GridTrackItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridTrackItem.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,aAAa,aAAc;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,gCAiC1D,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { useMemo } from 'react';
2
+ import { View, StyleSheet, Text } from 'react-native';
3
+ import { VideoRendererView } from '../VideoRendererView';
4
+ export const GridTrackItem = ({ peer }) => {
5
+ const videoContainer = useMemo(() => [
6
+ styles.video,
7
+ {
8
+ backgroundColor: peer.isLocal ? '#606619' : '#7089DB',
9
+ },
10
+ ], [peer.isLocal]);
11
+ return (<View style={styles.container}>
12
+ <View style={videoContainer}>
13
+ {peer.track ? (<VideoRendererView trackId={peer.track.id} videoLayout="FIT" style={styles.videoContent}/>) : (<View style={styles.videoContent}>
14
+ <Text>No video</Text>
15
+ </View>)}
16
+ {peer.isVadActive && (<View style={styles.vadIcon}>
17
+ <Text>{'speaking'}</Text>
18
+ </View>)}
19
+ </View>
20
+ </View>);
21
+ };
22
+ const styles = StyleSheet.create({
23
+ container: {
24
+ flex: 1,
25
+ marginBottom: 10,
26
+ },
27
+ videoContent: {
28
+ flex: 1,
29
+ alignItems: 'center',
30
+ justifyContent: 'center',
31
+ },
32
+ video: {
33
+ flex: 1,
34
+ aspectRatio: 1,
35
+ borderRadius: 8,
36
+ overflow: 'hidden',
37
+ borderColor: '#001A72',
38
+ borderWidth: 2,
39
+ },
40
+ vadIcon: {
41
+ position: 'absolute',
42
+ top: 10,
43
+ right: 10,
44
+ opacity: 0.5,
45
+ },
46
+ userLabel: {
47
+ position: 'absolute',
48
+ bottom: 10,
49
+ right: 10,
50
+ opacity: 0.5,
51
+ backgroundColor: '#F5F7FE',
52
+ borderRadius: 4,
53
+ padding: 3,
54
+ },
55
+ });
56
+ //# sourceMappingURL=GridTrackItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridTrackItem.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAUzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAuB,EAAE,EAAE;IAC7D,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC;QACJ,MAAM,CAAC,KAAK;QACZ;YACE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACtD;KACF,EACD,CAAC,IAAI,CAAC,OAAO,CAAC,CACf,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAC1B;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACZ,CAAC,iBAAiB,CAChB,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CACvB,WAAW,CAAC,KAAK,CACjB,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAC3B,CACH,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;YAAA,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CACtB;UAAA,EAAE,IAAI,CAAC,CACR,CACD;QAAA,CAAC,IAAI,CAAC,WAAW,IAAI,CACnB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC1B;YAAA,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAC1B;UAAA,EAAE,IAAI,CAAC,CACR,CACH;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,YAAY,EAAE,EAAE;KACjB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC;QACP,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,CAAC;KACf;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,GAAG;KACb;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;KACX;CACF,CAAC,CAAC","sourcesContent":["import { useMemo } from 'react';\nimport { View, StyleSheet, Text } from 'react-native';\nimport { VideoRendererView } from '../VideoRendererView';\nimport { Track } from '../../hooks/usePeers';\n\nexport type GridTrack = {\n track: Track | null;\n peerId: string;\n isLocal: boolean;\n isVadActive: boolean;\n};\n\nexport const GridTrackItem = ({ peer }: { peer: GridTrack }) => {\n const videoContainer = useMemo(\n () => [\n styles.video,\n {\n backgroundColor: peer.isLocal ? '#606619' : '#7089DB',\n },\n ],\n [peer.isLocal],\n );\n\n return (\n <View style={styles.container}>\n <View style={videoContainer}>\n {peer.track ? (\n <VideoRendererView\n trackId={peer.track.id}\n videoLayout=\"FIT\"\n style={styles.videoContent}\n />\n ) : (\n <View style={styles.videoContent}>\n <Text>No video</Text>\n </View>\n )}\n {peer.isVadActive && (\n <View style={styles.vadIcon}>\n <Text>{'speaking'}</Text>\n </View>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n marginBottom: 10,\n },\n videoContent: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n video: {\n flex: 1,\n aspectRatio: 1,\n borderRadius: 8,\n overflow: 'hidden',\n borderColor: '#001A72',\n borderWidth: 2,\n },\n vadIcon: {\n position: 'absolute',\n top: 10,\n right: 10,\n opacity: 0.5,\n },\n userLabel: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n opacity: 0.5,\n backgroundColor: '#F5F7FE',\n borderRadius: 4,\n padding: 3,\n },\n});\n"]}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const VideosGrid: () => React.JSX.Element;
3
+ //# sourceMappingURL=VideosGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideosGrid.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/VideosGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAO3C,eAAO,MAAM,UAAU,yBAkBtB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React, { useCallback } from 'react';
2
+ import { FlatList, StyleSheet } from 'react-native';
3
+ import { GridTrackItem } from './GridTrackItem';
4
+ import { parsePeersToTracks } from './parsePeersToTracks';
5
+ import { usePeers } from '../../hooks/usePeers';
6
+ export const VideosGrid = () => {
7
+ const { localPeer, remotePeers } = usePeers();
8
+ const videoTracks = parsePeersToTracks(localPeer, remotePeers);
9
+ const keyExtractor = useCallback((item) => item.peerId, []);
10
+ const renderItem = useCallback(({ item }) => <GridTrackItem peer={item}/>, []);
11
+ return (<FlatList data={videoTracks} keyExtractor={keyExtractor} renderItem={renderItem} contentContainerStyle={styles.contentContainerStyle}/>);
12
+ };
13
+ const styles = StyleSheet.create({
14
+ contentContainerStyle: {
15
+ justifyContent: 'center',
16
+ paddingHorizontal: 10,
17
+ paddingVertical: 40,
18
+ },
19
+ });
20
+ //# sourceMappingURL=VideosGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideosGrid.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/VideosGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAsB,UAAU,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAa,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE/D,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,EAAE,IAAI,EAAiC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAG,EAC1E,EAAE,CACH,CAAC;IAEF,OAAO,CACL,CAAC,QAAQ,CACP,IAAI,CAAC,CAAC,WAAW,CAAC,CAClB,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,qBAAqB,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,EACpD,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,qBAAqB,EAAE;QACrB,cAAc,EAAE,QAAQ;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;KACpB;CACF,CAAC,CAAC","sourcesContent":["import React, { useCallback } from 'react';\nimport { FlatList, ListRenderItemInfo, StyleSheet } from 'react-native';\n\nimport { GridTrack, GridTrackItem } from './GridTrackItem';\nimport { parsePeersToTracks } from './parsePeersToTracks';\nimport { usePeers } from '../../hooks/usePeers';\n\nexport const VideosGrid = () => {\n const { localPeer, remotePeers } = usePeers();\n const videoTracks = parsePeersToTracks(localPeer, remotePeers);\n\n const keyExtractor = useCallback((item: GridTrack) => item.peerId, []);\n const renderItem = useCallback(\n ({ item }: ListRenderItemInfo<GridTrack>) => <GridTrackItem peer={item} />,\n [],\n );\n\n return (\n <FlatList<GridTrack>\n data={videoTracks}\n keyExtractor={keyExtractor}\n renderItem={renderItem}\n contentContainerStyle={styles.contentContainerStyle}\n />\n );\n};\n\nconst styles = StyleSheet.create({\n contentContainerStyle: {\n justifyContent: 'center',\n paddingHorizontal: 10,\n paddingVertical: 40,\n },\n});\n"]}
@@ -0,0 +1,6 @@
1
+ export type FishjamRoomProps = {
2
+ fishjamUrl: string;
3
+ peerToken: string;
4
+ };
5
+ export declare const FishjamRoom: ({ fishjamUrl, peerToken }: FishjamRoomProps) => import("react").JSX.Element;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/index.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,WAAW,8BAA+B,gBAAgB,gCA0BtE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { useEffect } from 'react';
2
+ import { joinRoom, leaveRoom } from '../../common/client';
3
+ import { useCamera } from '../../hooks/useCamera';
4
+ import { VideosGrid } from './VideosGrid';
5
+ import { SafeAreaView } from 'react-native';
6
+ export const FishjamRoom = ({ fishjamUrl, peerToken }) => {
7
+ const { prepareCamera } = useCamera();
8
+ useEffect(() => {
9
+ const join = async () => {
10
+ await prepareCamera({
11
+ simulcastEnabled: false,
12
+ quality: 'HD169',
13
+ cameraEnabled: true,
14
+ });
15
+ await joinRoom(fishjamUrl, peerToken, {
16
+ peer: {},
17
+ server: {},
18
+ });
19
+ };
20
+ join();
21
+ return () => {
22
+ leaveRoom();
23
+ };
24
+ }, [fishjamUrl, peerToken, prepareCamera]);
25
+ return (<SafeAreaView>
26
+ <VideosGrid />
27
+ </SafeAreaView>);
28
+ };
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,UAAU,EAAE,SAAS,EAAoB,EAAE,EAAE;IACzE,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,aAAa,CAAC;gBAClB,gBAAgB,EAAE,KAAK;gBACvB,OAAO,EAAE,OAAO;gBAChB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE;gBACpC,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QACP,OAAO,GAAG,EAAE;YACV,SAAS,EAAE,CAAC;QACd,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3C,OAAO,CACL,CAAC,YAAY,CACX;MAAA,CAAC,UAAU,CAAC,AAAD,EACb;IAAA,EAAE,YAAY,CAAC,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useEffect } from 'react';\nimport { joinRoom, leaveRoom } from '../../common/client';\nimport { useCamera } from '../../hooks/useCamera';\nimport { VideosGrid } from './VideosGrid';\nimport { SafeAreaView } from 'react-native';\n\nexport type FishjamRoomProps = {\n fishjamUrl: string;\n peerToken: string;\n};\n\nexport const FishjamRoom = ({ fishjamUrl, peerToken }: FishjamRoomProps) => {\n const { prepareCamera } = useCamera();\n\n useEffect(() => {\n const join = async () => {\n await prepareCamera({\n simulcastEnabled: false,\n quality: 'HD169',\n cameraEnabled: true,\n });\n await joinRoom(fishjamUrl, peerToken, {\n peer: {},\n server: {},\n });\n };\n join();\n return () => {\n leaveRoom();\n };\n }, [fishjamUrl, peerToken, prepareCamera]);\n\n return (\n <SafeAreaView>\n <VideosGrid />\n </SafeAreaView>\n );\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { PeerWithTracks } from '../../hooks/usePeers';
2
+ import { GridTrack } from './GridTrackItem';
3
+ export declare const parsePeersToTracks: (localPeer: PeerWithTracks | null, remotePeers: PeerWithTracks[]) => GridTrack[];
4
+ //# sourceMappingURL=parsePeersToTracks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePeersToTracks.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAqC5C,eAAO,MAAM,kBAAkB,cAClB,cAAc,GAAG,IAAI,eACnB,cAAc,EAAE,KAC5B,SAAS,EAGX,CAAC"}
@@ -0,0 +1,34 @@
1
+ const createGridTracksFromPeer = (peer) => {
2
+ const tracks = [];
3
+ if (peer.cameraTrack && peer.cameraTrack.isActive) {
4
+ tracks.push({
5
+ track: peer.cameraTrack,
6
+ peerId: peer.id,
7
+ isLocal: peer.isLocal,
8
+ isVadActive: peer.microphoneTrack?.vadStatus === 'speech',
9
+ });
10
+ }
11
+ if (peer.screenShareVideoTrack && peer.screenShareVideoTrack.isActive) {
12
+ tracks.push({
13
+ track: peer.screenShareVideoTrack,
14
+ peerId: peer.id,
15
+ isLocal: peer.isLocal,
16
+ isVadActive: peer.screenShareAudioTrack?.vadStatus === 'speech',
17
+ });
18
+ }
19
+ if (tracks.length === 0) {
20
+ tracks.push({
21
+ track: null,
22
+ peerId: peer.id,
23
+ isLocal: peer.isLocal,
24
+ isVadActive: peer.microphoneTrack?.vadStatus === 'speech' ||
25
+ peer.screenShareAudioTrack?.vadStatus === 'speech',
26
+ });
27
+ }
28
+ return tracks;
29
+ };
30
+ export const parsePeersToTracks = (localPeer, remotePeers) => [
31
+ ...(localPeer ? createGridTracksFromPeer(localPeer) : []),
32
+ ...remotePeers.flatMap(createGridTracksFromPeer),
33
+ ];
34
+ //# sourceMappingURL=parsePeersToTracks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsePeersToTracks.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAGA,MAAM,wBAAwB,GAAG,CAAC,IAAoB,EAAe,EAAE;IACrE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,KAAK,QAAQ;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,qBAAqB;YACjC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,KAAK,QAAQ;SAChE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EACT,IAAI,CAAC,eAAe,EAAE,SAAS,KAAK,QAAQ;gBAC5C,IAAI,CAAC,qBAAqB,EAAE,SAAS,KAAK,QAAQ;SACrD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAgC,EAChC,WAA6B,EAChB,EAAE,CAAC;IAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,GAAG,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC;CACjD,CAAC","sourcesContent":["import { PeerWithTracks } from '../../hooks/usePeers';\nimport { GridTrack } from './GridTrackItem';\n\nconst createGridTracksFromPeer = (peer: PeerWithTracks): GridTrack[] => {\n const tracks: GridTrack[] = [];\n\n if (peer.cameraTrack && peer.cameraTrack.isActive) {\n tracks.push({\n track: peer.cameraTrack,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive: peer.microphoneTrack?.vadStatus === 'speech',\n });\n }\n\n if (peer.screenShareVideoTrack && peer.screenShareVideoTrack.isActive) {\n tracks.push({\n track: peer.screenShareVideoTrack,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive: peer.screenShareAudioTrack?.vadStatus === 'speech',\n });\n }\n\n if (tracks.length === 0) {\n tracks.push({\n track: null,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive:\n peer.microphoneTrack?.vadStatus === 'speech' ||\n peer.screenShareAudioTrack?.vadStatus === 'speech',\n });\n }\n\n return tracks;\n};\n\nexport const parsePeersToTracks = (\n localPeer: PeerWithTracks | null,\n remotePeers: PeerWithTracks[],\n): GridTrack[] => [\n ...(localPeer ? createGridTracksFromPeer(localPeer) : []),\n ...remotePeers.flatMap(createGridTracksFromPeer),\n];\n"]}
@@ -1,16 +1,21 @@
1
1
  import * as React from 'react';
2
2
  import { ViewStyle } from 'react-native';
3
3
  import { VideoLayout } from '../types';
4
+ import type { TrackId } from '../hooks/usePeers';
4
5
  export type VideoRendererProps = {
5
6
  /**
6
7
  * id of the video track which you want to render.
7
8
  */
8
- trackId: string;
9
+ trackId: TrackId;
9
10
  /**
10
11
  * Video layout inside of the component
11
12
  * @default `FILL`
12
13
  */
13
14
  videoLayout?: VideoLayout;
15
+ /**
16
+ * Whether the video should be rendered if it's off screen or hidden.
17
+ */
18
+ skipRenderOutsideVisibleArea?: boolean;
14
19
  style?: ViewStyle;
15
20
  };
16
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"VideoRendererView.d.ts","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oHAM5B,CAAC"}
1
+ {"version":3,"file":"VideoRendererView.d.ts","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oHAM5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VideoRendererView.js","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,MAAM,UAAU,GACd,wBAAwB,CAAC,yBAAyB,CAAC,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAG/C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAChB,gDAAgD;AAChD,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAG,CACpC,CAAC,CAAC","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { ViewStyle } from 'react-native';\n\nimport { VideoLayout } from '../types';\n\nexport type VideoRendererProps = {\n /**\n * id of the video track which you want to render.\n */\n trackId: string;\n /**\n * Video layout inside of the component\n * @default `FILL`\n */\n videoLayout?: VideoLayout;\n style?: ViewStyle;\n};\n\nconst NativeView: React.ComponentType<VideoRendererProps> =\n requireNativeViewManager('VideoRendererViewModule');\n\n/**\n * Render video track received from {@link usePeers} hook\n * @category Components\n */\nexport const VideoRendererView = React.forwardRef<\n React.ComponentType<VideoRendererProps>,\n VideoRendererProps\n>((props, ref) => (\n // @ts-expect-error ref prop needs to be updated\n <NativeView {...props} ref={ref} />\n));\n"]}
1
+ {"version":3,"file":"VideoRendererView.js","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuB/B,MAAM,UAAU,GACd,wBAAwB,CAAC,yBAAyB,CAAC,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAG/C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAChB,gDAAgD;AAChD,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAG,CACpC,CAAC,CAAC","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { ViewStyle } from 'react-native';\n\nimport { VideoLayout } from '../types';\nimport type { TrackId } from '../hooks/usePeers';\n\nexport type VideoRendererProps = {\n /**\n * id of the video track which you want to render.\n */\n trackId: TrackId;\n /**\n * Video layout inside of the component\n * @default `FILL`\n */\n videoLayout?: VideoLayout;\n /**\n * Whether the video should be rendered if it's off screen or hidden.\n */\n skipRenderOutsideVisibleArea?: boolean;\n style?: ViewStyle;\n};\n\nconst NativeView: React.ComponentType<VideoRendererProps> =\n requireNativeViewManager('VideoRendererViewModule');\n\n/**\n * Render video track received from {@link usePeers} hook\n * @category Components\n */\nexport const VideoRendererView = React.forwardRef<\n React.ComponentType<VideoRendererProps>,\n VideoRendererProps\n>((props, ref) => (\n // @ts-expect-error ref prop needs to be updated\n <NativeView {...props} ref={ref} />\n));\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useRTCStatistics.d.ts","sourceRoot":"","sources":["../../../src/debug/stats/useRTCStatistics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqC,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM;;EAuFvD"}
1
+ {"version":3,"file":"useRTCStatistics.d.ts","sourceRoot":"","sources":["../../../src/debug/stats/useRTCStatistics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqC,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM;;EAqFvD"}
@@ -10,13 +10,13 @@ export function useRTCStatistics(refreshInterval) {
10
10
  const [statistics, setStatistics] = useState([]);
11
11
  // Calculates diff between pervious and current stats,
12
12
  // providing end users with a per second metric.
13
- const processIncomingStats = useCallback((statistics, stats) => {
14
- Object.keys(stats).forEach((obj) => {
13
+ const processIncomingStats = useCallback((stats, stat) => {
14
+ Object.keys(stat).forEach((obj) => {
15
15
  if (obj.includes('Inbound')) {
16
- const rtcStats = stats[obj];
17
- if (statistics.length > 0 &&
18
- Object.keys(statistics[statistics.length - 1]).includes(obj)) {
19
- const prevRtcStats = statistics[statistics.length - 1][obj];
16
+ const rtcStats = stat[obj];
17
+ if (stats.length > 0 &&
18
+ Object.keys(stats[stats.length - 1]).includes(obj)) {
19
+ const prevRtcStats = stats[stats.length - 1][obj];
20
20
  rtcStats['packetsLost/s'] =
21
21
  rtcStats['packetsLost'] - prevRtcStats['packetsLost'];
22
22
  rtcStats['packetsReceived/s'] =
@@ -35,13 +35,13 @@ export function useRTCStatistics(refreshInterval) {
35
35
  rtcStats['framesReceived/s'] = 0;
36
36
  rtcStats['framesDropped/s'] = 0;
37
37
  }
38
- return stats;
38
+ return stat;
39
39
  }
40
40
  // Outbound
41
- const rtcStats = stats[obj];
42
- if (statistics.length > 0 &&
43
- Object.keys(statistics[statistics.length - 1]).includes(obj)) {
44
- const prevRtcStats = statistics[statistics.length - 1][obj];
41
+ const rtcStats = stat[obj];
42
+ if (stats.length > 0 &&
43
+ Object.keys(stats[stats.length - 1]).includes(obj)) {
44
+ const prevRtcStats = stats[stats.length - 1][obj];
45
45
  rtcStats['bytesSent/s'] =
46
46
  rtcStats['bytesSent'] - prevRtcStats['bytesSent'];
47
47
  rtcStats['packetsSent/s'] =
@@ -54,9 +54,9 @@ export function useRTCStatistics(refreshInterval) {
54
54
  rtcStats['packetsSent/s'] = 0;
55
55
  rtcStats['framesEncoded/s'] = 0;
56
56
  }
57
- return stats;
57
+ return stat;
58
58
  });
59
- return stats;
59
+ return stat;
60
60
  }, []);
61
61
  // Gets stats from the native libraries.
62
62
  const getStatistics = useCallback(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useRTCStatistics.js","sourceRoot":"","sources":["../../../src/debug/stats/useRTCStatistics.ts"],"names":[],"mappings":"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","sourcesContent":["import { takeRight } from 'lodash';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { RTCInboundStats, RTCOutboundStats, RTCStats } from './types';\nimport RNFishjamClientModule from '../../RNFishjamClientModule';\n\n/**\n * This hook provides access to current rtc statistics data.\n * @category Debugging\n */\nexport function useRTCStatistics(refreshInterval: number) {\n const MAX_SIZE = 120;\n const [statistics, setStatistics] = useState<RTCStats[]>([]);\n\n // Calculates diff between pervious and current stats,\n // providing end users with a per second metric.\n const processIncomingStats = useCallback(\n (statistics: ReadonlyArray<RTCStats>, stats: Readonly<RTCStats>) => {\n Object.keys(stats).forEach((obj) => {\n if (obj.includes('Inbound')) {\n const rtcStats = stats[obj] as RTCInboundStats;\n\n if (\n statistics.length > 0 &&\n Object.keys(statistics[statistics.length - 1]).includes(obj)\n ) {\n const prevRtcStats = statistics[statistics.length - 1][\n obj\n ] as RTCInboundStats;\n\n rtcStats['packetsLost/s'] =\n rtcStats['packetsLost'] - prevRtcStats['packetsLost'];\n rtcStats['packetsReceived/s'] =\n rtcStats['packetsReceived'] - prevRtcStats['packetsReceived'];\n rtcStats['bytesReceived/s'] =\n rtcStats['bytesReceived'] - prevRtcStats['bytesReceived'];\n rtcStats['framesReceived/s'] =\n rtcStats['framesReceived'] - prevRtcStats['framesReceived'];\n rtcStats['framesDropped/s'] =\n rtcStats['framesDropped'] - prevRtcStats['framesDropped'];\n } else {\n rtcStats['packetsLost/s'] = 0;\n rtcStats['packetsReceived/s'] = 0;\n rtcStats['bytesReceived/s'] = 0;\n rtcStats['framesReceived/s'] = 0;\n rtcStats['framesDropped/s'] = 0;\n }\n return stats;\n }\n // Outbound\n const rtcStats = stats[obj] as RTCOutboundStats;\n\n if (\n statistics.length > 0 &&\n Object.keys(statistics[statistics.length - 1]).includes(obj)\n ) {\n const prevRtcStats = statistics[statistics.length - 1][\n obj\n ] as RTCOutboundStats;\n\n rtcStats['bytesSent/s'] =\n rtcStats['bytesSent'] - prevRtcStats['bytesSent'];\n rtcStats['packetsSent/s'] =\n rtcStats['packetsSent'] - prevRtcStats['packetsSent'];\n rtcStats['framesEncoded/s'] =\n rtcStats['framesEncoded'] - prevRtcStats['framesEncoded'];\n } else {\n rtcStats['bytesSent/s'] = 0;\n rtcStats['packetsSent/s'] = 0;\n rtcStats['framesEncoded/s'] = 0;\n }\n return stats;\n });\n return stats;\n },\n [],\n );\n\n // Gets stats from the native libraries.\n const getStatistics = useCallback(async () => {\n const stats = await RNFishjamClientModule.getStatistics();\n setStatistics((prev) => {\n const newStats = [...prev, processIncomingStats(prev, stats)];\n takeRight(newStats, MAX_SIZE);\n return newStats;\n });\n }, [processIncomingStats]);\n\n useEffect(() => {\n const intervalId = setInterval(getStatistics, refreshInterval);\n return () => {\n clearInterval(intervalId);\n setStatistics([]);\n };\n }, [getStatistics, refreshInterval]);\n\n return { statistics };\n}\n"]}
1
+ {"version":3,"file":"useRTCStatistics.js","sourceRoot":"","sources":["../../../src/debug/stats/useRTCStatistics.ts"],"names":[],"mappings":"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","sourcesContent":["import { takeRight } from 'lodash';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { RTCInboundStats, RTCOutboundStats, RTCStats } from './types';\nimport RNFishjamClientModule from '../../RNFishjamClientModule';\n\n/**\n * This hook provides access to current rtc statistics data.\n * @category Debugging\n */\nexport function useRTCStatistics(refreshInterval: number) {\n const MAX_SIZE = 120;\n const [statistics, setStatistics] = useState<RTCStats[]>([]);\n\n // Calculates diff between pervious and current stats,\n // providing end users with a per second metric.\n const processIncomingStats = useCallback(\n (stats: ReadonlyArray<RTCStats>, stat: Readonly<RTCStats>) => {\n Object.keys(stat).forEach((obj) => {\n if (obj.includes('Inbound')) {\n const rtcStats = stat[obj] as RTCInboundStats;\n\n if (\n stats.length > 0 &&\n Object.keys(stats[stats.length - 1]).includes(obj)\n ) {\n const prevRtcStats = stats[stats.length - 1][\n obj\n ] as RTCInboundStats;\n\n rtcStats['packetsLost/s'] =\n rtcStats['packetsLost'] - prevRtcStats['packetsLost'];\n rtcStats['packetsReceived/s'] =\n rtcStats['packetsReceived'] - prevRtcStats['packetsReceived'];\n rtcStats['bytesReceived/s'] =\n rtcStats['bytesReceived'] - prevRtcStats['bytesReceived'];\n rtcStats['framesReceived/s'] =\n rtcStats['framesReceived'] - prevRtcStats['framesReceived'];\n rtcStats['framesDropped/s'] =\n rtcStats['framesDropped'] - prevRtcStats['framesDropped'];\n } else {\n rtcStats['packetsLost/s'] = 0;\n rtcStats['packetsReceived/s'] = 0;\n rtcStats['bytesReceived/s'] = 0;\n rtcStats['framesReceived/s'] = 0;\n rtcStats['framesDropped/s'] = 0;\n }\n return stat;\n }\n // Outbound\n const rtcStats = stat[obj] as RTCOutboundStats;\n\n if (\n stats.length > 0 &&\n Object.keys(stats[stats.length - 1]).includes(obj)\n ) {\n const prevRtcStats = stats[stats.length - 1][obj] as RTCOutboundStats;\n\n rtcStats['bytesSent/s'] =\n rtcStats['bytesSent'] - prevRtcStats['bytesSent'];\n rtcStats['packetsSent/s'] =\n rtcStats['packetsSent'] - prevRtcStats['packetsSent'];\n rtcStats['framesEncoded/s'] =\n rtcStats['framesEncoded'] - prevRtcStats['framesEncoded'];\n } else {\n rtcStats['bytesSent/s'] = 0;\n rtcStats['packetsSent/s'] = 0;\n rtcStats['framesEncoded/s'] = 0;\n }\n return stat;\n });\n return stat;\n },\n [],\n );\n\n // Gets stats from the native libraries.\n const getStatistics = useCallback(async () => {\n const stats = await RNFishjamClientModule.getStatistics();\n setStatistics((prev) => {\n const newStats = [...prev, processIncomingStats(prev, stats)];\n takeRight(newStats, MAX_SIZE);\n return newStats;\n });\n }, [processIncomingStats]);\n\n useEffect(() => {\n const intervalId = setInterval(getStatistics, refreshInterval);\n return () => {\n clearInterval(intervalId);\n setStatistics([]);\n };\n }, [getStatistics, refreshInterval]);\n\n return { statistics };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { ReceivableEvents } from '../../RNFishjamClientModule';
2
+ export declare function useFishjamEvent<T>(eventName: keyof typeof ReceivableEvents, callback: (event: T) => void): void;
3
+ //# sourceMappingURL=useFishjamEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFishjamEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamEvent.ts"],"names":[],"mappings":"AACA,OAAqB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,wBAAgB,eAAe,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,gBAAgB,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,QAQ7B"}
@@ -0,0 +1,11 @@
1
+ import { useEffect } from 'react';
2
+ import nativeModule from '../../RNFishjamClientModule';
3
+ export function useFishjamEvent(eventName, callback) {
4
+ useEffect(() => {
5
+ const eventListener = nativeModule.addListener(eventName, (event) => {
6
+ callback(event[eventName]);
7
+ });
8
+ return () => eventListener.remove();
9
+ }, [callback, eventName]);
10
+ }
11
+ //# sourceMappingURL=useFishjamEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFishjamEvent.js","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,YAAkC,MAAM,6BAA6B,CAAC;AAE7E,MAAM,UAAU,eAAe,CAC7B,SAAwC,EACxC,QAA4B;IAE5B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAClE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5B,CAAC","sourcesContent":["import { useEffect } from 'react';\nimport nativeModule, { ReceivableEvents } from '../../RNFishjamClientModule';\n\nexport function useFishjamEvent<T>(\n eventName: keyof typeof ReceivableEvents,\n callback: (event: T) => void,\n) {\n useEffect(() => {\n const eventListener = nativeModule.addListener(eventName, (event) => {\n callback(event[eventName]);\n });\n return () => eventListener.remove();\n }, [callback, eventName]);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { ReceivableEvents } from '../../RNFishjamClientModule';
2
+ export declare function useFishjamEventState<EventType, StateType = EventType>(eventName: keyof typeof ReceivableEvents, defaultValue: EventType, transform?: (eventValue: EventType) => StateType): StateType;
3
+ //# sourceMappingURL=useFishjamEventState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFishjamEventState.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamEventState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EACnE,SAAS,EAAE,MAAM,OAAO,gBAAgB,EACxC,YAAY,EAAE,SAAS,EACvB,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,KAAK,SAAS,aAsBjD"}
@@ -0,0 +1,18 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { useFishjamEvent } from './useFishjamEvent';
3
+ export function useFishjamEventState(eventName, defaultValue, transform) {
4
+ const [value, setValue] = useState(transform
5
+ ? transform(defaultValue)
6
+ : defaultValue);
7
+ const onEvent = useCallback((newValue) => {
8
+ if (transform) {
9
+ setValue(transform(newValue));
10
+ }
11
+ else {
12
+ setValue(newValue);
13
+ }
14
+ }, [transform]);
15
+ useFishjamEvent(eventName, onEvent);
16
+ return value;
17
+ }
18
+ //# sourceMappingURL=useFishjamEventState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFishjamEventState.js","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamEventState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,UAAU,oBAAoB,CAClC,SAAwC,EACxC,YAAuB,EACvB,SAAgD;IAEhD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAChC,SAAS;QACP,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;QACzB,CAAC,CAAE,YAAqC,CAC3C,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,QAAmB,EAAE,EAAE;QACtB,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,QAAgC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { useCallback, useState } from 'react';\nimport { useFishjamEvent } from './useFishjamEvent';\nimport { ReceivableEvents } from '../../RNFishjamClientModule';\n\nexport function useFishjamEventState<EventType, StateType = EventType>(\n eventName: keyof typeof ReceivableEvents,\n defaultValue: EventType,\n transform?: (eventValue: EventType) => StateType,\n) {\n const [value, setValue] = useState<StateType>(\n transform\n ? transform(defaultValue)\n : (defaultValue as unknown as StateType),\n );\n\n const onEvent = useCallback(\n (newValue: EventType) => {\n if (transform) {\n setValue(transform(newValue));\n } else {\n setValue(newValue as unknown as StateType);\n }\n },\n [transform],\n );\n\n useFishjamEvent(eventName, onEvent);\n\n return value;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useAppScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useAppScreenShare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUtD,KAAK,kBAAkB,GAAG;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,oBAAoB,EAAE,CACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAC7C,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AA+CF,iBAAS,+BAA+B,IAAI,kBAAkB,CAM7D;AAED,eAAO,MAAM,iBAAiB,wCAG5B,CAAC"}
1
+ {"version":3,"file":"useAppScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useAppScreenShare.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWtD,KAAK,kBAAkB,GAAG;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,oBAAoB,EAAE,CACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAC7C,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AA8CF,iBAAS,+BAA+B,IAAI,kBAAkB,CAM7D;AAED,eAAO,MAAM,iBAAiB,wCAG5B,CAAC"}
@@ -1,7 +1,7 @@
1
- import { useCallback, useState } from 'react';
2
- import RNFishjamClientModule from '../RNFishjamClientModule';
3
- import { ReceivableEvents, useFishjamEvent } from './useFishjamEvent';
1
+ import { useCallback } from 'react';
2
+ import RNFishjamClientModule, { ReceivableEvents, } from '../RNFishjamClientModule';
4
3
  import { Platform } from 'react-native';
4
+ import { useFishjamEventState } from './internal/useFishjamEventState';
5
5
  const defaultSimulcastConfig = () => ({
6
6
  enabled: false,
7
7
  activeEncodings: [],
@@ -14,21 +14,19 @@ let screenShareSimulcastConfig = defaultSimulcastConfig();
14
14
  * @group Hooks
15
15
  */
16
16
  function useIosAppScreenShare() {
17
- const [isAppScreenShareOn, setIsAppScreenShareOn] = useState(RNFishjamClientModule.isAppScreenShareOn);
18
- const [simulcastConfig, setSimulcastConfig] = useState(screenShareSimulcastConfig);
19
- useFishjamEvent(ReceivableEvents.IsAppScreenShareOn, setIsAppScreenShareOn);
17
+ const isAppScreenShareOn = useFishjamEventState(ReceivableEvents.IsAppScreenShareOn, RNFishjamClientModule.isAppScreenShareOn);
18
+ const simulcastConfig = useFishjamEventState(ReceivableEvents.SimulcastConfigUpdate, screenShareSimulcastConfig);
20
19
  const toggleAppScreenShare = useCallback(async (screenShareOptions = {}) => {
21
20
  const options = {
22
21
  ...screenShareOptions,
23
22
  screenShareMetadata: {
24
23
  displayName: 'presenting',
25
- type: 'screensharing',
24
+ type: 'screenShareVideo',
26
25
  active: !isAppScreenShareOn,
27
26
  },
28
27
  };
29
28
  await RNFishjamClientModule.toggleAppScreenShare(options);
30
29
  screenShareSimulcastConfig = defaultSimulcastConfig(); //to do: sync with camera settings
31
- setSimulcastConfig(screenShareSimulcastConfig);
32
30
  }, [isAppScreenShareOn]);
33
31
  return {
34
32
  isAppScreenShareOn,
@@ -1 +1 @@
1
- {"version":3,"file":"useAppScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useAppScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,IAAI,0BAA0B,GAAoB,sBAAsB,EAAE,CAAC;AAU3E;;;;;GAKG;AACH,SAAS,oBAAoB;IAC3B,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAC1D,qBAAqB,CAAC,kBAAkB,CACzC,CAAC;IAEF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,0BAA0B,CAC3B,CAAC;IAEF,eAAe,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;IAE5E,MAAM,oBAAoB,GAAG,WAAW,CACtC,KAAK,EAAE,qBAAkD,EAAE,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG;YACd,GAAG,kBAAkB;YACrB,mBAAmB,EAAE;gBACnB,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,eAAwB;gBAC9B,MAAM,EAAE,CAAC,kBAAkB;aAC5B;SACF,CAAC;QACF,MAAM,qBAAqB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,0BAA0B,GAAG,sBAAsB,EAAE,CAAC,CAAC,kCAAkC;QACzF,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,OAAO;QACL,kBAAkB;QAClB,eAAe;QACf;;;WAGG;QACH,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B;IACtC,OAAO;QACL,kBAAkB,EAAE,KAAK;QACzB,eAAe,EAAE,sBAAsB,EAAE;QACzC,oBAAoB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/C,GAAG,EAAE,oBAAoB;IACzB,OAAO,EAAE,+BAA+B;CACzC,CAAC,CAAC","sourcesContent":["import { useCallback, useState } from 'react';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\nimport { SimulcastConfig } from '../types';\nimport { ReceivableEvents, useFishjamEvent } from './useFishjamEvent';\nimport { ScreenShareOptions } from './useScreenShare';\nimport { Platform } from 'react-native';\n\nconst defaultSimulcastConfig = () => ({\n enabled: false,\n activeEncodings: [],\n});\n\nlet screenShareSimulcastConfig: SimulcastConfig = defaultSimulcastConfig();\n\ntype AppScreenShareData = {\n isAppScreenShareOn: boolean;\n simulcastConfig: SimulcastConfig;\n toggleAppScreenShare: (\n screenShareOptions?: Partial<ScreenShareOptions>,\n ) => Promise<void>;\n};\n\n/**\n * This hook can toggle client app screen sharing on/off and provides current screen share state. It works only on iOS.\n * @returns An object with functions to manage app screen share on iOS and null on android.\n * @category Screenshare\n * @group Hooks\n */\nfunction useIosAppScreenShare(): AppScreenShareData {\n const [isAppScreenShareOn, setIsAppScreenShareOn] = useState(\n RNFishjamClientModule.isAppScreenShareOn,\n );\n\n const [simulcastConfig, setSimulcastConfig] = useState<SimulcastConfig>(\n screenShareSimulcastConfig,\n );\n\n useFishjamEvent(ReceivableEvents.IsAppScreenShareOn, setIsAppScreenShareOn);\n\n const toggleAppScreenShare = useCallback(\n async (screenShareOptions: Partial<ScreenShareOptions> = {}) => {\n const options = {\n ...screenShareOptions,\n screenShareMetadata: {\n displayName: 'presenting',\n type: 'screensharing' as const,\n active: !isAppScreenShareOn,\n },\n };\n await RNFishjamClientModule.toggleAppScreenShare(options);\n screenShareSimulcastConfig = defaultSimulcastConfig(); //to do: sync with camera settings\n setSimulcastConfig(screenShareSimulcastConfig);\n },\n [isAppScreenShareOn],\n );\n\n return {\n isAppScreenShareOn,\n simulcastConfig,\n /**\n * Toggles the screen share on/off.\n * Emits warning on ios when user is screensharing full screen.\n */\n toggleAppScreenShare,\n };\n}\n\nfunction useDefaultAppScreenShareAndroid(): AppScreenShareData {\n return {\n isAppScreenShareOn: false,\n simulcastConfig: defaultSimulcastConfig(),\n toggleAppScreenShare: async () => {},\n };\n}\n\nexport const useAppScreenShare = Platform.select({\n ios: useIosAppScreenShare,\n default: useDefaultAppScreenShareAndroid,\n});\n"]}
1
+ {"version":3,"file":"useAppScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useAppScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,qBAAqB,EAAE,EAC5B,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,IAAI,0BAA0B,GAAoB,sBAAsB,EAAE,CAAC;AAU3E;;;;;GAKG;AACH,SAAS,oBAAoB;IAC3B,MAAM,kBAAkB,GAAG,oBAAoB,CAC7C,gBAAgB,CAAC,kBAAkB,EACnC,qBAAqB,CAAC,kBAAkB,CACzC,CAAC;IAEF,MAAM,eAAe,GAAG,oBAAoB,CAC1C,gBAAgB,CAAC,qBAAqB,EACtC,0BAA0B,CAC3B,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,KAAK,EAAE,qBAAkD,EAAE,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG;YACd,GAAG,kBAAkB;YACrB,mBAAmB,EAAE;gBACnB,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,kBAA2B;gBACjC,MAAM,EAAE,CAAC,kBAAkB;aAC5B;SACF,CAAC;QACF,MAAM,qBAAqB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,0BAA0B,GAAG,sBAAsB,EAAE,CAAC,CAAC,kCAAkC;IAC3F,CAAC,EACD,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,OAAO;QACL,kBAAkB;QAClB,eAAe;QACf;;;WAGG;QACH,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B;IACtC,OAAO;QACL,kBAAkB,EAAE,KAAK;QACzB,eAAe,EAAE,sBAAsB,EAAE;QACzC,oBAAoB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/C,GAAG,EAAE,oBAAoB;IACzB,OAAO,EAAE,+BAA+B;CACzC,CAAC,CAAC","sourcesContent":["import { useCallback } from 'react';\nimport RNFishjamClientModule, {\n ReceivableEvents,\n} from '../RNFishjamClientModule';\nimport { SimulcastConfig } from '../types';\nimport { ScreenShareOptions } from './useScreenShare';\nimport { Platform } from 'react-native';\nimport { useFishjamEventState } from './internal/useFishjamEventState';\n\nconst defaultSimulcastConfig = () => ({\n enabled: false,\n activeEncodings: [],\n});\n\nlet screenShareSimulcastConfig: SimulcastConfig = defaultSimulcastConfig();\n\ntype AppScreenShareData = {\n isAppScreenShareOn: boolean;\n simulcastConfig: SimulcastConfig;\n toggleAppScreenShare: (\n screenShareOptions?: Partial<ScreenShareOptions>,\n ) => Promise<void>;\n};\n\n/**\n * This hook can toggle client app screen sharing on/off and provides current screen share state. It works only on iOS.\n * @returns An object with functions to manage app screen share on iOS and null on android.\n * @category Screenshare\n * @group Hooks\n */\nfunction useIosAppScreenShare(): AppScreenShareData {\n const isAppScreenShareOn = useFishjamEventState<boolean>(\n ReceivableEvents.IsAppScreenShareOn,\n RNFishjamClientModule.isAppScreenShareOn,\n );\n\n const simulcastConfig = useFishjamEventState<SimulcastConfig>(\n ReceivableEvents.SimulcastConfigUpdate,\n screenShareSimulcastConfig,\n );\n\n const toggleAppScreenShare = useCallback(\n async (screenShareOptions: Partial<ScreenShareOptions> = {}) => {\n const options = {\n ...screenShareOptions,\n screenShareMetadata: {\n displayName: 'presenting',\n type: 'screenShareVideo' as const,\n active: !isAppScreenShareOn,\n },\n };\n await RNFishjamClientModule.toggleAppScreenShare(options);\n screenShareSimulcastConfig = defaultSimulcastConfig(); //to do: sync with camera settings\n },\n [isAppScreenShareOn],\n );\n\n return {\n isAppScreenShareOn,\n simulcastConfig,\n /**\n * Toggles the screen share on/off.\n * Emits warning on ios when user is screensharing full screen.\n */\n toggleAppScreenShare,\n };\n}\n\nfunction useDefaultAppScreenShareAndroid(): AppScreenShareData {\n return {\n isAppScreenShareOn: false,\n simulcastConfig: defaultSimulcastConfig(),\n toggleAppScreenShare: async () => {},\n };\n}\n\nexport const useAppScreenShare = Platform.select({\n ios: useIosAppScreenShare,\n default: useDefaultAppScreenShareAndroid,\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioSettings.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,SAAS,GACT,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,gBAAgB;IAyD5B;;OAEG;;IAEH;;OAEG;;IAEH;;;OAGG;sCA5CY,qBAAqB;IA8CpC;;;;OAIG;+CArCsB,gBAAgB;IAuCzC;;;OAGG;;EAGN"}
1
+ {"version":3,"file":"useAudioSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioSettings.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,SAAS,GACT,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,gBAAgB;IAqD5B;;OAEG;;IAEH;;OAEG;;IAEH;;;OAGG;sCA5CY,qBAAqB;IA8CpC;;;;OAIG;+CArCsB,gBAAgB;IAuCzC;;;OAGG;;EAGN"}
@@ -1,20 +1,17 @@
1
- import { useCallback, useEffect, useState } from 'react';
1
+ import { useCallback, useEffect } from 'react';
2
2
  import { Platform } from 'react-native';
3
- import RNFishjamClientModule from '../RNFishjamClientModule';
4
- import { ReceivableEvents, useFishjamEvent } from './useFishjamEvent';
3
+ import RNFishjamClientModule, { ReceivableEvents, } from '../RNFishjamClientModule';
4
+ import { useFishjamEventState } from './internal/useFishjamEventState';
5
5
  /**
6
6
  * This hook manages audio settings.
7
7
  * @category Devices
8
8
  * @group Hooks
9
9
  */
10
10
  export function useAudioSettings() {
11
- const [selectedAudioOutputDevice, setSelectedAudioOutputDevice] = useState(null);
12
- const [availableDevices, setAvailableDevices] = useState([]);
13
- const onAudioDevice = useCallback((event) => {
14
- setSelectedAudioOutputDevice(event.selectedDevice);
15
- setAvailableDevices(event.availableDevices);
16
- }, []);
17
- useFishjamEvent(ReceivableEvents.AudioDeviceUpdate, onAudioDevice);
11
+ const { selectedDevice: selectedAudioOutputDevice, availableDevices } = useFishjamEventState(ReceivableEvents.AudioDeviceUpdate, {
12
+ selectedDevice: null,
13
+ availableDevices: [],
14
+ });
18
15
  useEffect(() => {
19
16
  RNFishjamClientModule.startAudioSwitcher();
20
17
  return () => {
@@ -22,7 +19,7 @@ export function useAudioSettings() {
22
19
  RNFishjamClientModule.stopAudioSwitcher();
23
20
  }
24
21
  };
25
- }, [onAudioDevice]);
22
+ }, []);
26
23
  const selectOutputAudioDevice = useCallback(async (device) => {
27
24
  if (Platform.OS === 'ios') {
28
25
  throw Error('selectOutputAudioDevice function is supported only on Android. ' +