@fishjam-cloud/react-native-client 0.4.0 → 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.
- package/android/build.gradle +1 -1
- package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +99 -14
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +63 -92
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +12 -23
- package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +6 -2
- package/android/src/main/java/io/fishjam/reactnative/VideoView.kt +41 -3
- package/android/src/main/java/io/fishjam/reactnative/extensions/CaptureDevice.kt +17 -0
- package/android/src/main/java/io/fishjam/reactnative/foregroundService/FishjamForegroundService.kt +10 -4
- package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt +41 -70
- package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceState.kt +46 -0
- package/android/src/main/java/io/fishjam/reactnative/managers/ListenerManager.kt +22 -0
- package/android/src/main/java/io/fishjam/reactnative/managers/LocalCameraTracksChangedListenersManager.kt +2 -15
- package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt +1 -11
- package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt +1 -15
- package/build/RNFishjamClientModule.d.ts +6 -7
- package/build/RNFishjamClientModule.d.ts.map +1 -1
- package/build/RNFishjamClientModule.js.map +1 -1
- package/build/common/client.d.ts +2 -1
- package/build/common/client.d.ts.map +1 -1
- package/build/common/client.js.map +1 -1
- package/build/common/webRTC.d.ts +2 -1
- package/build/common/webRTC.d.ts.map +1 -1
- package/build/common/webRTC.js.map +1 -1
- package/build/components/FishjamRoom/GridTrackItem.d.ts +11 -0
- package/build/components/FishjamRoom/GridTrackItem.d.ts.map +1 -0
- package/build/components/FishjamRoom/GridTrackItem.js +56 -0
- package/build/components/FishjamRoom/GridTrackItem.js.map +1 -0
- package/build/components/FishjamRoom/VideosGrid.d.ts +3 -0
- package/build/components/FishjamRoom/VideosGrid.d.ts.map +1 -0
- package/build/components/FishjamRoom/VideosGrid.js +20 -0
- package/build/components/FishjamRoom/VideosGrid.js.map +1 -0
- package/build/components/FishjamRoom/index.d.ts +6 -0
- package/build/components/FishjamRoom/index.d.ts.map +1 -0
- package/build/components/FishjamRoom/index.js +29 -0
- package/build/components/FishjamRoom/index.js.map +1 -0
- package/build/components/FishjamRoom/parsePeersToTracks.d.ts +4 -0
- package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -0
- package/build/components/FishjamRoom/parsePeersToTracks.js +36 -0
- package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -0
- package/build/components/VideoRendererView.d.ts +6 -1
- package/build/components/VideoRendererView.d.ts.map +1 -1
- package/build/components/VideoRendererView.js.map +1 -1
- package/build/hooks/useAppScreenShare.js +1 -1
- package/build/hooks/useAppScreenShare.js.map +1 -1
- package/build/hooks/useCamera.d.ts +6 -2
- package/build/hooks/useCamera.d.ts.map +1 -1
- package/build/hooks/useCamera.js +14 -17
- package/build/hooks/useCamera.js.map +1 -1
- package/build/hooks/useFishjamEvent.d.ts +1 -1
- package/build/hooks/useFishjamEvent.js +1 -1
- package/build/hooks/useFishjamEvent.js.map +1 -1
- package/build/hooks/useFishjamEventState.d.ts +3 -0
- package/build/hooks/useFishjamEventState.d.ts.map +1 -0
- package/build/hooks/useFishjamEventState.js +16 -0
- package/build/hooks/useFishjamEventState.js.map +1 -0
- package/build/hooks/useForegroundService.d.ts +12 -20
- package/build/hooks/useForegroundService.d.ts.map +1 -1
- package/build/hooks/useForegroundService.js +14 -4
- package/build/hooks/useForegroundService.js.map +1 -1
- package/build/hooks/useMicrophone.d.ts.map +1 -1
- package/build/hooks/useMicrophone.js +5 -10
- package/build/hooks/useMicrophone.js.map +1 -1
- package/build/hooks/usePeers.d.ts +50 -11
- package/build/hooks/usePeers.d.ts.map +1 -1
- package/build/hooks/usePeers.js +41 -6
- package/build/hooks/usePeers.js.map +1 -1
- package/build/hooks/useScreenShare.d.ts.map +1 -1
- package/build/hooks/useScreenShare.js +5 -6
- package/build/hooks/useScreenShare.js.map +1 -1
- package/build/index.d.ts +3 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/types.d.ts +1 -1
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/utils/errorListener.js +2 -2
- package/build/utils/errorListener.js.map +1 -1
- package/ios/Events.swift +97 -19
- package/ios/RNFishjamClient.podspec +1 -1
- package/ios/RNFishjamClient.swift +74 -109
- package/ios/RNFishjamClientModule.swift +6 -6
- package/ios/Utils/PermissionUtils.swift +16 -0
- package/ios/VideoPreviewView.swift +13 -13
- package/ios/VideoRendererView.swift +28 -25
- package/ios/VideoRendererViewModule.swift +8 -4
- package/ios/extensions/AVCaptureDevice.swift +20 -0
- package/ios/managers/LocalCameraTracksChangedListenersManager.swift +23 -0
- package/ios/managers/TracksUpdateListenersManager.swift +21 -0
- package/package.json +9 -11
package/android/src/main/java/io/fishjam/reactnative/foregroundService/FishjamForegroundService.kt
CHANGED
|
@@ -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.
|
|
96
|
+
NotificationManager.IMPORTANCE_HIGH
|
|
91
97
|
)
|
|
92
98
|
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as? NotificationManager
|
|
93
99
|
notificationManager?.createNotificationChannel(serviceChannel)
|
package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt
CHANGED
|
@@ -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.
|
|
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
|
-
)
|
|
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
|
-
|
|
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
|
-
|
|
44
|
+
serviceInstance = null
|
|
67
45
|
serviceConnectedContinuation?.cancel()
|
|
68
46
|
serviceConnectedContinuation = null
|
|
69
47
|
}
|
|
70
48
|
}
|
|
71
49
|
|
|
72
|
-
|
|
73
|
-
|
|
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.
|
|
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
|
|
91
|
-
if (
|
|
88
|
+
fun stop() {
|
|
89
|
+
if (serviceInstance != null) {
|
|
92
90
|
appContext.currentActivity?.unbindService(connection)
|
|
93
91
|
?: throw CodedException("Current activity not found")
|
|
94
|
-
|
|
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 (
|
|
101
|
+
if (serviceInstance == null) {
|
|
134
102
|
serviceConnectedContinuation = continuation
|
|
135
103
|
runCatching {
|
|
136
|
-
appContext.currentActivity?.bindService(
|
|
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")
|
package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceState.kt
ADDED
|
@@ -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
|
-
|
|
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)
|
package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt
CHANGED
|
@@ -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
|
}
|
package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt
CHANGED
|
@@ -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 {
|
|
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<
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
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;
|
|
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"]}
|
package/build/common/client.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
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"]}
|
package/build/common/webRTC.d.ts
CHANGED
|
@@ -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:
|
|
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;
|
|
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;
|
|
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 @@
|
|
|
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"]}
|