@fishjam-cloud/react-native-client 0.4.1 → 0.5.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 (87) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +99 -14
  3. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +63 -92
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +12 -23
  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 +6 -7
  16. package/build/RNFishjamClientModule.d.ts.map +1 -1
  17. package/build/RNFishjamClientModule.js.map +1 -1
  18. package/build/common/client.d.ts +2 -1
  19. package/build/common/client.d.ts.map +1 -1
  20. package/build/common/client.js.map +1 -1
  21. package/build/common/webRTC.d.ts +2 -1
  22. package/build/common/webRTC.d.ts.map +1 -1
  23. package/build/common/webRTC.js.map +1 -1
  24. package/build/components/FishjamRoom/GridTrackItem.d.ts +11 -0
  25. package/build/components/FishjamRoom/GridTrackItem.d.ts.map +1 -0
  26. package/build/components/FishjamRoom/GridTrackItem.js +56 -0
  27. package/build/components/FishjamRoom/GridTrackItem.js.map +1 -0
  28. package/build/components/FishjamRoom/VideosGrid.d.ts +3 -0
  29. package/build/components/FishjamRoom/VideosGrid.d.ts.map +1 -0
  30. package/build/components/FishjamRoom/VideosGrid.js +20 -0
  31. package/build/components/FishjamRoom/VideosGrid.js.map +1 -0
  32. package/build/components/FishjamRoom/index.d.ts +6 -0
  33. package/build/components/FishjamRoom/index.d.ts.map +1 -0
  34. package/build/components/FishjamRoom/index.js +29 -0
  35. package/build/components/FishjamRoom/index.js.map +1 -0
  36. package/build/components/FishjamRoom/parsePeersToTracks.d.ts +4 -0
  37. package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -0
  38. package/build/components/FishjamRoom/parsePeersToTracks.js +36 -0
  39. package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -0
  40. package/build/components/VideoRendererView.d.ts +6 -1
  41. package/build/components/VideoRendererView.d.ts.map +1 -1
  42. package/build/components/VideoRendererView.js.map +1 -1
  43. package/build/hooks/useAppScreenShare.js +1 -1
  44. package/build/hooks/useAppScreenShare.js.map +1 -1
  45. package/build/hooks/useCamera.d.ts +6 -2
  46. package/build/hooks/useCamera.d.ts.map +1 -1
  47. package/build/hooks/useCamera.js +14 -17
  48. package/build/hooks/useCamera.js.map +1 -1
  49. package/build/hooks/useFishjamEvent.d.ts +1 -1
  50. package/build/hooks/useFishjamEvent.js +1 -1
  51. package/build/hooks/useFishjamEvent.js.map +1 -1
  52. package/build/hooks/useFishjamEventState.d.ts +3 -0
  53. package/build/hooks/useFishjamEventState.d.ts.map +1 -0
  54. package/build/hooks/useFishjamEventState.js +16 -0
  55. package/build/hooks/useFishjamEventState.js.map +1 -0
  56. package/build/hooks/useForegroundService.d.ts +12 -20
  57. package/build/hooks/useForegroundService.d.ts.map +1 -1
  58. package/build/hooks/useForegroundService.js +14 -4
  59. package/build/hooks/useForegroundService.js.map +1 -1
  60. package/build/hooks/useMicrophone.d.ts.map +1 -1
  61. package/build/hooks/useMicrophone.js +5 -10
  62. package/build/hooks/useMicrophone.js.map +1 -1
  63. package/build/hooks/usePeers.d.ts +50 -11
  64. package/build/hooks/usePeers.d.ts.map +1 -1
  65. package/build/hooks/usePeers.js +41 -6
  66. package/build/hooks/usePeers.js.map +1 -1
  67. package/build/hooks/useScreenShare.d.ts.map +1 -1
  68. package/build/hooks/useScreenShare.js +5 -6
  69. package/build/hooks/useScreenShare.js.map +1 -1
  70. package/build/index.d.ts +3 -2
  71. package/build/index.d.ts.map +1 -1
  72. package/build/index.js +1 -0
  73. package/build/index.js.map +1 -1
  74. package/build/types.d.ts +1 -1
  75. package/build/types.d.ts.map +1 -1
  76. package/build/types.js.map +1 -1
  77. package/build/utils/errorListener.js +2 -2
  78. package/build/utils/errorListener.js.map +1 -1
  79. package/ios/Events.swift +97 -19
  80. package/ios/RNFishjamClient.podspec +1 -1
  81. package/ios/RNFishjamClient.swift +74 -109
  82. package/ios/RNFishjamClientModule.swift +6 -6
  83. package/ios/VideoPreviewView.swift +13 -13
  84. package/ios/VideoRendererView.swift +28 -25
  85. package/ios/VideoRendererViewModule.swift +8 -4
  86. package/ios/extensions/AVCaptureDevice.swift +20 -0
  87. package/package.json +8 -10
@@ -18,7 +18,9 @@ class FishjamForegroundService : Service() {
18
18
 
19
19
  private val binder = LocalBinder()
20
20
 
21
- inner class LocalBinder : Binder()
21
+ inner class LocalBinder : Binder() {
22
+ fun getService(): FishjamForegroundService = this@FishjamForegroundService
23
+ }
22
24
 
23
25
  override fun onBind(intent: Intent): IBinder = binder
24
26
 
@@ -27,6 +29,11 @@ class FishjamForegroundService : Service() {
27
29
  flags: Int,
28
30
  startId: Int
29
31
  ): Int {
32
+ restartService(intent)
33
+ return START_NOT_STICKY
34
+ }
35
+
36
+ fun restartService(intent: Intent?) {
30
37
  val channelId = intent!!.getStringExtra("channelId")!!
31
38
  val channelName = intent.getStringExtra("channelName")!!
32
39
  val notificationTitle = intent.getStringExtra("notificationTitle")!!
@@ -49,12 +56,11 @@ class FishjamForegroundService : Service() {
49
56
  .setContentTitle(notificationTitle)
50
57
  .setContentText(notificationContent)
51
58
  .setContentIntent(pendingIntent)
59
+ .setSmallIcon(android.R.drawable.ic_dialog_info)
52
60
  .build()
53
61
 
54
62
  createNotificationChannel(channelId, channelName)
55
63
  startForegroundWithNotification(notification, foregroundServiceType)
56
-
57
- return START_NOT_STICKY
58
64
  }
59
65
 
60
66
  private fun startForegroundWithNotification(
@@ -87,7 +93,7 @@ class FishjamForegroundService : Service() {
87
93
  NotificationChannel(
88
94
  channelId,
89
95
  channelName,
90
- NotificationManager.IMPORTANCE_DEFAULT
96
+ NotificationManager.IMPORTANCE_HIGH
91
97
  )
92
98
  val notificationManager = getSystemService(NOTIFICATION_SERVICE) as? NotificationManager
93
99
  notificationManager?.createNotificationChannel(serviceChannel)
@@ -4,52 +4,30 @@ import android.content.ComponentName
4
4
  import android.content.Context
5
5
  import android.content.Intent
6
6
  import android.content.ServiceConnection
7
- import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA
8
- import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
9
- import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
10
7
  import android.os.Build
11
8
  import android.os.IBinder
12
9
  import expo.modules.kotlin.AppContext
13
10
  import expo.modules.kotlin.exception.CodedException
14
- import io.fishjam.reactnative.ForegroundServiceNotificationConfig
15
- import io.fishjam.reactnative.ForegroundServicePermissionsConfig
16
- import io.fishjam.reactnative.utils.PermissionUtils
11
+ import io.fishjam.reactnative.ForegroundServiceConfig
17
12
  import kotlinx.coroutines.CancellableContinuation
18
13
  import kotlinx.coroutines.suspendCancellableCoroutine
19
14
  import kotlin.coroutines.resume
20
15
 
21
16
  class ForegroundServiceManager(
22
- private val appContext: AppContext,
23
- notificationConfig: ForegroundServiceNotificationConfig
17
+ private val appContext: AppContext
24
18
  ) {
25
19
  private val reactContext by lazy {
26
20
  appContext.reactContext ?: throw CodedException("reactContext not found")
27
21
  }
28
- private var isServiceBound: Boolean = false
29
- private var serviceConnectedContinuation: CancellableContinuation<Unit>? = null
30
22
 
23
+ private var serviceState = ForegroundServiceState()
24
+ private var serviceInstance: FishjamForegroundService? = null
25
+ private var serviceConnectedContinuation: CancellableContinuation<Unit>? = null
31
26
  private val serviceIntent =
32
27
  Intent(
33
28
  appContext.reactContext,
34
29
  FishjamForegroundService::class.java
35
- ).apply {
36
- putExtra(
37
- "channelId",
38
- notificationConfig.channelId.orThrow("channelId")
39
- )
40
- putExtra(
41
- "channelName",
42
- notificationConfig.channelName.orThrow("channelName")
43
- )
44
- putExtra(
45
- "notificationContent",
46
- notificationConfig.notificationContent.orThrow("notificationContent")
47
- )
48
- putExtra(
49
- "notificationTitle",
50
- notificationConfig.notificationTitle.orThrow("notificationTitle")
51
- )
52
- }
30
+ )
53
31
 
54
32
  private val connection =
55
33
  object : ServiceConnection {
@@ -57,26 +35,46 @@ class ForegroundServiceManager(
57
35
  className: ComponentName,
58
36
  service: IBinder
59
37
  ) {
60
- isServiceBound = true
38
+ serviceInstance = (service as FishjamForegroundService.LocalBinder).getService()
61
39
  serviceConnectedContinuation?.resume(Unit)
62
40
  serviceConnectedContinuation = null
63
41
  }
64
42
 
65
43
  override fun onServiceDisconnected(arg0: ComponentName) {
66
- isServiceBound = false
44
+ serviceInstance = null
67
45
  serviceConnectedContinuation?.cancel()
68
46
  serviceConnectedContinuation = null
69
47
  }
70
48
  }
71
49
 
72
- suspend fun startForegroundService(permissionsConfig: ForegroundServicePermissionsConfig) {
73
- val foregroundServiceTypes = buildForegroundServiceTypes(permissionsConfig)
50
+ fun updateServiceWithConfig(configUpdate: ForegroundServiceConfig) {
51
+ configUpdate.enableCamera?.let { serviceState.cameraEnabled = it }
52
+ configUpdate.enableMicrophone?.let { serviceState.microphoneEnabled = it }
53
+ configUpdate.channelId?.let { serviceState.channelId = it }
54
+ configUpdate.channelName?.let { serviceState.channelName = it }
55
+ configUpdate.notificationContent?.let { serviceState.notificationContent = it }
56
+ configUpdate.notificationTitle?.let { serviceState.notificationTitle = it }
57
+ }
58
+
59
+ fun updateService(update: ForegroundServiceState.() -> Unit) {
60
+ serviceState.update()
61
+ }
62
+
63
+ suspend fun start() {
64
+ val foregroundServiceTypes = serviceState.buildForegroundServiceTypes(appContext)
74
65
 
75
66
  if (foregroundServiceTypes.isEmpty()) {
67
+ stop()
76
68
  return
77
69
  }
78
70
 
79
- serviceIntent.putExtra("foregroundServiceTypes", foregroundServiceTypes.toIntArray())
71
+ serviceIntent.apply {
72
+ putExtra("channelId", serviceState.channelId)
73
+ putExtra("channelName", serviceState.channelName)
74
+ putExtra("notificationContent", serviceState.notificationContent)
75
+ putExtra("notificationTitle", serviceState.notificationTitle)
76
+ putExtra("foregroundServiceTypes", foregroundServiceTypes.toIntArray())
77
+ }
80
78
 
81
79
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
82
80
  reactContext.startForegroundService(serviceIntent)
@@ -87,61 +85,34 @@ class ForegroundServiceManager(
87
85
  bindServiceIfNeededAndAwait()
88
86
  }
89
87
 
90
- fun stopForegroundService() {
91
- if (isServiceBound) {
88
+ fun stop() {
89
+ if (serviceInstance != null) {
92
90
  appContext.currentActivity?.unbindService(connection)
93
91
  ?: throw CodedException("Current activity not found")
94
- isServiceBound = false
92
+ serviceInstance = null
95
93
  }
96
94
  reactContext.stopService(serviceIntent)
97
95
  serviceConnectedContinuation?.cancel()
98
96
  serviceConnectedContinuation = null
99
97
  }
100
98
 
101
- private fun buildForegroundServiceTypes(permissionsConfig: ForegroundServicePermissionsConfig): List<Int> =
102
- buildList {
103
- if (permissionsConfig.enableCamera) {
104
- addIfPermissionGranted(
105
- FOREGROUND_SERVICE_TYPE_CAMERA,
106
- "camera",
107
- PermissionUtils::hasCameraPermission
108
- )
109
- }
110
- if (permissionsConfig.enableMicrophone) {
111
- addIfPermissionGranted(
112
- FOREGROUND_SERVICE_TYPE_MICROPHONE,
113
- "microphone",
114
- PermissionUtils::hasMicrophonePermission
115
- )
116
- }
117
- if (permissionsConfig.enableScreenSharing) add(FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION)
118
- }
119
-
120
- private fun MutableList<Int>.addIfPermissionGranted(
121
- serviceType: Int,
122
- permissionName: String,
123
- hasPermission: (AppContext) -> Boolean
124
- ) {
125
- if (!hasPermission(appContext)) {
126
- throw CodedException("Cannot start a $permissionName foreground service without $permissionName permission.")
127
- }
128
- add(serviceType)
129
- }
130
-
131
99
  private suspend fun bindServiceIfNeededAndAwait() =
132
100
  suspendCancellableCoroutine { continuation ->
133
- if (!isServiceBound) {
101
+ if (serviceInstance == null) {
134
102
  serviceConnectedContinuation = continuation
135
103
  runCatching {
136
- appContext.currentActivity?.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE)
104
+ appContext.currentActivity?.bindService(
105
+ serviceIntent,
106
+ connection,
107
+ Context.BIND_AUTO_CREATE
108
+ )
137
109
  }.onFailure { error ->
138
110
  continuation.cancel(CodedException("Failed to bind service: ${error.message}"))
139
111
  }
140
112
  } else {
113
+ serviceInstance?.restartService(serviceIntent)
141
114
  continuation.resume(Unit)
142
115
  serviceConnectedContinuation = null
143
116
  }
144
117
  }
145
118
  }
146
-
147
- private fun String?.orThrow(fieldName: String): String = this ?: throw CodedException("Missing `$fieldName` for startForegroundService")
@@ -0,0 +1,46 @@
1
+ package io.fishjam.reactnative.foregroundService
2
+
3
+ import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA
4
+ import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
5
+ import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
6
+ import expo.modules.kotlin.AppContext
7
+ import expo.modules.kotlin.exception.CodedException
8
+ import io.fishjam.reactnative.utils.PermissionUtils
9
+
10
+ data class ForegroundServiceState(
11
+ var cameraEnabled: Boolean = false,
12
+ var microphoneEnabled: Boolean = false,
13
+ var screenSharingEnabled: Boolean = false,
14
+ var channelId: String = "com.fishjam.foregroundservice.channel",
15
+ var channelName: String = "Fishjam Notifications",
16
+ var notificationContent: String = "[PLACEHOLDER] Your video call is ongoing",
17
+ var notificationTitle: String = "[PLACEHOLDER] Tap to return to the call."
18
+ ) {
19
+ fun buildForegroundServiceTypes(appContext: AppContext): List<Int> =
20
+ buildList {
21
+ if (cameraEnabled) {
22
+ addIfPermissionGranted(
23
+ FOREGROUND_SERVICE_TYPE_CAMERA,
24
+ "camera"
25
+ ) { PermissionUtils.hasCameraPermission(appContext) }
26
+ }
27
+ if (microphoneEnabled) {
28
+ addIfPermissionGranted(
29
+ FOREGROUND_SERVICE_TYPE_MICROPHONE,
30
+ "microphone"
31
+ ) { PermissionUtils.hasMicrophonePermission(appContext) }
32
+ }
33
+ if (screenSharingEnabled) add(FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION)
34
+ }
35
+
36
+ private fun MutableList<Int>.addIfPermissionGranted(
37
+ serviceType: Int,
38
+ permissionName: String,
39
+ hasPermission: () -> Boolean
40
+ ) {
41
+ if (!hasPermission()) {
42
+ throw CodedException("Cannot start a $permissionName foreground service without $permissionName permission.")
43
+ }
44
+ add(serviceType)
45
+ }
46
+ }
@@ -0,0 +1,22 @@
1
+ package io.fishjam.reactnative.managers
2
+
3
+ abstract class ListenerManager<T> {
4
+ protected var listeners: MutableList<T> = mutableListOf()
5
+ private set
6
+
7
+ fun add(listener: T) {
8
+ listeners.add(listener)
9
+ }
10
+
11
+ fun remove(listener: T) {
12
+ listeners.remove(listener)
13
+ }
14
+ }
15
+
16
+ open class SingleListenerManager<T>(
17
+ private val notify: (T) -> Unit
18
+ ) : ListenerManager<T>() {
19
+ fun notifyListeners() {
20
+ for (listener in listeners) notify(listener)
21
+ }
22
+ }
@@ -4,18 +4,5 @@ interface LocalCameraTrackChangedListener {
4
4
  fun onLocalCameraTrackChanged()
5
5
  }
6
6
 
7
- class LocalCameraTracksChangedListenersManager {
8
- private var listeners: MutableList<LocalCameraTrackChangedListener> = mutableListOf()
9
-
10
- fun add(listener: LocalCameraTrackChangedListener) {
11
- listeners.add(listener)
12
- }
13
-
14
- fun remove(listener: LocalCameraTrackChangedListener) {
15
- listeners.remove(listener)
16
- }
17
-
18
- fun notifyListeners() {
19
- for (listener in listeners) listener.onLocalCameraTrackChanged()
20
- }
21
- }
7
+ class LocalCameraTracksChangedListenersManager :
8
+ SingleListenerManager<LocalCameraTrackChangedListener>(LocalCameraTrackChangedListener::onLocalCameraTrackChanged)
@@ -6,17 +6,7 @@ interface LocalTrackSwitchListener {
6
6
  suspend fun onLocalTrackSwitched()
7
7
  }
8
8
 
9
- class LocalTracksSwitchListenersManager {
10
- private val listeners: MutableList<LocalTrackSwitchListener> = mutableListOf()
11
-
12
- fun add(listener: LocalTrackSwitchListener) {
13
- listeners.add(listener)
14
- }
15
-
16
- fun remove(listener: LocalTrackSwitchListener) {
17
- listeners.remove(listener)
18
- }
19
-
9
+ class LocalTracksSwitchListenersManager : ListenerManager<LocalTrackSwitchListener>() {
20
10
  suspend fun notifyWillSwitch() {
21
11
  for (listener in listeners) listener.onLocalTrackWillSwitch()
22
12
  }
@@ -4,18 +4,4 @@ interface TrackUpdateListener {
4
4
  fun onTracksUpdate()
5
5
  }
6
6
 
7
- class TracksUpdateListenersManager {
8
- private val listeners: MutableList<TrackUpdateListener> = mutableListOf()
9
-
10
- fun add(listener: TrackUpdateListener) {
11
- listeners.add(listener)
12
- }
13
-
14
- fun remove(listener: TrackUpdateListener) {
15
- listeners.remove(listener)
16
- }
17
-
18
- fun notifyListeners() {
19
- for (listener in listeners) listener.onTracksUpdate()
20
- }
21
- }
7
+ class TracksUpdateListenersManager : SingleListenerManager<TrackUpdateListener>(TrackUpdateListener::onTracksUpdate)
@@ -1,13 +1,13 @@
1
1
  import { EventEmitter } from 'expo-modules-core';
2
2
  import { NativeModule } from 'react-native';
3
3
  import type { RTCStats } from './debug/stats/types';
4
- import type { SimulcastConfig } from './types';
4
+ import type { GenericMetadata, SimulcastConfig } from './types';
5
5
  import type { CameraConfigInternal, Camera } from './hooks/useCamera';
6
6
  import type { Peer } from './hooks/usePeers';
7
7
  import type { ScreenShareOptionsInternal } from './hooks/useScreenShare';
8
8
  import type { ConnectionConfig } from './common/client';
9
9
  import { PeerStatus } from './hooks/usePeerStatus';
10
- import { ForegroundServiceNotificationConfig, ForegroundServicePermissionsConfigInternal } from './hooks/useForegroundService';
10
+ import { ForegroundServiceConfig } from './hooks/useForegroundService';
11
11
  type Metadata = {
12
12
  [key: string]: any;
13
13
  };
@@ -17,10 +17,11 @@ type RNFishjamClient = {
17
17
  isScreenShareOn: boolean;
18
18
  isAppScreenShareOn: boolean;
19
19
  cameras: ReadonlyArray<Camera>;
20
+ currentCamera: Camera | null;
20
21
  peerStatus: PeerStatus;
21
22
  joinRoom: (url: string, peerToken: string, peerMetadata: Metadata, config: ConnectionConfig) => Promise<void>;
22
23
  leaveRoom: () => Promise<void>;
23
- startCamera: (config: CameraConfigInternal) => Promise<void>;
24
+ startCamera: (config: CameraConfigInternal) => Promise<boolean>;
24
25
  toggleMicrophone: () => Promise<boolean>;
25
26
  toggleCamera: () => Promise<boolean>;
26
27
  flipCamera: () => Promise<void>;
@@ -28,10 +29,9 @@ type RNFishjamClient = {
28
29
  handleScreenSharePermission: () => Promise<'granted' | 'denied'>;
29
30
  toggleScreenShare: (screenShareOptions: Partial<ScreenShareOptionsInternal>) => Promise<void>;
30
31
  toggleAppScreenShare: (screenShareOptions: Partial<ScreenShareOptionsInternal>) => Promise<void>;
31
- getPeers: <PeerMetadataType extends Metadata>() => Promise<Peer<PeerMetadataType>[]>;
32
+ getPeers: <PeerMetadataType extends Metadata, ServerMetadata extends Metadata = GenericMetadata>() => Promise<Peer<PeerMetadataType, ServerMetadata>[]>;
32
33
  updatePeerMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
33
34
  updateVideoTrackMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
34
- updateAudioTrackMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
35
35
  updateScreenShareTrackMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
36
36
  setOutputAudioDevice: (audioDevice: string) => Promise<void>;
37
37
  startAudioSwitcher: () => Promise<void>;
@@ -47,8 +47,7 @@ type RNFishjamClient = {
47
47
  setVideoTrackBandwidth: (bandwidth: number) => Promise<void>;
48
48
  changeWebRTCLoggingSeverity: (severity: string) => Promise<void>;
49
49
  getStatistics: () => Promise<RTCStats>;
50
- configureForegroundService: (config: ForegroundServiceNotificationConfig) => void;
51
- startForegroundService: (config: ForegroundServicePermissionsConfigInternal) => Promise<void>;
50
+ startForegroundService: (config: ForegroundServiceConfig) => Promise<void>;
52
51
  stopForegroundService: () => void;
53
52
  };
54
53
  export declare const nativeModuleEventEmitter: EventEmitter;
@@ -1 +1 @@
1
- {"version":3,"file":"RNFishjamClientModule.d.ts","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RNFishjamClientModule.d.ts","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RNFishjamClientModule.js","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAyFtE,MAAM,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;AAEvE,eAAe,YAA8C,CAAC","sourcesContent":["import { EventEmitter, requireNativeModule } from 'expo-modules-core';\nimport { NativeModule } from 'react-native';\n\nimport type { RTCStats } from './debug/stats/types';\nimport type { SimulcastConfig } from './types';\nimport type { CameraConfigInternal, Camera } from './hooks/useCamera';\nimport type { Peer } from './hooks/usePeers';\nimport type { ScreenShareOptionsInternal } from './hooks/useScreenShare';\nimport type { ConnectionConfig } from './common/client';\nimport { PeerStatus } from './hooks/usePeerStatus';\nimport {\n ForegroundServiceNotificationConfig,\n ForegroundServicePermissionsConfigInternal,\n} from './hooks/useForegroundService';\n\ntype Metadata = { [key: string]: any };\n\ntype RNFishjamClient = {\n isMicrophoneOn: boolean;\n isCameraOn: boolean;\n isScreenShareOn: boolean;\n isAppScreenShareOn: boolean; // only available on ios\n cameras: ReadonlyArray<Camera>;\n peerStatus: PeerStatus;\n joinRoom: (\n url: string,\n peerToken: string,\n peerMetadata: Metadata,\n config: ConnectionConfig,\n ) => Promise<void>;\n leaveRoom: () => Promise<void>;\n startCamera: (config: CameraConfigInternal) => Promise<void>;\n toggleMicrophone: () => Promise<boolean>;\n toggleCamera: () => Promise<boolean>;\n flipCamera: () => Promise<void>;\n switchCamera: (cameraId: string) => Promise<void>;\n handleScreenSharePermission: () => Promise<'granted' | 'denied'>;\n toggleScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n toggleAppScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n getPeers: <PeerMetadataType extends Metadata>() => Promise<\n Peer<PeerMetadataType>[]\n >;\n updatePeerMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateVideoTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateAudioTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateScreenShareTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n setOutputAudioDevice: (audioDevice: string) => Promise<void>;\n startAudioSwitcher: () => Promise<void>;\n stopAudioSwitcher: () => Promise<void>;\n selectAudioSessionMode: (sessionMode: string) => Promise<void>;\n showAudioRoutePicker: () => Promise<void>;\n toggleScreenShareTrackEncoding: (\n encoding: string,\n ) => Promise<SimulcastConfig>;\n setScreenShareTrackBandwidth: (bandwidth: number) => Promise<void>;\n setScreenShareTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setTargetTrackEncoding: (trackId: string, encoding: string) => Promise<void>;\n toggleVideoTrackEncoding: (encoding: string) => Promise<SimulcastConfig>;\n setVideoTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setVideoTrackBandwidth: (bandwidth: number) => Promise<void>;\n changeWebRTCLoggingSeverity: (severity: string) => Promise<void>;\n getStatistics: () => Promise<RTCStats>;\n configureForegroundService: (\n config: ForegroundServiceNotificationConfig,\n ) => void;\n startForegroundService: (\n config: ForegroundServicePermissionsConfigInternal,\n ) => Promise<void>;\n stopForegroundService: () => void;\n};\n\nconst nativeModule = requireNativeModule('RNFishjamClient');\nexport const nativeModuleEventEmitter = new EventEmitter(nativeModule);\n\nexport default nativeModule as RNFishjamClient & NativeModule;\n"]}
1
+ {"version":3,"file":"RNFishjamClientModule.js","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAgFtE,MAAM,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;AAEvE,eAAe,YAA8C,CAAC","sourcesContent":["import { EventEmitter, requireNativeModule } from 'expo-modules-core';\nimport { NativeModule } from 'react-native';\n\nimport type { RTCStats } from './debug/stats/types';\nimport type { GenericMetadata, SimulcastConfig } from './types';\nimport type { CameraConfigInternal, Camera } from './hooks/useCamera';\nimport type { Peer } from './hooks/usePeers';\nimport type { ScreenShareOptionsInternal } from './hooks/useScreenShare';\nimport type { ConnectionConfig } from './common/client';\nimport { PeerStatus } from './hooks/usePeerStatus';\nimport { ForegroundServiceConfig } from './hooks/useForegroundService';\n\ntype Metadata = { [key: string]: any };\n\ntype RNFishjamClient = {\n isMicrophoneOn: boolean;\n isCameraOn: boolean;\n isScreenShareOn: boolean;\n isAppScreenShareOn: boolean; // only available on ios\n cameras: ReadonlyArray<Camera>;\n currentCamera: Camera | null;\n peerStatus: PeerStatus;\n joinRoom: (\n url: string,\n peerToken: string,\n peerMetadata: Metadata,\n config: ConnectionConfig,\n ) => Promise<void>;\n leaveRoom: () => Promise<void>;\n startCamera: (config: CameraConfigInternal) => Promise<boolean>;\n toggleMicrophone: () => Promise<boolean>;\n toggleCamera: () => Promise<boolean>;\n flipCamera: () => Promise<void>;\n switchCamera: (cameraId: string) => Promise<void>;\n handleScreenSharePermission: () => Promise<'granted' | 'denied'>;\n toggleScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n toggleAppScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n getPeers: <\n PeerMetadataType extends Metadata,\n ServerMetadata extends Metadata = GenericMetadata,\n >() => Promise<Peer<PeerMetadataType, ServerMetadata>[]>;\n updatePeerMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateVideoTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateScreenShareTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n setOutputAudioDevice: (audioDevice: string) => Promise<void>;\n startAudioSwitcher: () => Promise<void>;\n stopAudioSwitcher: () => Promise<void>;\n selectAudioSessionMode: (sessionMode: string) => Promise<void>;\n showAudioRoutePicker: () => Promise<void>;\n toggleScreenShareTrackEncoding: (\n encoding: string,\n ) => Promise<SimulcastConfig>;\n setScreenShareTrackBandwidth: (bandwidth: number) => Promise<void>;\n setScreenShareTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setTargetTrackEncoding: (trackId: string, encoding: string) => Promise<void>;\n toggleVideoTrackEncoding: (encoding: string) => Promise<SimulcastConfig>;\n setVideoTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setVideoTrackBandwidth: (bandwidth: number) => Promise<void>;\n changeWebRTCLoggingSeverity: (severity: string) => Promise<void>;\n getStatistics: () => Promise<RTCStats>;\n startForegroundService: (config: ForegroundServiceConfig) => Promise<void>;\n stopForegroundService: () => void;\n};\n\nconst nativeModule = requireNativeModule('RNFishjamClient');\nexport const nativeModuleEventEmitter = new EventEmitter(nativeModule);\n\nexport default nativeModule as RNFishjamClient & NativeModule;\n"]}
@@ -1,4 +1,5 @@
1
1
  import { GenericMetadata } from '../types';
2
+ import { PeerTrackMetadata } from '../hooks/usePeers';
2
3
  export type ConnectionConfig = {
3
4
  /**
4
5
  * Configuration for automatic reconnection
@@ -21,7 +22,7 @@ export type ConnectionConfig = {
21
22
  * @param config additional connection configuration
22
23
  * @category Connection
23
24
  */
24
- export declare function joinRoom<PeerMetadata extends GenericMetadata = GenericMetadata>(url: string, peerToken: string, peerMetadata?: PeerMetadata, config?: ConnectionConfig): Promise<void>;
25
+ export declare function joinRoom<PeerMetadata extends GenericMetadata = GenericMetadata, ServerMetadata extends GenericMetadata = GenericMetadata>(url: string, peerToken: string, peerMetadata?: PeerTrackMetadata<PeerMetadata, ServerMetadata>, config?: ConnectionConfig): Promise<void>;
25
26
  /**
26
27
  * @category Connection
27
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,YAAY,SAAS,eAAe,GAAG,eAAe,EAEtD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,gBAAgB,iBAQ1B;AACD;;GAEG;AACH,wBAAsB,SAAS,kBAE9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,cAAc,SAAS,eAAe,GAAG,eAAe,EAExD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,EAC9D,MAAM,CAAC,EAAE,gBAAgB,iBAQ1B;AACD;;GAEG;AACH,wBAAsB,SAAS,kBAE9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAkB7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAG5B,GAAW,EACX,SAAiB,EACjB,YAA2B,EAC3B,MAAyB;IAEzB,MAAM,qBAAqB,CAAC,QAAQ,CAClC,GAAG,EACH,SAAS,EACT,YAAY,IAAI,EAAE,EAClB,MAAM,IAAI,EAAE,CACb,CAAC;AACJ,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,qBAAqB,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\nexport type ConnectionConfig = {\n /**\n * Configuration for automatic reconnection\n * sdk uses a linear backoff algorithm, that is the formula\n * for the delay of the nth attempt is\n * n * delayMs + initialDelayMs\n *\n * Pass 0 for maxAttempts to disable automatic reconnection\n */\n reconnectConfig?: {\n maxAttempts?: number;\n initialDelayMs?: number;\n delayMs?: number;\n };\n};\n\n/**\n * @param url fishjam Url\n * @param peerToken token received from server (or Room Manager)\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @param config additional connection configuration\n * @category Connection\n */\nexport async function joinRoom<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(\n url: string,\n peerToken: string,\n peerMetadata?: PeerMetadata,\n config?: ConnectionConfig,\n) {\n await RNFishjamClientModule.joinRoom(\n url,\n peerToken,\n peerMetadata ?? {},\n config ?? {},\n );\n}\n/**\n * @category Connection\n */\nexport async function leaveRoom() {\n await RNFishjamClientModule.leaveRoom();\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAmB7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAI5B,GAAW,EACX,SAAiB,EACjB,YAA8D,EAC9D,MAAyB;IAEzB,MAAM,qBAAqB,CAAC,QAAQ,CAClC,GAAG,EACH,SAAS,EACT,YAAY,IAAI,EAAE,EAClB,MAAM,IAAI,EAAE,CACb,CAAC;AACJ,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,qBAAqB,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\nimport { PeerTrackMetadata } from '../hooks/usePeers';\n\nexport type ConnectionConfig = {\n /**\n * Configuration for automatic reconnection\n * sdk uses a linear backoff algorithm, that is the formula\n * for the delay of the nth attempt is\n * n * delayMs + initialDelayMs\n *\n * Pass 0 for maxAttempts to disable automatic reconnection\n */\n reconnectConfig?: {\n maxAttempts?: number;\n initialDelayMs?: number;\n delayMs?: number;\n };\n};\n\n/**\n * @param url fishjam Url\n * @param peerToken token received from server (or Room Manager)\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @param config additional connection configuration\n * @category Connection\n */\nexport async function joinRoom<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n>(\n url: string,\n peerToken: string,\n peerMetadata?: PeerTrackMetadata<PeerMetadata, ServerMetadata>,\n config?: ConnectionConfig,\n) {\n await RNFishjamClientModule.joinRoom(\n url,\n peerToken,\n peerMetadata ?? {},\n config ?? {},\n );\n}\n/**\n * @category Connection\n */\nexport async function leaveRoom() {\n await RNFishjamClientModule.leaveRoom();\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"]}