diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index f77141417..7177e5d65 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -1,24 +1,24 @@ version: 0.1 cli: - version: 1.20.0 + version: 1.20.1 plugins: sources: - id: trunk - ref: v1.4.3 + ref: v1.4.4 uri: https://github.com/trunk-io/plugins lint: disabled: - osv-scanner enabled: - - actionlint@1.6.26 + - actionlint@1.6.27 - prettier@3.2.5 - swiftlint@0.54.0 - - checkov@3.2.22 + - checkov@3.2.30 - trivy@0.49.1 - - trufflehog@3.67.6 + - trufflehog@3.68.4 - oxipng@9.0.0 - yamllint@1.35.1 - - ktlint@1.1.1 + - ktlint@1.2.1 - svgo@3.2.0 - shfmt@3.6.0 - gitleaks@8.18.2 diff --git a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt index 1d037e298..1389eb20b 100644 --- a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +++ b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt @@ -6,8 +6,6 @@ import android.view.LayoutInflater import android.widget.FrameLayout import androidx.media3.common.Player import androidx.media3.common.VideoSize -import androidx.media3.ui.AspectRatioFrameLayout.RESIZE_MODE_FIT -import androidx.media3.ui.AspectRatioFrameLayout.RESIZE_MODE_ZOOM import androidx.media3.ui.PlayerView import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.ReactContext @@ -133,13 +131,6 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) { localPlayerView?.player?.addListener( object : Player.Listener { - override fun onSurfaceSizeChanged( - width: Int, - height: Int, - ) { - super.onSurfaceSizeChanged(width, height) - } - override fun onVideoSizeChanged(videoSize: VideoSize) { super.onVideoSizeChanged(videoSize) @@ -147,12 +138,6 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) { val width = videoSize.width.toDouble() val height = videoSize.height.toDouble() - if (width >= height) { - playerView?.resizeMode = RESIZE_MODE_FIT - } else { - playerView?.resizeMode = RESIZE_MODE_ZOOM - } - val data = Arguments.createMap() data.putDouble("width", width) data.putDouble("height", height) diff --git a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSManager.kt b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSManager.kt index 77aa2b270..6f0d27c84 100644 --- a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +++ b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSManager.kt @@ -530,6 +530,8 @@ class HMSManager(reactContext: ReactApplicationContext) : hms?.stopRtmpAndRecording(callback) } + // region - HLS Streaming + @ReactMethod fun startHLSStreaming( data: ReadableMap, @@ -550,6 +552,24 @@ class HMSManager(reactContext: ReactApplicationContext) : hms?.stopHLSStreaming(callback) } + @ReactMethod + fun sendHLSTimedMetadata( + data: ReadableMap, + callback: Promise?, + ) { + val rnSDK = HMSHelper.getHms(data, hmsCollection) + rnSDK?.let { sdk -> + sdk.sendHLSTimedMetadata(data, callback) + return + } + callback?.reject( + "6004", + "HMS SDK not initialized", + ) + } + + // endregion + @ReactMethod fun changeName( data: ReadableMap, @@ -1396,6 +1416,24 @@ class HMSManager(reactContext: ReactApplicationContext) : "HMS SDK not initialized", ) } + + @ReactMethod + fun fetchLeaderboard( + data: ReadableMap, + promise: Promise?, + ) { + val rnSDK = HMSHelper.getHms(data, hmsCollection) + rnSDK?.let { sdk -> + sdk.interactivityCenter?.let { center -> + center.fetchLeaderboard(data, promise) + return + } + } + promise?.reject( + "6004", + "HMS SDK not initialized", + ) + } // endregion // region ActivityLifecycleCallbacks diff --git a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt index 5081d4f69..645fe8190 100644 --- a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +++ b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt @@ -1580,6 +1580,8 @@ class HMSRNSDK( ) } + // region - HLS Streaming + fun startHLSStreaming( data: ReadableMap, callback: Promise?, @@ -1614,6 +1616,42 @@ class HMSRNSDK( ) } + fun sendHLSTimedMetadata( + data: ReadableMap, + callback: Promise?, + ) { + val metadataArrayList = data.getArray("metadata")?.toArrayList() as? ArrayList> + + if (metadataArrayList == null) { + val errorMessage = "sendHLSTimedMetadata: INVALID_METADATA" + rejectCallback(callback, errorMessage) + return + } + + val metadata = + metadataArrayList.mapNotNull { map -> + val payload = map["payload"] as? String + val duration = map["duration"] as? Double + + payload?.let { HMSHLSTimedMetadata(it, duration?.toLong() ?: 1) } + } + + hmsSDK?.setHlsSessionMetadata( + metadata, + object : HMSActionResultListener { + override fun onSuccess() { + callback?.resolve(true) + } + + override fun onError(error: HMSException) { + callback?.reject(error.code.toString(), error.message) + } + }, + ) + } + + // endregion + fun changeName( data: ReadableMap, callback: Promise?, diff --git a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt index 83abde377..44ecd3c18 100644 --- a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +++ b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt @@ -10,8 +10,12 @@ import live.hms.video.polls.models.answer.HMSPollQuestionAnswer import live.hms.video.polls.models.answer.HmsPollAnswer import live.hms.video.polls.models.answer.PollAnswerItem import live.hms.video.polls.models.answer.PollAnswerResponse +import live.hms.video.polls.models.network.HMSPollResponsePeerInfo import live.hms.video.polls.models.question.HMSPollQuestion import live.hms.video.polls.models.question.HMSPollQuestionOption +import live.hms.video.polls.network.HMSPollLeaderboardEntry +import live.hms.video.polls.network.HMSPollLeaderboardSummary +import live.hms.video.polls.network.PollLeaderboardResponse import live.hms.video.polls.network.PollResultsDisplay object HMSInteractivityDecoder { @@ -310,6 +314,87 @@ object HMSInteractivityDecoder { return results } + fun getPollLeaderboardResponse(pollLeaderboardResponse: PollLeaderboardResponse): WritableMap { + val results = Arguments.createMap() + + pollLeaderboardResponse.hasNext?.let { + results.putBoolean("hasNext", it) + } + pollLeaderboardResponse.summary?.let { + results.putMap("summary", getHMSPollLeaderboardSummary(it)) + } + pollLeaderboardResponse.entries?.let { + results.putArray("entries", getHMSPollLeaderboardEntries(it)) + } + return results + } + + private fun getHMSPollLeaderboardSummary(pollLeaderboardSummary: HMSPollLeaderboardSummary): WritableMap { + val summary = Arguments.createMap() + pollLeaderboardSummary.averageScore?.let { + summary.putDouble("averageScore", it.toDouble()) + } + pollLeaderboardSummary.averageTime?.let { + summary.putString("averageTime", it.toString()) + } + pollLeaderboardSummary.totalPeersCount?.let { + summary.putInt("totalPeersCount", it) + } + pollLeaderboardSummary.respondedCorrectlyPeersCount?.let { + summary.putInt("respondedCorrectlyPeersCount", it) + } + pollLeaderboardSummary.respondedPeersCount?.let { + summary.putInt("respondedPeersCount", it) + } + return summary + } + + private fun getHMSPollLeaderboardEntries(pollLeaderboardEntries: List): WritableArray { + val list = Arguments.createArray() + pollLeaderboardEntries.forEach { + list.pushMap(getHMSPollLeaderboardEntry(it)) + } + return list + } + + private fun getHMSPollLeaderboardEntry(pollLeaderboardEntry: HMSPollLeaderboardEntry): WritableMap { + val entry = Arguments.createMap() + pollLeaderboardEntry.duration?.let { + entry.putString("duration", it.toString()) + } + pollLeaderboardEntry.peer?.let { + entry.putMap("peer", getHMSPollResponsePeerInfo(it)) + } + pollLeaderboardEntry.totalResponses?.let { + entry.putString("totalResponses", it.toString()) + } + pollLeaderboardEntry.correctResponses?.let { + entry.putString("correctResponses", it.toString()) + } + pollLeaderboardEntry.position?.let { + entry.putString("position", it.toString()) + } + pollLeaderboardEntry.score?.let { + entry.putString("score", it.toString()) + } + return entry + } + + private fun getHMSPollResponsePeerInfo(pollResponsePeerInfo: HMSPollResponsePeerInfo): WritableMap { + val peerInfo = Arguments.createMap() + peerInfo.putString("userHash", pollResponsePeerInfo.hash) + pollResponsePeerInfo.peerid?.let { + peerInfo.putString("peerId", it) + } + pollResponsePeerInfo.userid?.let { + peerInfo.putString("customerUserId", it) + } + pollResponsePeerInfo.username?.let { + peerInfo.putString("userName", it) + } + return peerInfo + } + private fun getHMSPollQuestionResponseResult(hmsPollQuestionResponseResult: PollAnswerItem): WritableMap { val result = Arguments.createMap() diff --git a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt index dde1b1cc6..b2bb03e56 100644 --- a/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +++ b/packages/react-native-hms/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt @@ -1,5 +1,4 @@ package com.reactnativehmssdk -import android.util.Log import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReadableMap @@ -10,6 +9,7 @@ import live.hms.video.interactivity.HmsPollUpdateListener import live.hms.video.polls.models.HMSPollUpdateType import live.hms.video.polls.models.HmsPoll import live.hms.video.polls.models.answer.PollAnswerResponse +import live.hms.video.polls.network.PollLeaderboardResponse import live.hms.video.sdk.HMSActionResultListener import live.hms.video.sdk.HMSSDK import live.hms.video.sdk.HmsTypedActionResultListener @@ -37,8 +37,6 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN } } - // region Create Polls - fun quickStartPoll( data: ReadableMap, promise: Promise?, @@ -59,64 +57,29 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN ) } - /* - - func add(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { - guard let pollId = data["pollId"] as? String, - let poll = self.hmssdk?.interactivityCenter.polls.first(where: {poll in poll.pollID == pollId}) else { - reject?("6004", "Unable to find HMSPoll with given pollId", nil) - return - } - guard let pollQuestionIndex = data["pollQuestionIndex"] as? Int, - let pollQuestion = poll.questions?.first(where: {question in question.index == pollQuestionIndex}) else { - reject?("6004", "Unable to find HMSPollQuestion in poll with given question index", nil) - return - } - guard let responses = data["responses"] as? NSDictionary else { - reject?("6004", "responses field is required", nil) - return - } - - let pollResponseBuilder = HMSInteractivityHelper.getPollResponseBuilder(responses, poll: poll, pollQuestion: pollQuestion) - - self.hmssdk?.interactivityCenter.add(response: pollResponseBuilder) { pollQuestionResponseResult, error in - if let nonnilError = error { - reject?("6004", nonnilError.localizedDescription, nil) - return - } - if let pollQuestionResponseResult = pollQuestionResponseResult { - resolve?(HMSInteractivityDecoder.getHMSPollQuestionResponseResults(pollQuestionResponseResult)) - } else { - resolve?(nil) - } - } - } - - */ - fun addResponseOnPollQuestion( data: ReadableMap, promise: Promise?, ) { val pollId = data.getString("pollId") if (pollId == null) { - promise?.reject("6002", "pollId is required") + promise?.reject("6004", "pollId is required") return } val poll = this.sdk.getHmsInteractivityCenter().polls.find { it.pollId == pollId } if (poll == null) { - promise?.reject("6002", "No HMSPoll with pollId `$pollId`") + promise?.reject("6004", "No HMSPoll with pollId `$pollId`") return } val pollQuestionIndex = data.getInt("pollQuestionIndex") val pollQuestion = poll.questions?.find { it.questionID == pollQuestionIndex } if (pollQuestion == null) { - promise?.reject("6002", "No HMSPollQuestion in poll with given question index") + promise?.reject("6004", "No HMSPollQuestion in poll with given question index") return } val responses = data.getMap("responses") if (responses == null) { - promise?.reject("6002", "responses field is required") + promise?.reject("6004", "responses field is required") return } val pollResponseBuilder = HMSInteractivityHelper.getPollResponseBuilder(responses, poll, pollQuestion) @@ -140,12 +103,12 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN ) { val pollId = data.getString("pollId") if (pollId == null) { - promise?.reject("6002", "pollId is required") + promise?.reject("6004", "pollId is required") return } val poll = this.sdk.getHmsInteractivityCenter().polls.find { it.pollId == pollId } if (poll == null) { - promise?.reject("6002", "No HMSPoll with pollId `$pollId`") + promise?.reject("6004", "No HMSPoll with pollId `$pollId`") return } this.sdk.getHmsInteractivityCenter().stop( @@ -162,23 +125,38 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN ) } - // endregion - - // region Poll Update Listener - - fun showPollStartedToast() { - // Show toast - Log.e("Interactivity", "showPollStartedToast") - } - - fun loadResultsSummaryIfNeeded() { - // Load results summary - Log.e("Interactivity", "loadResultsSummaryIfNeeded") - } + fun fetchLeaderboard( + data: ReadableMap, + promise: Promise?, + ) { + val pollId = data.getString("pollId") + if (pollId == null) { + promise?.reject("6004", "pollId is required") + return + } + val poll = this.sdk.getHmsInteractivityCenter().polls.find { it.pollId == pollId } + if (poll == null) { + promise?.reject("6004", "No HMSPoll with pollId `$pollId`") + return + } + val count = data.getInt("count") + val startIndex = data.getInt("startIndex") + val includeCurrentPeer = data.getBoolean("includeCurrentPeer") + + this.sdk.getHmsInteractivityCenter().fetchLeaderboard( + pollId = poll.pollId, + count = count.toLong(), + startIndex = startIndex.toLong(), + includeCurrentPeer = includeCurrentPeer, + object : HmsTypedActionResultListener { + override fun onSuccess(result: PollLeaderboardResponse) { + promise?.resolve(HMSInteractivityDecoder.getPollLeaderboardResponse(result)) + } - fun updateResultsScreen() { - // Update results screen - Log.e("Interactivity", "updateResultsScreen") + override fun onError(error: HMSException) { + promise?.reject(error.code.toString(), error.description) + } + }, + ) } - // endregion } diff --git a/packages/react-native-hms/example/android/Gemfile.lock b/packages/react-native-hms/example/android/Gemfile.lock index a282dd465..788c5cb1d 100644 --- a/packages/react-native-hms/example/android/Gemfile.lock +++ b/packages/react-native-hms/example/android/Gemfile.lock @@ -10,12 +10,11 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.893.0) - aws-sdk-core (3.191.2) + aws-partitions (1.894.0) + aws-sdk-core (3.191.3) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) - base64 jmespath (~> 1, >= 1.6.1) aws-sdk-kms (1.77.0) aws-sdk-core (~> 3, >= 3.191.0) @@ -113,9 +112,9 @@ GEM google-apis-firebaseappdistribution_v1 (~> 0.3.0) google-apis-firebaseappdistribution_v1alpha (~> 0.2.0) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.57.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-core (0.13.0) + google-apis-androidpublisher_v3 (0.58.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-core (0.14.0) addressable (~> 2.5, >= 2.5.1) googleauth (~> 1.9) httpclient (>= 2.8.1, < 3.a) @@ -127,19 +126,19 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-firebaseappdistribution_v1alpha (0.2.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-iamcredentials_v1 (0.18.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-playcustomapp_v1 (0.14.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-storage_v1 (0.33.0) - google-apis-core (>= 0.12.0, < 2.a) + google-apis-iamcredentials_v1 (0.19.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-playcustomapp_v1 (0.15.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-storage_v1 (0.34.0) + google-apis-core (>= 0.14.0, < 2.a) google-cloud-core (1.6.1) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (2.1.1) faraday (>= 1.0, < 3.a) google-cloud-errors (1.3.1) - google-cloud-storage (1.48.1) + google-cloud-storage (1.49.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (~> 0.13) @@ -161,7 +160,8 @@ GEM httpclient (2.8.3) jmespath (1.6.2) json (2.7.1) - jwt (2.7.1) + jwt (2.8.0) + base64 mini_magick (4.12.0) mini_mime (1.1.5) multi_json (1.15.0) diff --git a/packages/react-native-hms/example/ios/Gemfile.lock b/packages/react-native-hms/example/ios/Gemfile.lock index a015ee1d1..14a5b5b53 100644 --- a/packages/react-native-hms/example/ios/Gemfile.lock +++ b/packages/react-native-hms/example/ios/Gemfile.lock @@ -10,12 +10,11 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.893.0) - aws-sdk-core (3.191.2) + aws-partitions (1.894.0) + aws-sdk-core (3.191.3) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) - base64 jmespath (~> 1, >= 1.6.1) aws-sdk-kms (1.77.0) aws-sdk-core (~> 3, >= 3.191.0) @@ -110,9 +109,9 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.57.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-core (0.13.0) + google-apis-androidpublisher_v3 (0.58.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-core (0.14.0) addressable (~> 2.5, >= 2.5.1) googleauth (~> 1.9) httpclient (>= 2.8.1, < 3.a) @@ -120,19 +119,19 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml - google-apis-iamcredentials_v1 (0.18.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-playcustomapp_v1 (0.14.0) - google-apis-core (>= 0.12.0, < 2.a) - google-apis-storage_v1 (0.33.0) - google-apis-core (>= 0.12.0, < 2.a) + google-apis-iamcredentials_v1 (0.19.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-playcustomapp_v1 (0.15.0) + google-apis-core (>= 0.14.0, < 2.a) + google-apis-storage_v1 (0.34.0) + google-apis-core (>= 0.14.0, < 2.a) google-cloud-core (1.6.1) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (2.1.1) faraday (>= 1.0, < 3.a) google-cloud-errors (1.3.1) - google-cloud-storage (1.48.1) + google-cloud-storage (1.49.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (~> 0.13) @@ -154,7 +153,8 @@ GEM httpclient (2.8.3) jmespath (1.6.2) json (2.7.1) - jwt (2.7.1) + jwt (2.8.0) + base64 mini_magick (4.12.0) mini_mime (1.1.5) multi_json (1.15.0) diff --git a/packages/react-native-hms/example/ios/Podfile.lock b/packages/react-native-hms/example/ios/Podfile.lock index 26f3d95ca..b5d06d45e 100644 --- a/packages/react-native-hms/example/ios/Podfile.lock +++ b/packages/react-native-hms/example/ios/Podfile.lock @@ -62,7 +62,7 @@ PODS: - HMSBroadcastExtensionSDK (0.0.9) - HMSHLSPlayerSDK (0.0.2): - HMSAnalyticsSDK (= 0.0.2) - - HMSSDK (1.5.1): + - HMSSDK (1.6.0): - HMSAnalyticsSDK (= 0.0.2) - HMSWebRTC (= 1.0.5116) - HMSWebRTC (1.0.5116) @@ -292,10 +292,10 @@ PODS: - React-Core - react-native-document-picker (8.2.2): - React-Core - - react-native-hms (1.9.12): + - react-native-hms (1.10.0): - HMSBroadcastExtensionSDK (= 0.0.9) - HMSHLSPlayerSDK (= 0.0.2) - - HMSSDK (= 1.5.1) + - HMSSDK (= 1.6.0) - React-Core - react-native-safe-area-context (3.4.1): - React-Core @@ -368,7 +368,7 @@ PODS: - React-perflogger (= 0.64.4) - rn-fetch-blob (0.12.0): - React-Core - - RNCAsyncStorage (1.22.0): + - RNCAsyncStorage (1.22.2): - React-Core - RNDeviceInfo (9.0.2): - React-Core @@ -629,7 +629,7 @@ SPEC CHECKSUMS: HMSAnalyticsSDK: 4d2a88a729b1eb42f3d25f217c28937ec318a5b7 HMSBroadcastExtensionSDK: d80fe325f6c928bd8e5176290b5a4b7ae15d6fbb HMSHLSPlayerSDK: 6a54ad4d12f3dc2270d1ecd24019d71282a4f6a3 - HMSSDK: ab468de17246fcc8d6315ea490e9d9b30431d6b3 + HMSSDK: 8bb7d5c9d593c4c1a15bdd28dbbc6dbc9a46c8e8 HMSWebRTC: ae54e9dd91b869051b283b43b14f57d43b7bf8e1 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b @@ -649,7 +649,7 @@ SPEC CHECKSUMS: react-native-avoid-softinput: 71a692888f0c1d426ad9045dc8325773583962cd react-native-camera: 3eae183c1d111103963f3dd913b65d01aef8110f react-native-document-picker: cd4d6b36a5207ad7a9e599ebb9eb0c2e84fa0b87 - react-native-hms: fd39afbf329480a7f6c09b6978f0116e90630970 + react-native-hms: 002adca217cf8c0b1bf28745e4b4c75f44430f58 react-native-safe-area-context: 9e40fb181dac02619414ba1294d6c2a807056ab9 react-native-simple-toast: 8ee5d23f0b92b935ab7434cdb65159ce12dfb4b7 React-perflogger: 5a890ca0911669421b7611661e9b58f91c805f5c @@ -665,7 +665,7 @@ SPEC CHECKSUMS: React-runtimeexecutor: 5b441857030bb6c3abaa7517f333cb01875ae499 ReactCommon: b4a65d2d6e9eeffd4b32dde1245962b3f43907d0 rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNCAsyncStorage: c43e6d71e13bb4748503797784839e0fbbf89d56 + RNCAsyncStorage: 014a78b2cc8cc107c9e92ee428dc0c1ac3223416 RNDeviceInfo: 1e3f62b9ec32f7754fac60bd06b8f8a27124e7f0 RNFlashList: ade81b4e928ebd585dd492014d40fb8d0e848aab RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 diff --git a/packages/react-native-hms/example/package-lock.json b/packages/react-native-hms/example/package-lock.json index 8636004c2..9b39871d4 100644 --- a/packages/react-native-hms/example/package-lock.json +++ b/packages/react-native-hms/example/package-lock.json @@ -1,12 +1,12 @@ { "name": "RNHMSExample", - "version": "1.9.12", + "version": "1.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "RNHMSExample", - "version": "1.9.12", + "version": "1.10.0", "hasInstallScript": true, "dependencies": { "@miblanchard/react-native-slider": "^2.0.2", @@ -2765,9 +2765,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2799,9 +2799,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2817,9 +2817,9 @@ } }, "node_modules/@react-native-async-storage/async-storage": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.22.0.tgz", - "integrity": "sha512-b5KD010iiZnot86RbAaHpLuHwmPW2qA3SSN/OSZhd1kBoINEQEVBuv+uFtcaTxAhX27bT0wd13GOb2IOSDUXSA==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.22.2.tgz", + "integrity": "sha512-nZpzT4Wz1OkVdQaZP/awpDCTKiPzdmG0PYmRF37ZeJlfwlwOg55in0TP2YUOW0MhOCRiNMomWWLojDLv5j2OIw==", "dependencies": { "merge-options": "^3.0.4" }, @@ -3571,9 +3571,9 @@ "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==" }, "node_modules/@react-navigation/core": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.10.tgz", - "integrity": "sha512-oYhqxETRHNHKsipm/BtGL0LI43Hs2VSFoWMbBdHK9OqgQPjTVUitslgLcPpo4zApCcmBWoOLX2qPxhsBda644A==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.11.tgz", + "integrity": "sha512-kOCyOc1L0lAl53DbyNl3OkUJwSFKSaVCsV8leJawUXMXJ1FTT3nbS3xMOqbZuchxIbl8T62sZ7YnlWG/21rcMw==", "dependencies": { "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", @@ -3587,9 +3587,9 @@ } }, "node_modules/@react-navigation/elements": { - "version": "1.3.22", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.22.tgz", - "integrity": "sha512-HYKucs0TwQT8zMvgoZbJsY/3sZfzeP8Dk9IDv4agst3zlA7ReTx4+SROCG6VGC7JKqBCyQykHIwkSwxhapoc+Q==", + "version": "1.3.24", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.24.tgz", + "integrity": "sha512-zgZV50qjlv3/N+MzNV0DIRmtg30IZcR0+LaTQRP/OxLtveQkgUG6wIEKl6SXO2ykC9yF9V82msdCzKl9uPSQCA==", "peerDependencies": { "@react-navigation/native": "^6.0.0", "react": "*", @@ -3598,11 +3598,11 @@ } }, "node_modules/@react-navigation/native": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.10.tgz", - "integrity": "sha512-jDG89TbZItY7W7rIcS1RqT63vWOPD4XuQLNKqZO0DY7mKnKh/CGBd0eg3nDMXUl143Qp//IxJKe2TfBQRDEU4A==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.12.tgz", + "integrity": "sha512-t6y7sDCr0HlMf+5TuVjLjyi0ySs0eNGfreDKcWOMEi5wooNFM4LhcUCdEVylpwCPfjQMW/lNVomNromqZFM6HQ==", "dependencies": { - "@react-navigation/core": "^6.4.10", + "@react-navigation/core": "^6.4.11", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.1.23" @@ -3613,11 +3613,11 @@ } }, "node_modules/@react-navigation/native-stack": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.18.tgz", - "integrity": "sha512-PSe0qjROy8zD78ehW048NSuzWRktioSCJmB8LzWSR65ndgVaC2rO+xvgyjhHjqm01YdyVM1XTct2EorSjDV2Ow==", + "version": "6.9.20", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.20.tgz", + "integrity": "sha512-/QXOVJGLPNGv0RXisyI5ld9oaKAdVzwcF88Q1pOA1Icp8Yce036bcixJXBsVuUhqYCJ5cBtojWt5mW6za3cRBw==", "dependencies": { - "@react-navigation/elements": "^1.3.22", + "@react-navigation/elements": "^1.3.24", "warn-once": "^0.1.0" }, "peerDependencies": { @@ -3802,9 +3802,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", "dependencies": { "undici-types": "~5.26.4" } @@ -3827,9 +3827,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "17.0.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", - "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "version": "17.0.76", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.76.tgz", + "integrity": "sha512-w9Aq+qeszGYoQM0hgFcdsAODGJdogadBDiitPm+zjBFJ0mLymvn2qSXsDaLJUndFRqqXk1FQfa9avHUBk1JhJQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3885,9 +3885,9 @@ } }, "node_modules/@types/react-test-renderer/node_modules/@types/react": { - "version": "16.14.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.56.tgz", - "integrity": "sha512-MxuHB7dvVm5yOxRr7hJoonLG0JY8YvqZtaQ9Quirp3Oe4FLFjAgxkxsKE6IspdHPpRVZKo2ZoDEravWO81EeYA==", + "version": "16.14.57", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.57.tgz", + "integrity": "sha512-fuNq/GV1a6GgqSuVuC457vYeTbm4E1CUBQVZwSPxqYnRhIzSXCJ1gGqyv+PKhqLyfbKCga9dXHJDzv+4XE41fw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -4564,10 +4564,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -5148,9 +5151,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "funding": [ { "type": "opencollective", @@ -5803,9 +5806,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==" }, "node_modules/emittery": { "version": "0.7.2", @@ -5995,14 +5998,14 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7062,9 +7065,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flow-parser": { @@ -7398,9 +7401,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -7749,9 +7752,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" }, "node_modules/is-accessor-descriptor": { "version": "1.0.1", @@ -8015,9 +8018,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -8100,12 +8103,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8323,9 +8329,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -9919,9 +9925,9 @@ } }, "node_modules/joi": { - "version": "17.12.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", - "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -11869,6 +11875,15 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13442,14 +13457,15 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14519,12 +14535,12 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, @@ -14533,15 +14549,16 @@ } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -14551,16 +14568,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -14570,14 +14588,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/packages/react-native-hms/example/package.json b/packages/react-native-hms/example/package.json index c4b07b1b7..b4e39cc73 100644 --- a/packages/react-native-hms/example/package.json +++ b/packages/react-native-hms/example/package.json @@ -1,6 +1,6 @@ { "name": "RNHMSExample", - "version": "1.9.12", + "version": "1.10.0", "private": true, "scripts": { "preinstall": "cd ../ && npm install && cd ./example", diff --git a/packages/react-native-hms/ios/HMSInteractivityDecoder.swift b/packages/react-native-hms/ios/HMSInteractivityDecoder.swift index 89d9b84d3..7df6f0120 100644 --- a/packages/react-native-hms/ios/HMSInteractivityDecoder.swift +++ b/packages/react-native-hms/ios/HMSInteractivityDecoder.swift @@ -220,4 +220,54 @@ class HMSInteractivityDecoder { } return result } + + static func getLeaderboardResponse(_ response: HMSPollLeaderboardResponse) -> [String: AnyHashable] { + var result = [String: AnyHashable]() + + result["hasNext"] = response.hasNext + + result["summary"] = getLeaderboardSummary(response.summary) + + result["entries"] = getLeaderboardEntries(response.entries) + + return result + } + + static func getLeaderboardSummary(_ summary: HMSPollLeaderboardSummary) -> [String: AnyHashable] { + var result = [String: AnyHashable]() + + result["averageScore"] = summary.averageScore + result["averageTime"] = summary.averageTime + result["totalPeersCount"] = summary.totalPeersCount + result["respondedCorrectlyPeersCount"] = summary.respondedCorrectlyPeersCount + result["respondedPeersCount"] = summary.respondedPeersCount + + return result + } + + static func getLeaderboardEntries(_ entries: [HMSPollLeaderboardEntry]) -> [[String: AnyHashable]] { + var result = [[String: AnyHashable]]() + + for entry in entries { + result.append(getLeaderboardEntry(entry)) + } + + return result + } + + static func getLeaderboardEntry(_ entry: HMSPollLeaderboardEntry) -> [String: AnyHashable] { + var result = [String: AnyHashable]() + + result["duration"] = entry.duration + result["totalResponses"] = entry.totalResponses + result["correctResponses"] = entry.correctResponses + result["position"] = entry.position + result["score"] = entry.score + + if let peer = entry.peer { + result["peer"] = getHMSPollResponsePeerInfo(peer) + } + + return result + } } diff --git a/packages/react-native-hms/ios/HMSManager.m b/packages/react-native-hms/ios/HMSManager.m index 223708fad..205eee78c 100644 --- a/packages/react-native-hms/ios/HMSManager.m +++ b/packages/react-native-hms/ios/HMSManager.m @@ -107,6 +107,10 @@ @interface RCT_EXTERN_MODULE (HMSManager, RCTEventEmitter) : (NSDictionary)data : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) +RCT_EXTERN_METHOD(sendHLSTimedMetadata + : (NSDictionary)data + : (RCTPromiseResolveBlock)resolve + : (RCTPromiseRejectBlock)reject) RCT_EXTERN_METHOD(changeName : (NSDictionary)data : (RCTPromiseResolveBlock)resolve @@ -313,4 +317,9 @@ @interface RCT_EXTERN_MODULE (HMSManager, RCTEventEmitter) : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) +RCT_EXTERN_METHOD(fetchLeaderboard + : (NSDictionary)data + : (RCTPromiseResolveBlock)resolve + : (RCTPromiseRejectBlock)reject) + @end diff --git a/packages/react-native-hms/ios/HMSManager.swift b/packages/react-native-hms/ios/HMSManager.swift index 1f99c40be..fa5816d5c 100644 --- a/packages/react-native-hms/ios/HMSManager.swift +++ b/packages/react-native-hms/ios/HMSManager.swift @@ -349,7 +349,7 @@ class HMSManager: RCTEventEmitter { hms?.stopRtmpAndRecording(resolve, reject) } - // MARK: - HLS Streaming & Recording + // MARK: - HLS Streaming @objc func startHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { @@ -365,6 +365,15 @@ class HMSManager: RCTEventEmitter { hms?.stopHLSStreaming(resolve, reject) } + @objc + func sendHLSTimedMetadata(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { + guard let rnsdk = HMSHelper.getHms(data, hmsCollection) else { + reject?("6004", "HMSRNSDK instance not found!", nil) + return + } + rnsdk.sendHLSTimedMetadata(data, resolve, reject) + } + // MARK: - Screen Share @objc @@ -672,4 +681,13 @@ class HMSManager: RCTEventEmitter { } interactivity.stop(data, resolve, reject) } + + @objc + func fetchLeaderboard(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { + guard let rnsdk = HMSHelper.getHms(data, hmsCollection), let interactivity = rnsdk.interactivity else { + reject?("6004", "HMSRNSDK instance not found!", nil) + return + } + interactivity.fetchLeaderboard(data, resolve, reject) + } } diff --git a/packages/react-native-hms/ios/HMSRNInteractivityCenter.swift b/packages/react-native-hms/ios/HMSRNInteractivityCenter.swift index 4ca6a6423..abccab8b5 100644 --- a/packages/react-native-hms/ios/HMSRNInteractivityCenter.swift +++ b/packages/react-native-hms/ios/HMSRNInteractivityCenter.swift @@ -86,4 +86,35 @@ class HMSRNInteractivityCenter { resolve?(success) }) } + + func fetchLeaderboard(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { + guard let pollId = data["pollId"] as? String, + let poll = self.hmssdk?.interactivityCenter.polls.first(where: {poll in poll.pollID == pollId}) else { + reject?("6004", "Unable to find HMSPoll with given pollId", nil) + return + } + + guard let count = data["count"] as? Int, + let startIndex = data["startIndex"] as? Int + else { + reject?("6004", "Unable to find required parameters", nil) + return + } + + let includeCurrentPeer = data["includeCurrentPeer"] as? Bool ?? false + + self.hmssdk?.interactivityCenter.fetchLeaderboard(for: poll, offset: startIndex, count: count, includeCurrentPeer: includeCurrentPeer) { response, error in + + if let nonnilError = error { + reject?("6004", nonnilError.localizedDescription, nil) + return + } + + if let response = response { + resolve?(HMSInteractivityDecoder.getLeaderboardResponse(response)) + } else { + reject?("6004", "Could not fetch leaderboard response", nil) + } + } + } } diff --git a/packages/react-native-hms/ios/HMSRNSDK.swift b/packages/react-native-hms/ios/HMSRNSDK.swift index bf7dea017..13e7c753c 100644 --- a/packages/react-native-hms/ios/HMSRNSDK.swift +++ b/packages/react-native-hms/ios/HMSRNSDK.swift @@ -797,6 +797,8 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { }) } + // MARK: - HLS Streaming + func startHLSStreaming(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { let recordConfig = HMSHelper.getHlsRecordingConfig(data.value(forKey: "hlsRecordingConfig") as? NSDictionary) let hlsMeetingUrlVariant = HMSHelper.getHMSHLSMeetingURLVariants(data.value(forKey: "meetingURLVariants") as? [[String: Any]]) @@ -828,6 +830,38 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { }) } + func sendHLSTimedMetadata(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { + guard let metadataArrayList = data["metadata"] as? [NSDictionary] else { + let errorMessage = "\(#function) metadata for sendHLSTimedMetadata was not found" + reject?("6004", errorMessage, nil) + return + } + + let metadata = metadataArrayList.compactMap { (dict: NSDictionary) -> HMSHLSTimedMetadata? in + guard let payload = dict["payload"] as? String else { + return nil + } + if let duration = dict["duration"] as? Int { + return HMSHLSTimedMetadata(payload: payload, duration: duration) + } else { + return HMSHLSTimedMetadata(payload: payload) + } + } + + DispatchQueue.main.async { [weak self] in + self?.hms?.sendHLSTimedMetadata(metadata) { success, error in + if let error = error as? HMSError { + print(#function, "Unable to send metadata: \(error)") + reject?("6004", error.localizedDescription, nil) + } + + resolve?(success) + } + } + } + + // MARK: - + func changeName(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) { guard let name = data.value(forKey: "name") as? String else { diff --git a/packages/react-native-hms/package-lock.json b/packages/react-native-hms/package-lock.json index 1f1274754..4cc200399 100644 --- a/packages/react-native-hms/package-lock.json +++ b/packages/react-native-hms/package-lock.json @@ -1,12 +1,12 @@ { "name": "@100mslive/react-native-hms", - "version": "1.9.12", + "version": "1.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@100mslive/react-native-hms", - "version": "1.9.12", + "version": "1.10.0", "license": "MIT", "dependencies": { "zustand": "^4.3.8" @@ -3417,9 +3417,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -3455,9 +3455,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4673,9 +4673,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4706,9 +4706,9 @@ "devOptional": true }, "node_modules/@types/react": { - "version": "16.14.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.56.tgz", - "integrity": "sha512-MxuHB7dvVm5yOxRr7hJoonLG0JY8YvqZtaQ9Quirp3Oe4FLFjAgxkxsKE6IspdHPpRVZKo2ZoDEravWO81EeYA==", + "version": "16.14.57", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.57.tgz", + "integrity": "sha512-fuNq/GV1a6GgqSuVuC457vYeTbm4E1CUBQVZwSPxqYnRhIzSXCJ1gGqyv+PKhqLyfbKCga9dXHJDzv+4XE41fw==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -4726,9 +4726,9 @@ } }, "node_modules/@types/react-native/node_modules/@types/react": { - "version": "17.0.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", - "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "version": "17.0.76", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.76.tgz", + "integrity": "sha512-w9Aq+qeszGYoQM0hgFcdsAODGJdogadBDiitPm+zjBFJ0mLymvn2qSXsDaLJUndFRqqXk1FQfa9avHUBk1JhJQ==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -5421,10 +5421,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6019,9 +6022,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "dev": true, "funding": [ { @@ -6868,9 +6871,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", "dev": true }, "node_modules/emittery": { @@ -7068,14 +7071,14 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -8158,9 +8161,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flow-parser": { @@ -8582,9 +8585,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -9145,9 +9148,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "node_modules/is-absolute": { @@ -9458,9 +9461,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -9585,12 +9588,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9843,9 +9849,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -11429,9 +11435,9 @@ } }, "node_modules/joi": { - "version": "17.12.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", - "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", "dev": true, "dependencies": { "@hapi/hoek": "^9.3.0", @@ -13609,6 +13615,15 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15234,14 +15249,15 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16414,12 +16430,12 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, @@ -16428,15 +16444,16 @@ } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16446,16 +16463,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16465,14 +16483,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/packages/react-native-hms/package.json b/packages/react-native-hms/package.json index 571affa8a..361526d43 100644 --- a/packages/react-native-hms/package.json +++ b/packages/react-native-hms/package.json @@ -1,6 +1,6 @@ { "name": "@100mslive/react-native-hms", - "version": "1.9.12", + "version": "1.10.0", "description": "Integrate Real Time Audio and Video conferencing, Interactive Live Streaming, and Chat in your apps with 100ms React Native SDK. With support for HLS and RTMP Live Streaming and Recording, Picture-in-Picture (PiP), one-to-one Video Call Modes, Audio Rooms, Video Player and much more, add immersive real-time communications to your apps.", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/packages/react-native-hms/sdk-versions.json b/packages/react-native-hms/sdk-versions.json index 08b197f16..78182f2a4 100644 --- a/packages/react-native-hms/sdk-versions.json +++ b/packages/react-native-hms/sdk-versions.json @@ -1,6 +1,6 @@ { - "ios": "1.5.1", + "ios": "1.6.0", "iOSBroadcastExtension": "0.0.9", "iOSHMSHLSPlayer": "0.0.2", - "android": "2.9.3" + "android": "2.9.4" } diff --git a/packages/react-native-hms/src/classes/HMSHLSTimedMetadata.ts b/packages/react-native-hms/src/classes/HMSHLSTimedMetadata.ts new file mode 100644 index 000000000..ceb7ea9c0 --- /dev/null +++ b/packages/react-native-hms/src/classes/HMSHLSTimedMetadata.ts @@ -0,0 +1,4 @@ +export interface HMSHLSTimedMetadata { + payload: string; + duration: number; +} diff --git a/packages/react-native-hms/src/classes/HMSInteractivityCenter.ts b/packages/react-native-hms/src/classes/HMSInteractivityCenter.ts index ac10da22f..fb3e39488 100644 --- a/packages/react-native-hms/src/classes/HMSInteractivityCenter.ts +++ b/packages/react-native-hms/src/classes/HMSInteractivityCenter.ts @@ -10,6 +10,8 @@ import HMSNativeEventListener from './HMSNativeEventListener'; import type { HMSEventSubscription } from './HMSNativeEventEmitter'; import { HMSInteractivityEncoder } from './HMSInteractivityEncoder'; import { HMSHelper } from './HMSHelper'; +import type { PollLeaderboardResponse } from './polls/PollLeaderboardResponse'; +import type { DecodedPollLeaderboardResponse } from './polls/DecodedPollLeaderboardResponse'; type PollUpdateListener = (data: { updatedPoll: HMSPoll; @@ -134,4 +136,32 @@ export class HMSInteractivityCenter { logger?.verbose('#Function stop', JSON.stringify(data)); return HMSManager.stopPoll(data); } + + /** + * Fetches the leaderboard for a poll + * @param pollId - The id of the poll + * @param count - The number of entries to fetch + * @param startIndex - The index to start fetching from + * @param includeCurrentPeer - Whether to include the current peer in the fetched leaderboard entries + * @returns Promise + */ + async fetchLeaderboard( + pollId: string, + count: number, + startIndex: number, + includeCurrentPeer: boolean + ): Promise { + const data = { + id: HMSConstants.DEFAULT_SDK_ID, + pollId, + count, + startIndex, + includeCurrentPeer, + }; + logger?.verbose('#Function fetchLeaderboard', data); + + const response: DecodedPollLeaderboardResponse = + await HMSManager.fetchLeaderboard(data); + return HMSInteractivityEncoder.transformPollLeaderboardResponse(response); + } } diff --git a/packages/react-native-hms/src/classes/HMSInteractivityEncoder.ts b/packages/react-native-hms/src/classes/HMSInteractivityEncoder.ts index 27d4d14a9..d45ccc667 100644 --- a/packages/react-native-hms/src/classes/HMSInteractivityEncoder.ts +++ b/packages/react-native-hms/src/classes/HMSInteractivityEncoder.ts @@ -1,4 +1,7 @@ +import { HMSEncoder } from './HMSEncoder'; +import type { DecodedPollLeaderboardResponse } from './polls/DecodedPollLeaderboardResponse'; import type { HMSPoll } from './polls/HMSPoll'; +import type { PollLeaderboardResponse } from './polls/PollLeaderboardResponse'; export class HMSInteractivityEncoder { static transformPoll(poll: HMSPoll): HMSPoll { @@ -20,10 +23,62 @@ export class HMSInteractivityEncoder { poll.stoppedAt = new Date(dateNum); } } - // poll.rolesThatCanVote: HMSRole[]; - // poll.rolesThatCanViewResponses: HMSRole[]; + if (poll.createdBy) { + poll.createdBy = HMSEncoder.encodeHmsPeer(poll.createdBy); + } + if (poll.startedBy) { + poll.startedBy = HMSEncoder.encodeHmsPeer(poll.startedBy); + } + if (poll.stoppedBy) { + poll.stoppedBy = HMSEncoder.encodeHmsPeer(poll.stoppedBy); + } + if (poll.rolesThatCanVote) { + poll.rolesThatCanVote = poll.rolesThatCanVote.map((role) => + HMSEncoder.encodeHmsRole(role) + ); + } + if (poll.rolesThatCanViewResponses) { + poll.rolesThatCanViewResponses = poll.rolesThatCanViewResponses.map( + (role) => HMSEncoder.encodeHmsRole(role) + ); + } + // --- poll.questions: HMSPollQuestion[] // --- poll.result: HMSPollResult return poll; } + + static transformPollLeaderboardResponse( + decodedPollLeaderboardResponse: DecodedPollLeaderboardResponse + ): PollLeaderboardResponse { + const summary = decodedPollLeaderboardResponse.summary; + if (summary) { + if (typeof summary.averageTime === 'string') { + summary.averageTime = parseInt(summary.averageTime); + } + } + + const entries = decodedPollLeaderboardResponse.entries; + if (entries) { + entries.forEach((entry) => { + if (typeof entry.duration === 'string') { + entry.duration = parseInt(entry.duration); + } + if (typeof entry.totalResponses === 'string') { + entry.totalResponses = parseInt(entry.totalResponses); + } + if (typeof entry.correctResponses === 'string') { + entry.correctResponses = parseInt(entry.correctResponses); + } + if (typeof entry.position === 'string') { + entry.position = parseInt(entry.position); + } + if (typeof entry.score === 'string') { + entry.score = parseInt(entry.score); + } + }); + } + + return decodedPollLeaderboardResponse as PollLeaderboardResponse; + } } diff --git a/packages/react-native-hms/src/classes/HMSSDK.tsx b/packages/react-native-hms/src/classes/HMSSDK.tsx index dccbebe8e..5316c65b0 100644 --- a/packages/react-native-hms/src/classes/HMSSDK.tsx +++ b/packages/react-native-hms/src/classes/HMSSDK.tsx @@ -47,6 +47,7 @@ import type { HMSPeerListIteratorOptions } from './HMSPeerListIteratorOptions'; import { HMSPeerListIterator } from './HMSPeerListIterator'; import type { HMSPIPConfig } from './HMSPIPConfig'; import { HMSInteractivityCenter } from './HMSInteractivityCenter'; +import type { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata'; type HmsViewProps = Omit; @@ -430,6 +431,19 @@ export class HMSSDK { return await HMSManager.stopHLSStreaming({ id: this.id }); }; + /** + * send timed metadata for HLS player + * @param metadata list of {@link HMSHLSTimedMetadata} to be sent + * @returns Promise + */ + sendHLSTimedMetadata = async ( + metadata: HMSHLSTimedMetadata[] + ): Promise => { + const data = { metadata, id: this.id }; + logger?.verbose('#Function sendHLSTimedMetadata', data); + return await HMSManager.sendHLSTimedMetadata(data); + }; + /** * @deprecated This function has been deprecated in favor of #Function changeRoleOfPeer * diff --git a/packages/react-native-hms/src/classes/polls/DecodedPollLeaderboardResponse.ts b/packages/react-native-hms/src/classes/polls/DecodedPollLeaderboardResponse.ts new file mode 100644 index 000000000..17a288768 --- /dev/null +++ b/packages/react-native-hms/src/classes/polls/DecodedPollLeaderboardResponse.ts @@ -0,0 +1,43 @@ +import type { HMSPollLeaderboardEntry } from './HMSPollLeaderboardEntry'; +import type { HMSPollLeaderboardSummary } from './HMSPollLeaderboardSummary'; +import type { PollLeaderboardResponse } from './PollLeaderboardResponse'; + +type NumberString = string; + +export interface DecodedPollLeaderboardResponse + extends Pick { + entries?: DecodedHMSPollLeaderboardEntry[]; + summary?: DecodedHMSPollLeaderboardSummary; +} + +export interface DecodedHMSPollLeaderboardEntry + extends Pick { + /** + * convert this value to number + */ + duration?: NumberString | number; + /** + * convert this value to number + */ + totalResponses?: NumberString | number; + /** + * convert this value to number + */ + correctResponses?: NumberString | number; + /** + * convert this value to number + */ + position?: NumberString | number; + /** + * convert this value to number + */ + score?: NumberString | number; +} + +export interface DecodedHMSPollLeaderboardSummary + extends Omit { + /** + * convert this value to number + */ + averageTime?: NumberString | number; +} diff --git a/packages/react-native-hms/src/classes/polls/HMSPoll.ts b/packages/react-native-hms/src/classes/polls/HMSPoll.ts index 56c9f6c04..dc4d8a554 100644 --- a/packages/react-native-hms/src/classes/polls/HMSPoll.ts +++ b/packages/react-native-hms/src/classes/polls/HMSPoll.ts @@ -6,15 +6,6 @@ import type { HMSPollUserTrackingMode } from './HMSPollUserTrackingMode'; import type { HMSPollType } from './HMSPollType'; import type { HMSPeer } from '../HMSPeer'; -type HMSPeerSubset = { - peerID: HMSPeer['peerID']; - name: HMSPeer['name']; -}; - -type HMSRoleSubset = { - name: HMSRole['name']; -}; - export interface HMSPoll { /** The unique identifier of the poll. @@ -44,27 +35,27 @@ export interface HMSPoll { /** The roles that can vote in the poll. */ - rolesThatCanVote?: HMSRoleSubset[]; + rolesThatCanVote?: HMSRole[]; /** The roles that can view the poll responses. */ - rolesThatCanViewResponses?: HMSRoleSubset[]; + rolesThatCanViewResponses?: HMSRole[]; /** The peer who started the poll. */ - startedBy?: HMSPeerSubset; + startedBy?: HMSPeer; /** The peer who stopped the poll. */ - stoppedBy?: HMSPeerSubset; + stoppedBy?: HMSPeer; /** The peer who created the poll. */ - createdBy?: HMSPeerSubset; + createdBy?: HMSPeer; /** The date and time when the poll was started. diff --git a/packages/react-native-hms/src/classes/polls/HMSPollCreateParams.ts b/packages/react-native-hms/src/classes/polls/HMSPollCreateParams.ts index 15f80034d..bbcf51e4d 100644 --- a/packages/react-native-hms/src/classes/polls/HMSPollCreateParams.ts +++ b/packages/react-native-hms/src/classes/polls/HMSPollCreateParams.ts @@ -1,4 +1,3 @@ -import type { HMSRole } from '../HMSRole'; import type { HMSPoll } from './HMSPoll'; import type { HMSPollQuestionCreateParams } from './HMSPollQuestionCreateParams'; @@ -12,9 +11,9 @@ export interface HMSPollCreateParams // | 'visibility' // | 'locked' | 'mode' + | 'rolesThatCanVote' + | 'rolesThatCanViewResponses' > { pollId?: HMSPoll['pollId']; questions?: HMSPollQuestionCreateParams[]; - rolesThatCanVote?: HMSRole[]; - rolesThatCanViewResponses?: HMSRole[]; } diff --git a/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardEntry.ts b/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardEntry.ts new file mode 100644 index 000000000..5ed159de5 --- /dev/null +++ b/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardEntry.ts @@ -0,0 +1,10 @@ +import type { HMSPollResponsePeerInfo } from './HMSPollResponsePeerInfo'; + +export interface HMSPollLeaderboardEntry { + duration?: number; + totalResponses?: number; + correctResponses?: number; + position?: number; + score?: number; + peer?: HMSPollResponsePeerInfo; +} diff --git a/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardSummary.ts b/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardSummary.ts new file mode 100644 index 000000000..860d22b09 --- /dev/null +++ b/packages/react-native-hms/src/classes/polls/HMSPollLeaderboardSummary.ts @@ -0,0 +1,7 @@ +export interface HMSPollLeaderboardSummary { + averageScore?: number; + averageTime?: number; + respondedCorrectlyPeersCount?: number; + respondedPeersCount?: number; + totalPeersCount?: number; +} diff --git a/packages/react-native-hms/src/classes/polls/PollLeaderboardResponse.ts b/packages/react-native-hms/src/classes/polls/PollLeaderboardResponse.ts new file mode 100644 index 000000000..c4b3bd9c7 --- /dev/null +++ b/packages/react-native-hms/src/classes/polls/PollLeaderboardResponse.ts @@ -0,0 +1,8 @@ +import type { HMSPollLeaderboardEntry } from './HMSPollLeaderboardEntry'; +import type { HMSPollLeaderboardSummary } from './HMSPollLeaderboardSummary'; + +export interface PollLeaderboardResponse { + entries?: HMSPollLeaderboardEntry[]; + hasNext?: boolean; + summary?: HMSPollLeaderboardSummary; +} diff --git a/packages/react-native-hms/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx b/packages/react-native-hms/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx index 5c5abd435..5132f6139 100644 --- a/packages/react-native-hms/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +++ b/packages/react-native-hms/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx @@ -1,4 +1,4 @@ -import React, { useImperativeHandle, useRef, useState } from 'react'; +import React, { useImperativeHandle, useRef } from 'react'; import { View, StyleSheet, UIManager, findNodeHandle } from 'react-native'; import type { StyleProp, ViewStyle } from 'react-native'; @@ -56,8 +56,6 @@ const _HMSHLSPlayer: React.ForwardRefRenderFunction< ) => { const hmsHlsPlayerRef = useRef(null); - const [aspectRatio, setAspectRatio] = useState(16 / 9); - useImperativeHandle( ref, () => ({ @@ -204,12 +202,6 @@ const _HMSHLSPlayer: React.ForwardRefRenderFunction< HMSHLSPlayerPlaybackEventTypes.ON_PLAYBACK_RESOLUTION_CHANGE_EVENT ) { setHMSHLSPlayerResolution({ ...data }); - - const aspectRatio = data.width / data.height; - - if (typeof aspectRatio === 'number' && !isNaN(aspectRatio)) { - setAspectRatio(aspectRatio); - } } else { setHMSHLSPlayerPlaybackState(data.state); } @@ -232,10 +224,7 @@ const _HMSHLSPlayer: React.ForwardRefRenderFunction< CFBundlePackageType APPL CFBundleShortVersionString - 2.3.177 + 2.3.183 CFBundleSignature ???? CFBundleVersion - 427 + 433 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/packages/react-native-room-kit/example/package-lock.json b/packages/react-native-room-kit/example/package-lock.json index c947716f0..41dc8dfef 100644 --- a/packages/react-native-room-kit/example/package-lock.json +++ b/packages/react-native-room-kit/example/package-lock.json @@ -1,12 +1,12 @@ { "name": "RNExample", - "version": "1.1.2", + "version": "1.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "RNExample", - "version": "1.1.2", + "version": "1.1.3", "dependencies": { "@react-native-async-storage/async-storage": "1.17.11", "@react-native-community/blur": "^4.3.2", @@ -2901,9 +2901,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2935,9 +2935,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4078,9 +4078,9 @@ "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==" }, "node_modules/@react-navigation/core": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.10.tgz", - "integrity": "sha512-oYhqxETRHNHKsipm/BtGL0LI43Hs2VSFoWMbBdHK9OqgQPjTVUitslgLcPpo4zApCcmBWoOLX2qPxhsBda644A==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.11.tgz", + "integrity": "sha512-kOCyOc1L0lAl53DbyNl3OkUJwSFKSaVCsV8leJawUXMXJ1FTT3nbS3xMOqbZuchxIbl8T62sZ7YnlWG/21rcMw==", "dependencies": { "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", @@ -4094,9 +4094,9 @@ } }, "node_modules/@react-navigation/elements": { - "version": "1.3.22", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.22.tgz", - "integrity": "sha512-HYKucs0TwQT8zMvgoZbJsY/3sZfzeP8Dk9IDv4agst3zlA7ReTx4+SROCG6VGC7JKqBCyQykHIwkSwxhapoc+Q==", + "version": "1.3.24", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.24.tgz", + "integrity": "sha512-zgZV50qjlv3/N+MzNV0DIRmtg30IZcR0+LaTQRP/OxLtveQkgUG6wIEKl6SXO2ykC9yF9V82msdCzKl9uPSQCA==", "peerDependencies": { "@react-navigation/native": "^6.0.0", "react": "*", @@ -4309,9 +4309,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", "dependencies": { "undici-types": "~5.26.4" } @@ -4334,9 +4334,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "17.0.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", - "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "version": "17.0.76", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.76.tgz", + "integrity": "sha512-w9Aq+qeszGYoQM0hgFcdsAODGJdogadBDiitPm+zjBFJ0mLymvn2qSXsDaLJUndFRqqXk1FQfa9avHUBk1JhJQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4367,9 +4367,9 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/semver": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -5265,10 +5265,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -5813,9 +5816,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "funding": [ { "type": "opencollective", @@ -6477,9 +6480,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==" }, "node_modules/emittery": { "version": "0.7.2", @@ -6669,14 +6672,14 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7755,9 +7758,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flow-parser": { @@ -8138,9 +8141,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -8486,9 +8489,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" }, "node_modules/is-accessor-descriptor": { "version": "1.0.1", @@ -8752,9 +8755,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -8837,12 +8840,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9060,9 +9066,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -10696,9 +10702,9 @@ } }, "node_modules/joi": { - "version": "17.12.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", - "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -12725,6 +12731,15 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -14267,14 +14282,15 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15335,12 +15351,12 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, @@ -15349,15 +15365,16 @@ } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -15367,16 +15384,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -15386,14 +15404,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/packages/react-native-room-kit/example/package.json b/packages/react-native-room-kit/example/package.json index eee7202b9..31b06e073 100644 --- a/packages/react-native-room-kit/example/package.json +++ b/packages/react-native-room-kit/example/package.json @@ -1,6 +1,6 @@ { "name": "RNExample", - "version": "1.1.2", + "version": "1.1.3", "private": true, "scripts": { "android": "react-native run-android", diff --git a/packages/react-native-room-kit/example/src/redux/reducers/appState.ts b/packages/react-native-room-kit/example/src/redux/reducers/appState.ts index 9eb527b30..1ec46a88b 100644 --- a/packages/react-native-room-kit/example/src/redux/reducers/appState.ts +++ b/packages/react-native-room-kit/example/src/redux/reducers/appState.ts @@ -1,4 +1,3 @@ -import { getMeetingUrl } from '../../utils/functions'; import ActionTypes from '../actionTypes'; type ActionType = { @@ -34,7 +33,7 @@ const INITIAL_STATE: InitialStateType = { softwareDecoder: true, // Android only autoResize: false, // Android only autoSimulcast: true, - staticUserId: false, + staticUserId: true, }, }; diff --git a/packages/react-native-room-kit/package-lock.json b/packages/react-native-room-kit/package-lock.json index e51abca02..3e68fc1b5 100644 --- a/packages/react-native-room-kit/package-lock.json +++ b/packages/react-native-room-kit/package-lock.json @@ -1,15 +1,15 @@ { "name": "@100mslive/react-native-room-kit", - "version": "1.1.2", + "version": "1.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@100mslive/react-native-room-kit", - "version": "1.1.2", + "version": "1.1.3", "license": "MIT", "dependencies": { - "@100mslive/types-prebuilt": "^0.12.4", + "@100mslive/types-prebuilt": "^0.12.7", "@react-navigation/native": "^6.0.8", "react-redux": "^7.2.4", "redux": "^4.1.0" @@ -40,7 +40,7 @@ "node": ">= 16.0.0" }, "peerDependencies": { - "@100mslive/react-native-hms": "1.9.12", + "@100mslive/react-native-hms": "1.10.0", "@react-native-community/blur": "^4.3.2", "@react-native-masked-view/masked-view": "^0.2.9", "@shopify/flash-list": "^1.4.3", @@ -56,9 +56,9 @@ } }, "node_modules/@100mslive/react-native-hms": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.9.12.tgz", - "integrity": "sha512-eDrgjZkmk6jge4hJq77aOs1RvxKPGvCMbbRctqq6KAEZGNrsp1/GfXEbO+niqPfBZGMoeZSsb4IyZF/sjrm8Rg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.10.0.tgz", + "integrity": "sha512-Bb7PWTDNJPpRjgZCT7w6kzsfTnK+Js3Pu6VLJQNtYa5IRVHxuHhRdgY07oysX15nRadlUGWoqQkpCRFHKnahQQ==", "peer": true, "dependencies": { "zustand": "^4.3.8" @@ -2760,18 +2760,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@evilmartians/lefthook": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.6.1.tgz", - "integrity": "sha512-4E35gOuECaf/+DaA0m1Q1U3BnaQclAUgK2UOYPyQOU0mCnvbMIqNJFiq2ArYuECEUIkTtAjoIzs1xkNFqUaOLQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.6.3.tgz", + "integrity": "sha512-rNPolIUKmMLzttnJ4tatfWgiwPTn7crdwH+A86LI8SNXnS6/+HeZN8bC6xaUp+4t4deh4hIQWaxpZaxojUZyxw==", "cpu": [ "x64", "arm64", @@ -3733,9 +3733,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3767,9 +3767,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5187,9 +5187,9 @@ "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==" }, "node_modules/@react-navigation/core": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.10.tgz", - "integrity": "sha512-oYhqxETRHNHKsipm/BtGL0LI43Hs2VSFoWMbBdHK9OqgQPjTVUitslgLcPpo4zApCcmBWoOLX2qPxhsBda644A==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.11.tgz", + "integrity": "sha512-kOCyOc1L0lAl53DbyNl3OkUJwSFKSaVCsV8leJawUXMXJ1FTT3nbS3xMOqbZuchxIbl8T62sZ7YnlWG/21rcMw==", "dependencies": { "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", @@ -5203,11 +5203,11 @@ } }, "node_modules/@react-navigation/native": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.10.tgz", - "integrity": "sha512-jDG89TbZItY7W7rIcS1RqT63vWOPD4XuQLNKqZO0DY7mKnKh/CGBd0eg3nDMXUl143Qp//IxJKe2TfBQRDEU4A==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.12.tgz", + "integrity": "sha512-t6y7sDCr0HlMf+5TuVjLjyi0ySs0eNGfreDKcWOMEi5wooNFM4LhcUCdEVylpwCPfjQMW/lNVomNromqZFM6HQ==", "dependencies": { - "@react-navigation/core": "^6.4.10", + "@react-navigation/core": "^6.4.11", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.1.23" @@ -5523,9 +5523,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "17.0.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", - "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "version": "17.0.76", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.76.tgz", + "integrity": "sha512-w9Aq+qeszGYoQM0hgFcdsAODGJdogadBDiitPm+zjBFJ0mLymvn2qSXsDaLJUndFRqqXk1FQfa9avHUBk1JhJQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5558,9 +5558,9 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/semver": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -6384,10 +6384,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -7134,9 +7137,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "funding": [ { "type": "opencollective", @@ -8339,9 +8342,9 @@ } }, "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -8831,9 +8834,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==" }, "node_modules/emittery": { "version": "0.10.2", @@ -9036,14 +9039,14 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -9194,16 +9197,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -10225,9 +10228,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flow-parser": { @@ -10874,9 +10877,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -11526,9 +11529,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" }, "node_modules/ip-address": { "version": "9.0.5", @@ -12027,9 +12030,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -12164,12 +12167,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12452,9 +12458,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -14161,9 +14167,9 @@ } }, "node_modules/joi": { - "version": "17.12.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", - "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -17502,6 +17508,15 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18171,9 +18186,9 @@ } }, "node_modules/react-native-reanimated": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.7.0.tgz", - "integrity": "sha512-KM+MKa3CJWqsF4GlOLLKBxTR2NEcrg5/HP9J2b6Dfgvll1sjZPywCOEEIh967SboEU8N9LjYZuoVm2UoXGxp2Q==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.7.1.tgz", + "integrity": "sha512-bapCxhnS58+GZynQmA/f5U8vRlmhXlI/WhYg0dqnNAGXHNIc+38ahRWcG8iK8e0R2v9M8Ky2ZWObEC6bmweofg==", "peer": true, "dependencies": { "@babel/plugin-transform-object-assign": "^7.16.7", @@ -19043,9 +19058,9 @@ } }, "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -20000,14 +20015,15 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20311,9 +20327,9 @@ } }, "node_modules/socks": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", - "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -21175,12 +21191,12 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, @@ -21189,15 +21205,16 @@ } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -21207,16 +21224,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -21226,14 +21244,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -22196,9 +22220,9 @@ }, "dependencies": { "@100mslive/react-native-hms": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.9.12.tgz", - "integrity": "sha512-eDrgjZkmk6jge4hJq77aOs1RvxKPGvCMbbRctqq6KAEZGNrsp1/GfXEbO+niqPfBZGMoeZSsb4IyZF/sjrm8Rg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.10.0.tgz", + "integrity": "sha512-Bb7PWTDNJPpRjgZCT7w6kzsfTnK+Js3Pu6VLJQNtYa5IRVHxuHhRdgY07oysX15nRadlUGWoqQkpCRFHKnahQQ==", "peer": true, "requires": { "zustand": "^4.3.8" @@ -24043,15 +24067,15 @@ } }, "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@evilmartians/lefthook": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.6.1.tgz", - "integrity": "sha512-4E35gOuECaf/+DaA0m1Q1U3BnaQclAUgK2UOYPyQOU0mCnvbMIqNJFiq2ArYuECEUIkTtAjoIzs1xkNFqUaOLQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.6.3.tgz", + "integrity": "sha512-rNPolIUKmMLzttnJ4tatfWgiwPTn7crdwH+A86LI8SNXnS6/+HeZN8bC6xaUp+4t4deh4hIQWaxpZaxojUZyxw==", "dev": true }, "@hapi/hoek": { @@ -24773,9 +24797,9 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -24798,9 +24822,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -25920,9 +25944,9 @@ "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==" }, "@react-navigation/core": { - "version": "6.4.10", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.10.tgz", - "integrity": "sha512-oYhqxETRHNHKsipm/BtGL0LI43Hs2VSFoWMbBdHK9OqgQPjTVUitslgLcPpo4zApCcmBWoOLX2qPxhsBda644A==", + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.11.tgz", + "integrity": "sha512-kOCyOc1L0lAl53DbyNl3OkUJwSFKSaVCsV8leJawUXMXJ1FTT3nbS3xMOqbZuchxIbl8T62sZ7YnlWG/21rcMw==", "requires": { "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", @@ -25933,11 +25957,11 @@ } }, "@react-navigation/native": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.10.tgz", - "integrity": "sha512-jDG89TbZItY7W7rIcS1RqT63vWOPD4XuQLNKqZO0DY7mKnKh/CGBd0eg3nDMXUl143Qp//IxJKe2TfBQRDEU4A==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.12.tgz", + "integrity": "sha512-t6y7sDCr0HlMf+5TuVjLjyi0ySs0eNGfreDKcWOMEi5wooNFM4LhcUCdEVylpwCPfjQMW/lNVomNromqZFM6HQ==", "requires": { - "@react-navigation/core": "^6.4.10", + "@react-navigation/core": "^6.4.11", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.1.23" @@ -26222,9 +26246,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "@types/react": { - "version": "17.0.75", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", - "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "version": "17.0.76", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.76.tgz", + "integrity": "sha512-w9Aq+qeszGYoQM0hgFcdsAODGJdogadBDiitPm+zjBFJ0mLymvn2qSXsDaLJUndFRqqXk1FQfa9avHUBk1JhJQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -26257,9 +26281,9 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "@types/semver": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/stack-utils": { @@ -26845,10 +26869,13 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "babel-core": { "version": "7.0.0-bridge.0", @@ -27373,9 +27400,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==" + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==" }, "capture-exit": { "version": "2.0.0", @@ -28239,9 +28266,9 @@ "dev": true }, "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -28590,9 +28617,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==" }, "emittery": { "version": "0.10.2", @@ -28759,14 +28786,14 @@ } }, "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { @@ -28871,16 +28898,16 @@ } }, "eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -29619,9 +29646,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "flow-parser": { @@ -30101,9 +30128,9 @@ } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -30573,9 +30600,9 @@ } }, "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" }, "ip-address": { "version": "9.0.5", @@ -30918,9 +30945,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-npm": { @@ -31001,12 +31028,12 @@ "dev": true }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-ssh": { @@ -31210,9 +31237,9 @@ } }, "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -32472,9 +32499,9 @@ "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==" }, "joi": { - "version": "17.12.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", - "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", "requires": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -35066,6 +35093,12 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -35648,9 +35681,9 @@ } }, "react-native-reanimated": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.7.0.tgz", - "integrity": "sha512-KM+MKa3CJWqsF4GlOLLKBxTR2NEcrg5/HP9J2b6Dfgvll1sjZPywCOEEIh967SboEU8N9LjYZuoVm2UoXGxp2Q==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.7.1.tgz", + "integrity": "sha512-bapCxhnS58+GZynQmA/f5U8vRlmhXlI/WhYg0dqnNAGXHNIc+38ahRWcG8iK8e0R2v9M8Ky2ZWObEC6bmweofg==", "peer": true, "requires": { "@babel/plugin-transform-object-assign": "^7.16.7", @@ -36199,9 +36232,9 @@ } }, "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -36901,14 +36934,15 @@ } }, "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "requires": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "set-value": { @@ -37144,9 +37178,9 @@ } }, "socks": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", - "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dev": true, "requires": { "ip-address": "^9.0.5", @@ -37789,50 +37823,55 @@ "dev": true }, "typed-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", - "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "requires": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typedarray": { diff --git a/packages/react-native-room-kit/package.json b/packages/react-native-room-kit/package.json index 6edf0d2c4..00d6ef3d7 100644 --- a/packages/react-native-room-kit/package.json +++ b/packages/react-native-room-kit/package.json @@ -1,6 +1,6 @@ { "name": "@100mslive/react-native-room-kit", - "version": "1.1.2", + "version": "1.1.3", "description": "100ms Room Kit provides simple & easy to use UI components to build Live Streaming & Video Conferencing experiences in your apps.", "main": "lib/commonjs/index", "module": "lib/module/index", @@ -51,7 +51,7 @@ "registry": "https://registry.npmjs.org/" }, "dependencies": { - "@100mslive/types-prebuilt": "^0.12.4", + "@100mslive/types-prebuilt": "^0.12.7", "@react-navigation/native": "^6.0.8", "react-redux": "^7.2.4", "redux": "^4.1.0" @@ -79,7 +79,7 @@ "typescript": "^5.0.2" }, "peerDependencies": { - "@100mslive/react-native-hms": "1.9.12", + "@100mslive/react-native-hms": "1.10.0", "@react-native-community/blur": "^4.3.2", "@react-native-masked-view/masked-view": "^0.2.9", "@shopify/flash-list": "^1.4.3", diff --git a/packages/react-native-room-kit/src/HMSRoomSetup.tsx b/packages/react-native-room-kit/src/HMSRoomSetup.tsx index 873bc5eee..3ab56ae43 100644 --- a/packages/react-native-room-kit/src/HMSRoomSetup.tsx +++ b/packages/react-native-room-kit/src/HMSRoomSetup.tsx @@ -402,10 +402,28 @@ export const HMSRoomSetup = () => { useEffect(() => { const subscription = hmsInstance.interactivityCenter.addPollUpdateListener( - (poll, pollUpdateType) => { + async (poll, pollUpdateType) => { const reduxState = reduxStore.getState(); const pollsData = reduxState.polls.polls; + // Send HLS Timed Metadata for poll if it is started by local peer + if ( + poll.createdBy && + reduxState.hmsStates.localPeer && + poll.createdBy.peerID === reduxState.hmsStates.localPeer.peerID + ) { + hmsInstance + .sendHLSTimedMetadata([ + { duration: 20, payload: `poll:${poll.pollId}` }, + ]) + .then((result) => { + console.log('sendHLSTimedMetadata result: ', result); + }) + .catch((error: any) => { + console.log('sendHLSTimedMetadata error: ', error); + }); + } + batch(() => { // Update poll object in store dispatch(addPoll(poll)); diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector.png new file mode 100644 index 000000000..f6e70fe5d Binary files /dev/null and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@2x.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@2x.png new file mode 100644 index 000000000..19605512a Binary files /dev/null and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@2x.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@3x.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@3x.png new file mode 100644 index 000000000..f1b28c936 Binary files /dev/null and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock-vector@3x.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock.png index f6e70fe5d..0168d872c 100644 Binary files a/packages/react-native-room-kit/src/Icons/Clock/assets/clock.png and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock@2x.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock@2x.png index fc0670358..56889785f 100644 Binary files a/packages/react-native-room-kit/src/Icons/Clock/assets/clock@2x.png and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock@2x.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/assets/clock@3x.png b/packages/react-native-room-kit/src/Icons/Clock/assets/clock@3x.png index f1b28c936..160cc7b6f 100644 Binary files a/packages/react-native-room-kit/src/Icons/Clock/assets/clock@3x.png and b/packages/react-native-room-kit/src/Icons/Clock/assets/clock@3x.png differ diff --git a/packages/react-native-room-kit/src/Icons/Clock/index.tsx b/packages/react-native-room-kit/src/Icons/Clock/index.tsx index 96b4f0802..3e48281dc 100644 --- a/packages/react-native-room-kit/src/Icons/Clock/index.tsx +++ b/packages/react-native-room-kit/src/Icons/Clock/index.tsx @@ -2,16 +2,29 @@ import React from 'react'; import { Image, StyleSheet } from 'react-native'; import type { ImageProps } from 'react-native'; -interface ClockIconProps extends Omit {} +import { useHMSRoomStyle } from '../../hooks-util'; + +interface ClockIconProps extends Omit { + type?: 'vector' | 'normal'; +} export const ClockIcon: React.FC = ({ style, + type = 'vector', ...restProps }) => { + const iconStyles = useHMSRoomStyle((theme) => ({ + tintColor: theme.palette.on_surface_high, + })); + return ( ); diff --git a/packages/react-native-room-kit/src/components/CreatePoll.tsx b/packages/react-native-room-kit/src/components/CreatePoll.tsx index 90d9886de..a857ee3ac 100644 --- a/packages/react-native-room-kit/src/components/CreatePoll.tsx +++ b/packages/react-native-room-kit/src/components/CreatePoll.tsx @@ -9,7 +9,11 @@ import { HMSTextInput } from './HMSTextInput'; import { HMSPrimaryButton } from './HMSPrimaryButton'; import { COLORS } from '../utils/theme'; import type { RootState } from '../redux'; -import { setPollConfig, setPollName, setPollStage } from '../redux/actions'; +import { + pushToNavigationStack, + setPollConfig, + setPollName, +} from '../redux/actions'; import { CreatePollStages } from '../redux/actionTypes'; import type { PollConfig } from '../redux/actionTypes'; import { PollIcon, QuizIcon } from '../Icons'; @@ -67,7 +71,7 @@ export const CreatePoll: React.FC = ({}) => { const addQuestions = () => { if (pollName.trim().length > 0) { - dispatch(setPollStage(CreatePollStages.POLL_QUESTION_CONFIG)); + dispatch(pushToNavigationStack(CreatePollStages.POLL_QUESTION_CONFIG)); } }; @@ -230,6 +234,7 @@ const styles = StyleSheet.create({ }, createPollBtn: { marginTop: 24, + marginBottom: 16, }, contentContainer: { marginHorizontal: 24, diff --git a/packages/react-native-room-kit/src/components/HLSView.tsx b/packages/react-native-room-kit/src/components/HLSView.tsx index 8b923048c..44bd61073 100644 --- a/packages/react-native-room-kit/src/components/HLSView.tsx +++ b/packages/react-native-room-kit/src/components/HLSView.tsx @@ -1,11 +1,18 @@ import React, { useRef } from 'react'; import type { ComponentRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { View, Text, StyleSheet, Platform } from 'react-native'; +import { + View, + Text, + StyleSheet, + Platform, + useWindowDimensions, +} from 'react-native'; import { HMSHLSPlayer, HMSHLSPlayerPlaybackState, useHMSHLSPlayerPlaybackState, + useHMSHLSPlayerResolution, } from '@100mslive/react-native-hms'; import type { RootState } from '../redux'; @@ -18,6 +25,7 @@ import { HMSHLSNotStarted } from './HMSHLSNotStarted'; import { CrossCircleIcon } from '../Icons'; import { useHMSRoomStyleSheet } from '../hooks-util'; import { useIsHLSStreamingOn } from '../hooks-sdk'; +import { useIsLandscapeOrientation } from '../utils/dimension'; export const _HLSView: React.FC = () => { const dispatch = useDispatch(); @@ -26,6 +34,7 @@ export const _HLSView: React.FC = () => { (state: RootState) => !!state.hmsStates.room?.hlsStreamingState.variants?.[0]?.hlsStreamUrl ); + const { width, height } = useWindowDimensions(); const hmsHlsPlayerRef = useRef>(null); const showHLSStats = useSelector( (state: RootState) => state.app.joinConfig.showHLSStats @@ -99,6 +108,8 @@ export const _HLSView: React.FC = () => { ); const hlsPlayerPlaybackState = useHMSHLSPlayerPlaybackState(); + const resolution = useHMSHLSPlayerResolution(); + const isLandscapeOrientation = useIsLandscapeOrientation(); const isPlaybackFailed = hlsPlayerPlaybackState === HMSHLSPlayerPlaybackState.FAILED; @@ -141,6 +152,21 @@ export const _HLSView: React.FC = () => { ref={hmsHlsPlayerRef} enableStats={showHLSStats} enableControls={enableHLSPlayerControls} + style={ + isLandscapeOrientation + ? { + height, + width: resolution + ? height * (resolution.width / resolution.height) + : width, + } + : { + width, + height: resolution + ? width / (resolution.width / resolution.height) + : height, + } + } /> diff --git a/packages/react-native-room-kit/src/components/HMSPollsQuizzesNotification.tsx b/packages/react-native-room-kit/src/components/HMSPollsQuizzesNotification.tsx index 52151884c..c29334b82 100644 --- a/packages/react-native-room-kit/src/components/HMSPollsQuizzesNotification.tsx +++ b/packages/react-native-room-kit/src/components/HMSPollsQuizzesNotification.tsx @@ -14,8 +14,8 @@ import { import { HMSNotification } from './HMSNotification'; import { ModalTypes } from '../utils/types'; import { + pushToNavigationStack, removeNotification, - setPollStage, setSelectedPollId, } from '../redux/actions'; import { CreatePollStages } from '../redux/actionTypes'; @@ -56,7 +56,7 @@ export const HMSPollsQuizzesNotification: React.FC< // return; // } batch(() => { - dispatch(setPollStage(CreatePollStages.POLL_VOTING)); + dispatch(pushToNavigationStack(CreatePollStages.POLL_VOTING)); dispatch(setSelectedPollId(poll.pollId)); handleModalVisibleType(ModalTypes.POLLS_AND_QUIZZES); dispatch(removeNotification(id)); diff --git a/packages/react-native-room-kit/src/components/LeaderboardEntry.tsx b/packages/react-native-room-kit/src/components/LeaderboardEntry.tsx new file mode 100644 index 000000000..2cecc13c2 --- /dev/null +++ b/packages/react-native-room-kit/src/components/LeaderboardEntry.tsx @@ -0,0 +1,172 @@ +import * as React from 'react'; +import { Text, StyleSheet, View } from 'react-native'; +import type { ViewStyle, StyleProp } from 'react-native'; +import type { HMSPollLeaderboardEntry } from '@100mslive/react-native-hms'; + +import { useHMSRoomStyleSheet } from '../hooks-util'; +import { CheckIcon, ClockIcon } from '../Icons'; + +export interface LeaderboardEntryProps { + entry: HMSPollLeaderboardEntry; + totalPoints: number; + totalQuestions: number; + style?: StyleProp; +} + +export const LeaderboardEntry: React.FC = ({ + entry, + style, + totalPoints, + totalQuestions, +}) => { + const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ + regularHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-Regular`, + }, + regularMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-Regular`, + }, + semiBoldHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + semiBoldWhiteText: { + color: '#ffffff', + fontFamily: `${typography.font_family}-SemiBold`, + }, + icon: { + tintColor: theme.palette.on_surface_medium, + }, + })); + + return ( + + + + {entry.position} + + + + + {entry.peer?.userName} + + + {entry.score}/{totalPoints} points + + + + + + {entry.position === 1 && + entry.correctResponses && + entry.correctResponses > 0 ? ( + + 🏆 + + ) : null} + + + + + {entry.correctResponses}/{totalQuestions} + + + + {entry.duration ? ( + + + + {(entry.duration / 1000).toFixed(2)}s + + + ) : null} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + namePositionWrapper: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + scoreDurationWrapper: { flexDirection: 'row', alignItems: 'center' }, + flexShrink: { + flexShrink: 1, + }, + smallerText: { + fontSize: 12, + lineHeight: 16, + }, + smallText: { + fontSize: 14, + lineHeight: 20, + }, + normalText: { + fontSize: 16, + lineHeight: 24, + }, + position: { + width: 24, + height: 24, + borderRadius: 12, + textAlign: 'center', + textAlignVertical: 'center', + marginRight: 12, + }, + firstPosition: { + backgroundColor: '#D69516', // '#FFD700' + }, + secondPosition: { + backgroundColor: '#3E3E3E', // '#C0C0C0' + }, + thirdPosition: { + backgroundColor: '#583B0F', // '#CD7F32' + }, + iconWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginLeft: 12, + }, + icon: { + width: 16, + height: 16, + marginRight: 4, + }, +}); diff --git a/packages/react-native-room-kit/src/components/PollAndQuizSheetScreen.tsx b/packages/react-native-room-kit/src/components/PollAndQuizSheetScreen.tsx new file mode 100644 index 000000000..c0a13a0d6 --- /dev/null +++ b/packages/react-native-room-kit/src/components/PollAndQuizSheetScreen.tsx @@ -0,0 +1,85 @@ +import * as React from 'react'; +import { StyleSheet } from 'react-native'; +import Animated, { + interpolate, + useAnimatedStyle, + useSharedValue, + withTiming, + runOnJS, +} from 'react-native-reanimated'; +import { useSafeAreaFrame } from 'react-native-safe-area-context'; + +import { useIsLandscapeOrientation } from '../utils/dimension'; + +export interface PollAndQuizSheetScreenProps { + children: React.ReactElement | null; + zIndex: number; + disableAnimation?: boolean; +} + +export const PollAndQuizSheetScreen: React.FC = ({ + children, + zIndex, + disableAnimation, +}) => { + const isLandscapeOrientation = useIsLandscapeOrientation(); + const { width } = useSafeAreaFrame(); + const xPosition = useSharedValue(disableAnimation ? 0 : 1); + + const animatedStyle = useAnimatedStyle( + () => ({ + opacity: interpolate(xPosition.value, [0, 1], [1, 0]), + transform: [ + { + translateX: interpolate( + xPosition.value, + [0, 1], + [0, isLandscapeOrientation ? width * 0.6 : width], + 'clamp' + ), + }, + ], + }), + [isLandscapeOrientation] + ); + + React.useEffect(() => { + if (disableAnimation) { + return; + } + xPosition.value = withTiming(0, { duration: 150 }); + return () => { + cancelAnimationFrame(xPosition.value); + }; + }, []); + + const unmountScreenWithAnimation = React.useCallback( + (cb: () => void) => { + if (disableAnimation) { + cb(); + return; + } + xPosition.value = withTiming(1, { duration: 150 }, () => { + runOnJS(cb)(); + }); + }, + [disableAnimation] + ); + + return ( + + {children + ? React.cloneElement(children, { unmountScreenWithAnimation }) + : null} + + ); +}; + +const styles = StyleSheet.create({ + absolute: { + width: '100%', + height: '100%', + position: 'absolute', + overflow: 'hidden', + }, +}); diff --git a/packages/react-native-room-kit/src/components/PollAndQuizVoting.tsx b/packages/react-native-room-kit/src/components/PollAndQuizVoting.tsx index 9b20f00e2..62d3bd8dd 100644 --- a/packages/react-native-room-kit/src/components/PollAndQuizVoting.tsx +++ b/packages/react-native-room-kit/src/components/PollAndQuizVoting.tsx @@ -6,22 +6,42 @@ import { findNodeHandle, UIManager, View, + Keyboard, + TouchableOpacity, } from 'react-native'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { HMSPollState, HMSPollType } from '@100mslive/react-native-hms'; import { useHMSInstance, useHMSRoomStyleSheet } from '../hooks-util'; import type { RootState } from '../redux'; import { HMSDangerButton } from './HMSDangerButton'; import { PollAndQuizQuestionResponseCards } from './PollAndQuizQuestionResponseCards'; +import { + popFromNavigationStack, + pushToNavigationStack, +} from '../redux/actions'; +import { BottomSheet } from './BottomSheet'; +import { ChevronIcon, CloseIcon } from '../Icons'; +import { PollAndQuizzStateLabel } from './PollAndQuizzStateLabel'; +import { HMSPrimaryButton } from './HMSPrimaryButton'; +import { CreatePollStages } from '../redux/actionTypes'; +import { VoterParticipationSummary } from './VoterParticipationSummary'; export interface PollAndQuizVotingProps { + currentIdx: number; dismissModal(): void; + unmountScreenWithAnimation?(cb: Function): void; } -export const PollAndQuizVoting: React.FC = () => { +export const PollAndQuizVoting: React.FC = ({ + currentIdx, + dismissModal, + unmountScreenWithAnimation, +}) => { const scrollViewRef = React.useRef(null); const hmsInstance = useHMSInstance(); + const dispatch = useDispatch(); + const selectedPoll = useSelector((state: RootState) => { const pollsData = state.polls; if (pollsData.selectedPollId !== null) { @@ -33,16 +53,34 @@ export const PollAndQuizVoting: React.FC = () => { const permissions = state.hmsStates.localPeer?.role?.permissions; return permissions?.pollWrite; }); + const headerTitle = useSelector((state: RootState) => { + const pollsData = state.polls; + if (pollsData.selectedPollId !== null) { + return pollsData.polls[pollsData.selectedPollId]?.title || null; + } + return null; + }); const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ regularMediumText: { color: theme.palette.on_surface_medium, fontFamily: `${typography.font_family}-Regular`, }, + semiBoldHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, semiBoldMediumText: { color: theme.palette.on_surface_medium, fontFamily: `${typography.font_family}-SemiBold`, }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + container: { + backgroundColor: theme.palette.surface_dim, + }, })); const endPoll = async () => { @@ -79,17 +117,90 @@ export const PollAndQuizVoting: React.FC = () => { ); }; + const viewLeaderboard = () => { + dispatch(pushToNavigationStack(CreatePollStages.QUIZ_LEADERBOARD)); + }; + + const handleBackPress = () => { + Keyboard.dismiss(); + if (typeof unmountScreenWithAnimation === 'function') { + unmountScreenWithAnimation(() => dispatch(popFromNavigationStack())); + } else { + dispatch(popFromNavigationStack()); + } + }; + + const handleClosePress = () => { + Keyboard.dismiss(); + dismissModal(); + }; + return ( - + + {/* Header */} + + + {currentIdx > 0 ? ( + + + + ) : null} + + + {headerTitle} + + + {selectedPoll?.state ? ( + + ) : null} + + + + + + + + {/* Divider */} + + + {/* Content */} - - {selectedPoll?.createdBy?.name} started a{' '} - {selectedPoll?.type === HMSPollType.quiz ? 'quiz' : 'poll'} - + {selectedPoll && + selectedPoll.type === HMSPollType.quiz && + selectedPoll.state === HMSPollState.stopped && + !canCreateOrEndPoll ? ( + + + + + Questions + + + ) : ( + + {selectedPoll?.createdBy?.name} started a{' '} + {selectedPoll?.type === HMSPollType.quiz ? 'quiz' : 'poll'} + + )} {selectedPoll ? ( = () => { }} /> ) : null} + + {selectedPoll && + selectedPoll.state === HMSPollState.stopped && + selectedPoll.type === HMSPollType.quiz ? ( + + ) : null} ); }; @@ -158,4 +285,51 @@ const styles = StyleSheet.create({ marginRight: 8, padding: 8, }, + + // ----------------- + + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + marginRight: 12, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + marginVertical: 0, + marginTop: 24, + width: undefined, + }, + divider: { + marginHorizontal: 24, + marginVertical: 24, + width: undefined, + }, }); diff --git a/packages/react-native-room-kit/src/components/PollQuestions.tsx b/packages/react-native-room-kit/src/components/PollQuestions.tsx index 2cb75411e..06f788916 100644 --- a/packages/react-native-room-kit/src/components/PollQuestions.tsx +++ b/packages/react-native-room-kit/src/components/PollQuestions.tsx @@ -5,14 +5,15 @@ import { StyleSheet, TouchableOpacity, ScrollView, + Keyboard, } from 'react-native'; import { HMSPollQuestionType, HMSPollType } from '@100mslive/react-native-hms'; +import { batch, useDispatch, useSelector, useStore } from 'react-redux'; -import { AddIcon } from '../Icons'; +import { AddIcon, ChevronIcon, CloseIcon } from '../Icons'; import { useHMSInstance, useHMSRoomStyleSheet } from '../hooks-util'; import { HMSPrimaryButton } from './HMSPrimaryButton'; import { PollQuestion } from './PollQuestion'; -import { batch, useDispatch, useSelector, useStore } from 'react-redux'; import type { RootState } from '../redux'; import { addPollQuestion, @@ -20,6 +21,7 @@ import { cleaPollFormState, deletePollQuestionOption, editPollQuestionOption, + popFromNavigationStack, setLaunchingPoll, setPollQDeleteConfirmationVisible, setPollQuestionCorrectOption, @@ -32,12 +34,20 @@ import { setSelectedPollQuestionIndex, } from '../redux/actions'; import type { PollQuestionUI } from '../redux/actionTypes'; +import { PollQDeleteConfirmationSheetView } from './PollQDeleteConfirmationSheetView'; +import { BottomSheet } from './BottomSheet'; export interface PollQuestionsProps { + currentIdx: number; dismissModal(): void; + unmountScreenWithAnimation?: (cb: Function) => void; } -export const PollQuestions: React.FC = ({}) => { +export const PollQuestions: React.FC = ({ + currentIdx, + dismissModal, + unmountScreenWithAnimation, +}) => { const dispatch = useDispatch(); const hmsInstance = useHMSInstance(); const reduxStore = useStore(); @@ -50,6 +60,7 @@ export const PollQuestions: React.FC = ({}) => { const pollType = useSelector( (state: RootState) => state.polls.pollConfig.type ); + const headerTitle = useSelector((state: RootState) => state.polls.pollName); const questions = useSelector((state: RootState) => state.polls.questions); const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ @@ -57,6 +68,13 @@ export const PollQuestions: React.FC = ({}) => { color: theme.palette.on_surface_medium, fontFamily: `${typography.font_family}-Regular`, }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + container: { + backgroundColor: theme.palette.surface_dim, + }, })); const disableLaunchPoll = @@ -185,60 +203,117 @@ export const PollQuestions: React.FC = ({}) => { [] ); + const handleBackPress = () => { + Keyboard.dismiss(); + if (typeof unmountScreenWithAnimation === 'function') { + unmountScreenWithAnimation(() => dispatch(popFromNavigationStack())); + } else { + dispatch(popFromNavigationStack()); + } + }; + + const handleClosePress = () => { + Keyboard.dismiss(); + dismissModal(); + }; + return ( - - {questions.map((pollQuestion, idx, arr) => { - const isFirst = idx === 0; - return ( - - {isFirst ? null : } + + {/* Header */} + + + {currentIdx > 0 ? ( + + + + ) : null} - - - ); - })} + + {headerTitle} + + - - - - - - Add another question - + - - + {/* Divider */} + + + + {questions.map((pollQuestion, idx, arr) => { + const isFirst = idx === 0; + return ( + + {isFirst ? null : } + + + + ); + })} + + + + + + + + Add another question + + + + + + + + {/* Modal */} + + ); }; @@ -274,4 +349,51 @@ const styles = StyleSheet.create({ marginRight: 8, padding: 8, }, + + // ------- + + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + marginRight: 12, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + marginVertical: 0, + marginTop: 24, + width: undefined, + }, + divider: { + marginHorizontal: 24, + marginVertical: 24, + width: undefined, + }, }); diff --git a/packages/react-native-room-kit/src/components/PollsAndQuizBottomSheet.tsx b/packages/react-native-room-kit/src/components/PollsAndQuizBottomSheet.tsx index ca76f70b8..fee891357 100644 --- a/packages/react-native-room-kit/src/components/PollsAndQuizBottomSheet.tsx +++ b/packages/react-native-room-kit/src/components/PollsAndQuizBottomSheet.tsx @@ -1,22 +1,17 @@ import * as React from 'react'; import { Platform, StyleSheet } from 'react-native'; -import { useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import { BottomSheet } from './BottomSheet'; -import { - useHMSRoomStyleSheet, - useIsHLSViewer, - useModalType, -} from '../hooks-util'; +import { useHMSRoomStyleSheet, useModalType } from '../hooks-util'; import { useHeaderHeight } from './Header'; import { useIsLandscapeOrientation } from '../utils/dimension'; import { PollsAndQuizzesModalContent } from './PollsAndQuizzesModalContent'; import { ModalTypes } from '../utils/types'; -import type { RootState } from '../redux'; -import { CreatePollStages } from '../redux/actionTypes'; -import { visiblePollsSelector } from '../utils/functions'; +import { resetNavigationStack } from '../redux/actions'; export const PollsAndQuizBottomSheet = () => { + const dispatch = useDispatch(); const headerHeight = useHeaderHeight(); const isLandscapeOrientation = useIsLandscapeOrientation(); const { @@ -24,40 +19,26 @@ export const PollsAndQuizBottomSheet = () => { handleModalVisibleType: setModalVisible, } = useModalType(); - const isPollQuestionStage = useSelector( - (state: RootState) => - state.polls.stage === CreatePollStages.POLL_QUESTION_CONFIG - ); - const isHLSViewer = useIsHLSViewer(); - const havePolls = useSelector( - (state: RootState) => - visiblePollsSelector( - Object.values(state.polls.polls), - isHLSViewer, - state.polls.cuedPollIds - ).length > 0 - ); - const hmsRoomStyles = useHMSRoomStyleSheet((theme) => ({ contentContainer: { backgroundColor: theme.palette.surface_dim, }, })); - const dismissModal = () => setModalVisible(ModalTypes.DEFAULT); - - const fullHeight = isPollQuestionStage || havePolls; - const containerStyles = fullHeight - ? [ - styles.bottomSheet, - { - marginTop: isLandscapeOrientation - ? 0 - : headerHeight + (Platform.OS === 'android' ? 24 : 0), - }, - hmsRoomStyles.contentContainer, - ] - : [hmsRoomStyles.contentContainer]; + const dismissModal = () => { + setModalVisible(ModalTypes.DEFAULT); + dispatch(resetNavigationStack()); + }; + + const containerStyles = [ + styles.bottomSheet, + { + marginTop: isLandscapeOrientation + ? 0 + : headerHeight + (Platform.OS === 'android' ? 24 : 0), + }, + hmsRoomStyles.contentContainer, + ]; return ( { isVisible={modalVisible === ModalTypes.POLLS_AND_QUIZZES} avoidKeyboard={true} containerStyle={containerStyles} - bottomOffsetSpace={fullHeight ? 0 : undefined} + bottomOffsetSpace={0} > - + ); }; diff --git a/packages/react-native-room-kit/src/components/PollsAndQuizzesCard.tsx b/packages/react-native-room-kit/src/components/PollsAndQuizzesCard.tsx index 5b5445c42..2a1bbd929 100644 --- a/packages/react-native-room-kit/src/components/PollsAndQuizzesCard.tsx +++ b/packages/react-native-room-kit/src/components/PollsAndQuizzesCard.tsx @@ -5,7 +5,7 @@ import type { HMSPoll } from '@100mslive/react-native-hms'; import { useHMSRoomStyleSheet } from '../hooks-util'; import { HMSPrimaryButton } from './HMSPrimaryButton'; -import { setPollStage, setSelectedPollId } from '../redux/actions'; +import { pushToNavigationStack, setSelectedPollId } from '../redux/actions'; import { CreatePollStages } from '../redux/actionTypes'; import { PollAndQuizzStateLabel } from './PollAndQuizzStateLabel'; @@ -36,7 +36,7 @@ export const PollsAndQuizzesCard: React.FC = ({ const viewPoll = () => { batch(() => { - dispatch(setPollStage(CreatePollStages.POLL_VOTING)); + dispatch(pushToNavigationStack(CreatePollStages.POLL_VOTING)); dispatch(setSelectedPollId(poll.pollId)); }); }; diff --git a/packages/react-native-room-kit/src/components/PollsAndQuizzesModalContent.tsx b/packages/react-native-room-kit/src/components/PollsAndQuizzesModalContent.tsx index 49d7e2872..fc701a42d 100644 --- a/packages/react-native-room-kit/src/components/PollsAndQuizzesModalContent.tsx +++ b/packages/react-native-room-kit/src/components/PollsAndQuizzesModalContent.tsx @@ -1,62 +1,27 @@ import * as React from 'react'; -import { - View, - Text, - StyleSheet, - TouchableOpacity, - Keyboard, -} from 'react-native'; -import { useDispatch, useSelector } from 'react-redux'; +import { View, StyleSheet } from 'react-native'; +import { useSelector } from 'react-redux'; import type { RootState } from '../redux'; -import { useHMSRoomStyleSheet } from '../hooks-util'; -import { BottomSheet } from './BottomSheet'; -import { ChevronIcon, CloseIcon } from '../Icons'; -import { TestIds } from '../utils/constants'; import { PollQuestions } from './PollQuestions'; import { CreatePollStages } from '../redux/actionTypes'; -import { setPollStage } from '../redux/actions'; -import { PollQDeleteConfirmationSheetView } from './PollQDeleteConfirmationSheetView'; import { PollsConfigAndList } from './PollsConfigAndList'; import { PollAndQuizVoting } from './PollAndQuizVoting'; -import { PollAndQuizzStateLabel } from './PollAndQuizzStateLabel'; +import { PollAndQuizSheetScreen } from './PollAndQuizSheetScreen'; +import { QuizLeaderboardScreen } from './QuizLeaderboardScreen'; +import { QuizLeaderboardEntriesScreen } from './QuizLeaderboardEntriesScreen'; export interface PollsAndQuizzesModalContentProps { - fullHeight: boolean; dismissModal(): void; } export const PollsAndQuizzesModalContent: React.FC< PollsAndQuizzesModalContentProps -> = ({ fullHeight, dismissModal }) => { - const dispatch = useDispatch(); - const headerTitle = useSelector((state: RootState) => { - const pollsData = state.polls; - if (pollsData.stage === CreatePollStages.POLL_QUESTION_CONFIG) { - return pollsData.pollName; - } - if ( - pollsData.stage === CreatePollStages.POLL_VOTING && - pollsData.selectedPollId !== null - ) { - return pollsData.polls[pollsData.selectedPollId]?.title || null; - } - return null; - }); - const selectedPoll = useSelector((state: RootState) => { - const pollsData = state.polls; - if ( - pollsData.stage === CreatePollStages.POLL_VOTING && - pollsData.selectedPollId !== null - ) { - return pollsData.polls[pollsData.selectedPollId] || null; - } - return null; - }); - const pollsStage = useSelector((state: RootState) => state.polls.stage); - const launchingPoll = useSelector( - (state: RootState) => state.polls.launchingPoll +> = ({ dismissModal }) => { + const pollsNavigationStack = useSelector( + (state: RootState) => state.polls.navigationStack ); + const canCreateOrEndPoll = useSelector((state: RootState) => { const permissions = state.hmsStates.localPeer?.role?.permissions; return permissions?.pollWrite; @@ -66,133 +31,45 @@ export const PollsAndQuizzesModalContent: React.FC< return permissions?.pollRead; }); - const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ - headerText: { - color: theme.palette.on_surface_high, - fontFamily: `${typography.font_family}-SemiBold`, - }, - })); - - const handleBackPress = () => { - Keyboard.dismiss(); - dispatch(setPollStage(CreatePollStages.POLL_CONFIG)); - }; - - const handleClosePress = () => { - Keyboard.dismiss(); - dismissModal(); - }; - return ( - - {/* Header */} - - - {headerTitle ? ( - - - - ) : null} - - - {headerTitle ?? 'Polls and Quizzes'} - - - {selectedPoll?.state ? ( - - ) : null} - - - + {pollsNavigationStack.map((stage, index) => ( + - - - - - {/* Divider */} - - - {/* Content */} - - {pollsStage === CreatePollStages.POLL_CONFIG ? ( - - ) : pollsStage === CreatePollStages.POLL_QUESTION_CONFIG && - canCreateOrEndPoll ? ( - - ) : pollsStage === CreatePollStages.POLL_VOTING && - (canVoteOnPoll || canCreateOrEndPoll) ? ( - - ) : null} - - - {/* Modal */} - + {stage === CreatePollStages.POLL_CONFIG ? ( + + ) : stage === CreatePollStages.POLL_QUESTION_CONFIG && + canCreateOrEndPoll ? ( + + ) : stage === CreatePollStages.POLL_VOTING && + (canVoteOnPoll || canCreateOrEndPoll) ? ( + + ) : stage === CreatePollStages.QUIZ_LEADERBOARD ? ( + + ) : stage === CreatePollStages.QUIZ_LEADERBOARD_ENTRIES ? ( + + ) : null} + + ))} ); }; const styles = StyleSheet.create({ - // Utilities + relative: { + position: 'relative', + overflow: 'hidden', + }, fullView: { flex: 1, }, - // Header - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - marginTop: 24, - marginHorizontal: 24, - }, - headerControls: { - flexDirection: 'row', - alignItems: 'center', - flexShrink: 1, - }, - headerText: { - fontSize: 20, - lineHeight: 24, - letterSpacing: 0.15, - marginRight: 12, - }, - closeIconHitSlop: { - bottom: 16, - left: 16, - right: 16, - top: 16, - }, - backIcon: { - marginRight: 8, - }, - // Divider - halfDivider: { - marginHorizontal: 24, - marginVertical: 0, - marginTop: 24, - width: undefined, - }, - divider: { - marginHorizontal: 24, - marginVertical: 24, - width: undefined, - }, }); diff --git a/packages/react-native-room-kit/src/components/PollsConfigAndList.tsx b/packages/react-native-room-kit/src/components/PollsConfigAndList.tsx index fc0e5afd2..f339f705b 100644 --- a/packages/react-native-room-kit/src/components/PollsConfigAndList.tsx +++ b/packages/react-native-room-kit/src/components/PollsConfigAndList.tsx @@ -1,14 +1,38 @@ import * as React from 'react'; -import { ScrollView } from 'react-native'; +import { + Keyboard, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { useSelector } from 'react-redux'; import { CreatePoll } from './CreatePoll'; import { PreviousPollsAndQuizzesList } from './PreviousPollsAndQuizzesList'; -import { useSelector } from 'react-redux'; -import type { RootState } from 'src/redux'; +import type { RootState } from '../redux'; +import { BottomSheet } from './BottomSheet'; +import { CloseIcon } from '../Icons'; +import { useHMSRoomStyleSheet } from '../hooks-util'; -export interface PollsConfigAndListProps {} +export interface PollsConfigAndListProps { + dismissModal(): void; +} + +export const PollsConfigAndList: React.FC = ({ + dismissModal, +}) => { + const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ + container: { + backgroundColor: theme.palette.surface_dim, + }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + })); -export const PollsConfigAndList: React.FC = ({}) => { const canCreateOrEndPoll = useSelector((state: RootState) => { const permissions = state.hmsStates.localPeer?.role?.permissions; return permissions?.pollWrite; @@ -18,12 +42,84 @@ export const PollsConfigAndList: React.FC = ({}) => { return permissions?.pollRead; }); + const handleClosePress = () => { + Keyboard.dismiss(); + dismissModal(); + }; + return ( - - {canCreateOrEndPoll ? : null} - {canVoteOnPoll || canCreateOrEndPoll ? ( - - ) : null} - + + {/* Header */} + + + Polls and Quizzes + + + + + + + + {/* Divider */} + + + {/* Content */} + + {canCreateOrEndPoll ? : null} + {canVoteOnPoll || canCreateOrEndPoll ? ( + + ) : null} + + ); }; + +const styles = StyleSheet.create({ + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + // marginVertical: 0, + // marginTop: 24, + width: undefined, + }, + divider: { + marginHorizontal: 24, + marginVertical: 24, + width: undefined, + }, +}); diff --git a/packages/react-native-room-kit/src/components/PreviousPollsAndQuizzesList.tsx b/packages/react-native-room-kit/src/components/PreviousPollsAndQuizzesList.tsx index 3b8895f7a..56ab93d19 100644 --- a/packages/react-native-room-kit/src/components/PreviousPollsAndQuizzesList.tsx +++ b/packages/react-native-room-kit/src/components/PreviousPollsAndQuizzesList.tsx @@ -18,11 +18,6 @@ export const PreviousPollsAndQuizzesList: React.FC< (state: RootState) => state.polls.cuedPollIds ); - const canCreateOrEndPoll = useSelector((state: RootState) => { - const permissions = state.hmsStates.localPeer?.role?.permissions; - return permissions?.pollWrite; - }); - const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ surfaceHighSemiBoldText: { color: theme.palette.on_surface_high, @@ -40,44 +35,42 @@ export const PreviousPollsAndQuizzesList: React.FC< hlsCuedPollIds ); - if (pollsList.length === 0 && !canCreateOrEndPoll) { - return ( - - - No Polls or Quizzes to show - - - ); - } - return ( - {pollsList.length > 0 && ( - - Previous Polls And Quizzes - - )} + + Previous Polls And Quizzes + - {pollsList - .sort((a, b) => { - return a.state === b.state // If polls have same state, then sort as per startedAt - ? a.startedAt !== undefined && b.startedAt !== undefined - ? b.startedAt.getTime() - a.startedAt.getTime() - : 0 - : // If polls have different state, then sort as per state - a.state !== undefined && b.state !== undefined - ? a.state - b.state - : 0; - }) - .map((poll) => ( - - ))} + {pollsList.length <= 0 ? ( + + + No Polls or Quizzes to show + + + ) : ( + <> + {pollsList + .sort((a, b) => { + return a.state === b.state // If polls have same state, then sort as per startedAt + ? a.startedAt !== undefined && b.startedAt !== undefined + ? b.startedAt.getTime() - a.startedAt.getTime() + : 0 + : // If polls have different state, then sort as per state + a.state !== undefined && b.state !== undefined + ? a.state - b.state + : 0; + }) + .map((poll) => ( + + ))} + + )} ); }; diff --git a/packages/react-native-room-kit/src/components/QuizLeaderboardEntriesScreen.tsx b/packages/react-native-room-kit/src/components/QuizLeaderboardEntriesScreen.tsx new file mode 100644 index 000000000..25f5660dd --- /dev/null +++ b/packages/react-native-room-kit/src/components/QuizLeaderboardEntriesScreen.tsx @@ -0,0 +1,323 @@ +import * as React from 'react'; +import { + Text, + StyleSheet, + View, + Keyboard, + TouchableOpacity, + ActivityIndicator, +} from 'react-native'; +import { useDispatch, useSelector } from 'react-redux'; +import type { HMSPollLeaderboardEntry } from '@100mslive/react-native-hms'; +import { FlashList } from '@shopify/flash-list'; + +import { + useHMSInstance, + useHMSRoomColorPalette, + useHMSRoomStyleSheet, +} from '../hooks-util'; +import type { RootState } from '../redux'; +import { popFromNavigationStack } from '../redux/actions'; +import { BottomSheet } from './BottomSheet'; +import { ChevronIcon, CloseIcon } from '../Icons'; +import { PollAndQuizzStateLabel } from './PollAndQuizzStateLabel'; +import { LeaderboardEntry } from './LeaderboardEntry'; + +export interface QuizLeaderboardEntriesScreenProps { + currentIdx: number; + dismissModal(): void; + unmountScreenWithAnimation?(cb: Function): void; +} + +export const QuizLeaderboardEntriesScreen: React.FC< + QuizLeaderboardEntriesScreenProps +> = ({ currentIdx, dismissModal, unmountScreenWithAnimation }) => { + const hmsInstance = useHMSInstance(); + const dispatch = useDispatch(); + + const selectedPoll = useSelector((state: RootState) => { + const pollsData = state.polls; + if (pollsData.selectedPollId !== null) { + return pollsData.polls[pollsData.selectedPollId] || null; + } + return null; + }); + + const initialLeaderboardEntries = useSelector((state: RootState) => { + return selectedPoll?.pollId + ? state.polls.leaderboards[selectedPoll.pollId]?.entries + : null; + }); + + const [leaderboardEntries, setLeaderboardEntries] = React.useState< + HMSPollLeaderboardEntry[] + >(initialLeaderboardEntries ? [...initialLeaderboardEntries] : []); + + const startIndexRef = React.useRef(leaderboardEntries.length); + + const { primary_default: primaryDefaultColor } = useHMSRoomColorPalette(); + const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ + regularHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-Regular`, + }, + regularMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-Regular`, + }, + semiBoldMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-SemiBold`, + }, + semiBoldHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + container: { + backgroundColor: theme.palette.surface_dim, + }, + summaryContainer: { + backgroundColor: theme.palette.surface_default, + }, + entriesCard: { + backgroundColor: theme.palette.surface_default, + }, + divider: { + backgroundColor: theme.palette.border_bright, + }, + })); + + const handleBackPress = () => { + Keyboard.dismiss(); + if (typeof unmountScreenWithAnimation === 'function') { + unmountScreenWithAnimation(() => dispatch(popFromNavigationStack())); + } else { + dispatch(popFromNavigationStack()); + } + }; + + const handleClosePress = () => { + Keyboard.dismiss(); + dismissModal(); + }; + + const [loading, setLoading] = React.useState(false); + const loadingRef = React.useRef(false); + const mounted = React.useRef(true); + const canFetchMore = React.useRef(true); + + const fetchLeaderboard = React.useCallback(async () => { + if (selectedPoll?.pollId && canFetchMore.current && !loadingRef.current) { + setLoading(true); + loadingRef.current = true; + const response = await hmsInstance.interactivityCenter.fetchLeaderboard( + selectedPoll.pollId, + 50, + startIndexRef.current + 1, // Indexing starts from 1 + false + ); + if (mounted) { + setLoading(false); + loadingRef.current = false; + if (Array.isArray(response.entries)) { + const entries = response.entries; + setLeaderboardEntries((prev) => { + const list = [...prev, ...entries]; + startIndexRef.current = list.length; + return list; + }); + if (entries.length <= 0) { + canFetchMore.current = false; + } + } + if (response.hasNext === false) { + canFetchMore.current = false; + } + } + } + }, [selectedPoll?.pollId]); + + const totalPoints = + selectedPoll?.questions?.reduce((acc, curr) => { + acc += curr.weight; + return acc; + }, 0) ?? 0; + + const totalQuestions = selectedPoll?.questions?.length ?? 0; + + const _keyExtractor = React.useCallback( + (item: HMSPollLeaderboardEntry, index: number) => + item.peer?.peerId ?? index.toString(), + [] + ); + + const _renderItem = React.useCallback( + (data: { item: HMSPollLeaderboardEntry }) => { + return ( + + ); + }, + [totalPoints, totalQuestions] + ); + + return ( + + {/* Header */} + + + {currentIdx > 0 ? ( + + + + ) : null} + + + {selectedPoll?.title} + + + {selectedPoll?.state ? ( + + ) : null} + + + + + + + + {/* Divider */} + + + {/* Content */} + ( + + + Leaderboard + + + Based on time taken to cast the correct answer + + + )} + ListFooterComponent={() => + loading ? ( + + ) : null + } + estimatedItemSize={56} + onEndReached={() => { + fetchLeaderboard(); + }} + // showsVerticalScrollIndicator={Platform.OS !== 'android'} + contentContainerStyle={{ paddingHorizontal: 24 }} + // keyboardShouldPersistTaps="always" + // ItemSeparatorComponent={() => } // TODO: There is a bug related to this: https://github.com/Shopify/flash-list/issues/638 + renderItem={_renderItem} + keyExtractor={_keyExtractor} + /> + + ); +}; + +const styles = StyleSheet.create({ + tinyText: { + fontSize: 10, + lineHeight: 16, + letterSpacing: 1.5, + }, + smallerText: { + fontSize: 12, + lineHeight: 16, + }, + smallText: { + fontSize: 14, + lineHeight: 20, + }, + normalText: { + fontSize: 16, + lineHeight: 24, + }, + marginBottom16: { + marginBottom: 16, + }, + iconWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginLeft: 12, + }, + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + marginRight: 12, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + marginVertical: 0, + marginTop: 24, + width: undefined, + }, + divider: { height: 1, width: '100%' }, + viewAllBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + paddingVertical: 12, + paddingHorizontal: 16, + }, + leaderboardEntry: { marginBottom: 16, marginHorizontal: 16 }, + entriesCard: { paddingTop: 12, borderRadius: 8 }, +}); diff --git a/packages/react-native-room-kit/src/components/QuizLeaderboardScreen.tsx b/packages/react-native-room-kit/src/components/QuizLeaderboardScreen.tsx new file mode 100644 index 000000000..430a1a8d1 --- /dev/null +++ b/packages/react-native-room-kit/src/components/QuizLeaderboardScreen.tsx @@ -0,0 +1,342 @@ +import * as React from 'react'; +import { + Text, + StyleSheet, + ScrollView, + View, + Keyboard, + TouchableOpacity, +} from 'react-native'; +import { useDispatch, useSelector } from 'react-redux'; + +import { useHMSRoomStyleSheet } from '../hooks-util'; +import type { RootState } from '../redux'; +import { + popFromNavigationStack, + pushToNavigationStack, +} from '../redux/actions'; +import { BottomSheet } from './BottomSheet'; +import { ChevronIcon, CloseIcon } from '../Icons'; +import { PollAndQuizzStateLabel } from './PollAndQuizzStateLabel'; +import { LeaderboardEntry } from './LeaderboardEntry'; +import { CreatePollStages } from '../redux/actionTypes'; +import { QuizLeaderboardSummary } from './QuizLeaderboardSummary'; +import { + useFetchLeaderboardResponse, + useLeaderboardSummaryData, +} from '../utils/hooks'; + +export interface QuizLeaderboardScreenProps { + currentIdx: number; + dismissModal(): void; + unmountScreenWithAnimation?(cb: Function): void; +} + +export const QuizLeaderboardScreen: React.FC = ({ + currentIdx, + dismissModal, + unmountScreenWithAnimation, +}) => { + const dispatch = useDispatch(); + + const selectedPoll = useSelector((state: RootState) => { + const pollsData = state.polls; + if (pollsData.selectedPollId !== null) { + return pollsData.polls[pollsData.selectedPollId] || null; + } + return null; + }); + const headerTitle = useSelector((state: RootState) => { + const pollsData = state.polls; + if (pollsData.selectedPollId !== null) { + return pollsData.polls[pollsData.selectedPollId]?.title || null; + } + return null; + }); + + const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ + regularHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-Regular`, + }, + regularMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-Regular`, + }, + semiBoldMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-SemiBold`, + }, + semiBoldHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + container: { + backgroundColor: theme.palette.surface_dim, + }, + summaryContainer: { + backgroundColor: theme.palette.surface_default, + }, + entriesCard: { + backgroundColor: theme.palette.surface_default, + }, + divider: { + backgroundColor: theme.palette.border_bright, + }, + })); + + const handleBackPress = () => { + Keyboard.dismiss(); + if (typeof unmountScreenWithAnimation === 'function') { + unmountScreenWithAnimation(() => dispatch(popFromNavigationStack())); + } else { + dispatch(popFromNavigationStack()); + } + }; + + const handleClosePress = () => { + Keyboard.dismiss(); + dismissModal(); + }; + + const viewAllLeaderboardEntries = () => { + dispatch(pushToNavigationStack(CreatePollStages.QUIZ_LEADERBOARD_ENTRIES)); + }; + + const leaderboardData = useFetchLeaderboardResponse(selectedPoll?.pollId); + + const leaderboardEntries = leaderboardData?.entries; + + const summaryData = useLeaderboardSummaryData(selectedPoll?.pollId); + + const totalPoints = + selectedPoll?.questions?.reduce((acc, curr) => { + acc += curr.weight; + return acc; + }, 0) ?? 0; + + return ( + + {/* Header */} + + + {currentIdx > 0 ? ( + + + + ) : null} + + + {headerTitle} + + + {selectedPoll?.state ? ( + + ) : null} + + + + + + + + {/* Divider */} + + + {/* Content */} + + {summaryData ? : null} + + {selectedPoll && + Array.isArray(selectedPoll.questions) && + Array.isArray(leaderboardEntries) && + leaderboardEntries.length > 0 ? ( + + + Leaderboard + + + Based on time taken to cast the correct answer + + + + {leaderboardEntries.map((entry, index) => { + return ( + + ); + })} + + {leaderboardData?.hasNext && leaderboardEntries.length <= 5 ? ( + + + + + + View All + + + + + + ) : null} + + + ) : null} + + + ); +}; + +const styles = StyleSheet.create({ + tinyText: { + fontSize: 10, + lineHeight: 16, + letterSpacing: 1.5, + }, + smallerText: { + fontSize: 12, + lineHeight: 16, + }, + smallText: { + fontSize: 14, + lineHeight: 20, + }, + normalText: { + fontSize: 16, + lineHeight: 24, + }, + marginBottom8: { + marginBottom: 8, + }, + marginBottom16: { + marginBottom: 16, + }, + contentContainer: { + paddingHorizontal: 24, + }, + scrollViewContentContainer: { + flexGrow: 1, + paddingVertical: 24, + }, + summaryWrapper: { + flexBasis: '50%', + flexGrow: 1, + flexShrink: 1, + padding: 16, + borderRadius: 12, + }, + position: { + width: 24, + height: 24, + borderRadius: 12, + textAlign: 'center', + textAlignVertical: 'center', + marginRight: 12, + }, + firstPosition: { + backgroundColor: '#D69516', // '#FFD700' + }, + secondPosition: { + backgroundColor: '#3E3E3E', // '#C0C0C0' + }, + thirdPosition: { + backgroundColor: '#583B0F', // '#CD7F32' + }, + iconWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginLeft: 12, + }, + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + marginRight: 12, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + marginVertical: 0, + marginTop: 24, + width: undefined, + }, + divider: { height: 1, width: '100%' }, + viewAllBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + paddingVertical: 12, + paddingHorizontal: 16, + }, + leaderboardEntry: { marginBottom: 16, marginHorizontal: 16 }, + entriesCard: { paddingTop: 12, borderRadius: 8 }, +}); diff --git a/packages/react-native-room-kit/src/components/QuizLeaderboardSummary.tsx b/packages/react-native-room-kit/src/components/QuizLeaderboardSummary.tsx new file mode 100644 index 000000000..674fccc45 --- /dev/null +++ b/packages/react-native-room-kit/src/components/QuizLeaderboardSummary.tsx @@ -0,0 +1,207 @@ +import * as React from 'react'; +import { Text, StyleSheet, View } from 'react-native'; + +import { useHMSRoomStyleSheet } from '../hooks-util'; + +export interface QuizLeaderboardSummaryProps { + data: { label: string; value: any }[][]; +} + +export const QuizLeaderboardSummary: React.FC = ({ + data, +}) => { + const hmsRoomStyles = useHMSRoomStyleSheet((theme, typography) => ({ + regularHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-Regular`, + }, + regularMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-Regular`, + }, + semiBoldMediumText: { + color: theme.palette.on_surface_medium, + fontFamily: `${typography.font_family}-SemiBold`, + }, + semiBoldHighText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + headerText: { + color: theme.palette.on_surface_high, + fontFamily: `${typography.font_family}-SemiBold`, + }, + container: { + backgroundColor: theme.palette.surface_dim, + }, + summaryContainer: { + backgroundColor: theme.palette.surface_default, + }, + entriesCard: { + backgroundColor: theme.palette.surface_default, + }, + divider: { + backgroundColor: theme.palette.border_bright, + }, + })); + + return ( + + + Participation Summary + + + + {data.map((summaryMap, index) => ( + + {summaryMap.map((summary, index) => ( + + {index > 0 ? : null} + + + + {summary.label} + + + + {summary.value} + + + + ))} + + ))} + + + ); +}; + +const styles = StyleSheet.create({ + tinyText: { + fontSize: 10, + lineHeight: 16, + letterSpacing: 1.5, + }, + smallerText: { + fontSize: 12, + lineHeight: 16, + }, + smallText: { + fontSize: 14, + lineHeight: 20, + }, + normalText: { + fontSize: 16, + lineHeight: 24, + }, + marginBottom8: { + marginBottom: 8, + }, + marginBottom16: { + marginBottom: 16, + }, + contentContainer: { + paddingHorizontal: 24, + }, + scrollViewContentContainer: { + flexGrow: 1, + paddingVertical: 24, + }, + summaryWrapper: { + flexBasis: '50%', + flexGrow: 1, + flexShrink: 1, + padding: 16, + borderRadius: 12, + }, + position: { + width: 24, + height: 24, + borderRadius: 12, + textAlign: 'center', + textAlignVertical: 'center', + marginRight: 12, + }, + firstPosition: { + backgroundColor: '#D69516', // '#FFD700' + }, + secondPosition: { + backgroundColor: '#3E3E3E', // '#C0C0C0' + }, + thirdPosition: { + backgroundColor: '#583B0F', // '#CD7F32' + }, + iconWrapper: { + flexDirection: 'row', + alignItems: 'center', + marginLeft: 12, + }, + // Utilities + fullView: { + flex: 1, + }, + // Header + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 24, + marginHorizontal: 24, + }, + headerControls: { + flexDirection: 'row', + alignItems: 'center', + flexShrink: 1, + }, + headerText: { + fontSize: 20, + lineHeight: 24, + letterSpacing: 0.15, + marginRight: 12, + }, + closeIconHitSlop: { + bottom: 16, + left: 16, + right: 16, + top: 16, + }, + backIcon: { + marginRight: 8, + }, + // Divider + halfDivider: { + marginHorizontal: 24, + marginVertical: 0, + marginTop: 24, + width: undefined, + }, + divider: { height: 1, width: '100%' }, + viewAllBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + paddingVertical: 12, + paddingHorizontal: 16, + }, + leaderboardEntry: { marginBottom: 16, marginHorizontal: 16 }, + entriesCard: { paddingTop: 12, borderRadius: 8 }, +}); diff --git a/packages/react-native-room-kit/src/components/VoterParticipationSummary.tsx b/packages/react-native-room-kit/src/components/VoterParticipationSummary.tsx new file mode 100644 index 000000000..cb08c9fca --- /dev/null +++ b/packages/react-native-room-kit/src/components/VoterParticipationSummary.tsx @@ -0,0 +1,67 @@ +import * as React from 'react'; +import type { HMSPoll } from '@100mslive/react-native-hms'; +import { useSelector } from 'react-redux'; + +import type { RootState } from '../redux'; +import { QuizLeaderboardSummary } from './QuizLeaderboardSummary'; +import { useFetchLeaderboardResponse } from '../utils/hooks'; + +export interface VoterParticipationSummaryProps { + pollId: HMSPoll['pollId']; +} + +export const VoterParticipationSummary: React.FC< + VoterParticipationSummaryProps +> = ({ pollId }) => { + const localPeerUserId = useSelector( + (state: RootState) => state.hmsStates.localPeer?.customerUserID + ); + const leaderboardData = useFetchLeaderboardResponse(pollId); + const totalQuestions = useSelector( + (state: RootState) => state.polls.polls[pollId]?.questions?.length + ); + + const localLeaderboardEntry = + localPeerUserId && leaderboardData && Array.isArray(leaderboardData.entries) + ? leaderboardData.entries.find( + (entry) => entry.peer?.customerUserId === localPeerUserId + ) + : null; + + const data = React.useMemo(() => { + return [ + [ + { + label: 'ANSWERED', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.totalResponses === 'number' && + typeof totalQuestions === 'number' + ? `${Math.round((localLeaderboardEntry.totalResponses / totalQuestions) * 100)}% (${localLeaderboardEntry.totalResponses}/${totalQuestions})` + : '-', + }, + { + label: 'CORRECT ANSWERS', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.correctResponses === 'number' && + typeof totalQuestions === 'number' + ? `${Math.round((localLeaderboardEntry.correctResponses / totalQuestions) * 100)}% (${localLeaderboardEntry.correctResponses}/${totalQuestions})` + : '-', + }, + ], + [ + { + label: 'TIME TAKEN', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.duration === 'number' + ? `${(localLeaderboardEntry.duration / 1000).toFixed(2)}s` + : '-', + }, + ], + ]; + }, [localLeaderboardEntry]); + + return ; +}; diff --git a/packages/react-native-room-kit/src/redux/actionTypes.ts b/packages/react-native-room-kit/src/redux/actionTypes.ts index 1c6606270..39734e7d7 100644 --- a/packages/react-native-room-kit/src/redux/actionTypes.ts +++ b/packages/react-native-room-kit/src/redux/actionTypes.ts @@ -3,6 +3,7 @@ import type { HMSPollQuestion, HMSPollQuestionType, HMSPollType, + PollLeaderboardResponse, } from '@100mslive/react-native-hms'; const createRequests = (base: String) => { @@ -195,6 +196,8 @@ export enum CreatePollStages { POLL_CONFIG, POLL_QUESTION_CONFIG, POLL_VOTING, + QUIZ_LEADERBOARD, + QUIZ_LEADERBOARD_ENTRIES, } export type PollConfig = { @@ -217,7 +220,10 @@ export type PollsActionType = | SetDeleteConfirmationVisible | SetPollNameAction | SetPollConfigAction - | SetPollStageAction + | PushToNavigationStackAction + | ResetNavigationStackAction + | PopFromNavigationStackAction + | ReplaceTopOfNavigationStackAction | AddPollQuestionAction | DeletePollQuestionAction | SetSelectedQuestionIndexAction @@ -241,6 +247,7 @@ export type PollsActionType = | AddPollQuestionResponseAction | RemovePollQuestionResponseAction | AddCuedPollIdAction + | AddLeaderboardAction | { type: HmsStateActionTypes.CLEAR_STATES }; export type ClearPollFormStateAction = { @@ -262,9 +269,22 @@ export type SetPollConfigAction = { pollConfig: Partial; }; -export type SetPollStageAction = { - type: PollsStateActionTypes.SET_POLL_STAGE; - pollStage: CreatePollStages; +export type PushToNavigationStackAction = { + type: PollsStateActionTypes.PUSH_TO_NAVIGATION_STACK; + screen: CreatePollStages; +}; + +export type ResetNavigationStackAction = { + type: PollsStateActionTypes.RESET_NAVIGATION_STACK; +}; + +export type PopFromNavigationStackAction = { + type: PollsStateActionTypes.POP_FROM_NAVIGATION_STACK; +}; + +export type ReplaceTopOfNavigationStackAction = { + type: PollsStateActionTypes.REPLACE_TOP_OF_NAVIGATION_STACK; + screen: CreatePollStages; }; export type AddPollQuestionAction = { @@ -391,12 +411,21 @@ export type AddCuedPollIdAction = { pollId: HMSPoll['pollId']; }; +export type AddLeaderboardAction = { + type: PollsStateActionTypes.ADD_LEADERBOARD; + pollId: HMSPoll['pollId']; + leaderboard: PollLeaderboardResponse; +}; + export enum PollsStateActionTypes { CLEAR_POLL_FORM_STATE = 'CLEAR_POLL_FORM_STATE', SET_DELETE_CONFIRMATION_VISIBLE = 'SET_DELETE_CONFIRMATION_VISIBLE', SET_POLL_NAME = 'SET_POLL_NAME', SET_POLL_CONFIG = 'SET_POLL_CONFIG', - SET_POLL_STAGE = 'SET_POLL_STAGE', + PUSH_TO_NAVIGATION_STACK = 'PUSH_TO_NAVIGATION_STACK', + RESET_NAVIGATION_STACK = 'RESET_NAVIGATION_STACK', + POP_FROM_NAVIGATION_STACK = 'POP_FROM_NAVIGATION_STACK', + REPLACE_TOP_OF_NAVIGATION_STACK = 'REPLACE_TOP_OF_NAVIGATION_STACK', ADD_POLL_QUESTION = 'ADD_POLL_QUESTION', DELETE_POLL_QUESTION = 'DELETE_POLL_QUESTION', SET_SELECTED_QUESTION_INDEX = 'SET_SELECTED_QUESTION_INDEX', @@ -419,4 +448,5 @@ export enum PollsStateActionTypes { REMOVE_POLL_QUESTION_RESPONSE = 'REMOVE_POLL_QUESTION_RESPONSE', ADD_POLL_QUESTION_RESPONSE = 'ADD_POLL_QUESTION_RESPONSE', ADD_CUED_POLL_ID = 'ADD_CUED_POLL_ID', + ADD_LEADERBOARD = 'ADD_LEADERBOARD', } diff --git a/packages/react-native-room-kit/src/redux/actions/index.ts b/packages/react-native-room-kit/src/redux/actions/index.ts index 2d5d6ce52..ad80bce3c 100644 --- a/packages/react-native-room-kit/src/redux/actions/index.ts +++ b/packages/react-native-room-kit/src/redux/actions/index.ts @@ -32,7 +32,6 @@ import type { AddPollQuestionAction, SetPollConfigAction, SetPollNameAction, - SetPollStageAction, DeletePollQuestionAction, SetDeleteConfirmationVisible, SetSelectedQuestionIndexAction, @@ -54,6 +53,11 @@ import type { RemovePollQuestionResponseAction, SetQuestionPointWeightageAction, SetQuestionCorrectOptionAction, + PushToNavigationStackAction, + PopFromNavigationStackAction, + ReplaceTopOfNavigationStackAction, + AddLeaderboardAction, + ResetNavigationStackAction, } from '../actionTypes'; import { MeetingState } from '../../types'; import type { ChatState, Notification, PinnedMessage } from '../../types'; @@ -491,11 +495,26 @@ export const setPollConfig = ( pollConfig, }); -export const setPollStage = ( - pollStage: SetPollStageAction['pollStage'] -): SetPollStageAction => ({ - type: PollsStateActionTypes.SET_POLL_STAGE, - pollStage, +export const pushToNavigationStack = ( + screen: PushToNavigationStackAction['screen'] +): PushToNavigationStackAction => ({ + type: PollsStateActionTypes.PUSH_TO_NAVIGATION_STACK, + screen, +}); + +export const resetNavigationStack = (): ResetNavigationStackAction => ({ + type: PollsStateActionTypes.RESET_NAVIGATION_STACK, +}); + +export const popFromNavigationStack = (): PopFromNavigationStackAction => ({ + type: PollsStateActionTypes.POP_FROM_NAVIGATION_STACK, +}); + +export const replaceTopOfNavigationStack = ( + screen: ReplaceTopOfNavigationStackAction['screen'] +): ReplaceTopOfNavigationStackAction => ({ + type: PollsStateActionTypes.REPLACE_TOP_OF_NAVIGATION_STACK, + screen, }); export const addPollQuestion = (): AddPollQuestionAction => ({ @@ -672,3 +691,12 @@ export const addCuedPollId = (pollId: string) => ({ type: PollsStateActionTypes.ADD_CUED_POLL_ID, pollId, }); + +export const addLeaderboard = ( + pollId: AddLeaderboardAction['pollId'], + leaderboard: AddLeaderboardAction['leaderboard'] +): AddLeaderboardAction => ({ + type: PollsStateActionTypes.ADD_LEADERBOARD, + pollId, + leaderboard, +}); diff --git a/packages/react-native-room-kit/src/redux/reducers/polls.ts b/packages/react-native-room-kit/src/redux/reducers/polls.ts index 3daedf71d..d34a1fd55 100644 --- a/packages/react-native-room-kit/src/redux/reducers/polls.ts +++ b/packages/react-native-room-kit/src/redux/reducers/polls.ts @@ -1,5 +1,8 @@ import { HMSPollQuestionType, HMSPollType } from '@100mslive/react-native-hms'; -import type { HMSPoll } from '@100mslive/react-native-hms'; +import type { + HMSPoll, + PollLeaderboardResponse, +} from '@100mslive/react-native-hms'; import { PollsStateActionTypes, @@ -30,7 +33,7 @@ function getDefaultQuestionObj(): PollQuestionUI { type IntialStateType = { pollName: string; pollConfig: PollConfig; - stage: CreatePollStages; + navigationStack: CreatePollStages[]; questions: PollQuestionUI[]; deleteConfirmationVisible: boolean; selectedPollQuestionIndex: number | null; @@ -39,6 +42,7 @@ type IntialStateType = { cuedPollIds: HMSPoll['pollId'][]; // In case of HLSViewer, pollIds should be aligned with onCue event polls: Record; pollsResponses: Record>; + leaderboards: Record; }; const INITIAL_STATE: IntialStateType = { @@ -48,7 +52,7 @@ const INITIAL_STATE: IntialStateType = { voteCountHidden: false, resultsAnonymous: false, }, - stage: CreatePollStages.POLL_CONFIG, + navigationStack: [CreatePollStages.POLL_CONFIG], questions: [getDefaultQuestionObj()], deleteConfirmationVisible: false, selectedPollQuestionIndex: null, @@ -57,6 +61,7 @@ const INITIAL_STATE: IntialStateType = { cuedPollIds: [], polls: {}, pollsResponses: {}, + leaderboards: {}, }; const hmsStatesReducer = ( @@ -87,11 +92,30 @@ const hmsStatesReducer = ( : state.questions, selectedPollQuestionIndex: null, }; - case PollsStateActionTypes.SET_POLL_STAGE: + case PollsStateActionTypes.PUSH_TO_NAVIGATION_STACK: return { ...state, - stage: action.pollStage, - selectedPollQuestionIndex: null, + navigationStack: [...state.navigationStack, action.screen], + }; + case PollsStateActionTypes.RESET_NAVIGATION_STACK: + return { + ...state, + navigationStack: INITIAL_STATE.navigationStack, + }; + case PollsStateActionTypes.POP_FROM_NAVIGATION_STACK: { + const updatedNavigationStack = [...state.navigationStack]; + updatedNavigationStack.pop(); + return { + ...state, + navigationStack: updatedNavigationStack, + }; + } + case PollsStateActionTypes.REPLACE_TOP_OF_NAVIGATION_STACK: + const updatedNavigationStack = [...state.navigationStack]; + updatedNavigationStack[updatedNavigationStack.length - 1] = action.screen; + return { + ...state, + navigationStack: updatedNavigationStack, }; case PollsStateActionTypes.ADD_POLL_QUESTION: return { @@ -286,6 +310,51 @@ const hmsStatesReducer = ( selectedPollId: action.pollId, }; case PollsStateActionTypes.ADD_POLL: + const prevPoll = state.polls[action.poll.pollId]; + + // Hack: Restore previous state of poll if current poll has missing myResponses and voteCount + if ( + prevPoll && + Array.isArray(prevPoll.questions) && + prevPoll.questions.length > 0 + ) { + action.poll.questions?.forEach((question) => { + const prevQuestion = prevPoll.questions?.find( + (prevQuestion) => prevQuestion.index === question.index + ); + + //#region Restore previous responses on question if current question has no responses + const prevResponsesOnQuestion = prevQuestion?.myResponses; + if ( + Array.isArray(prevResponsesOnQuestion) && + prevResponsesOnQuestion.length > 0 && + (!question.myResponses || question.myResponses.length <= 0) + ) { + question.myResponses = prevResponsesOnQuestion; + } + //#endregion + + //#region Restore previous voteCount on question options if current question options has no voteCount + const prevOptions = prevQuestion?.options; + + question.options?.forEach((option) => { + const prevOption = prevOptions?.find( + (prevOption) => prevOption.index === option.index + ); + + // Edge Case: User changes response on question, due to which new vountCount becomes 0, and we are treating as invalid value + if ( + option.voteCount <= 0 && + prevOption && + prevOption?.voteCount > 0 + ) { + option.voteCount = prevOption.voteCount; + } + }); + //#endregion + }); + } + return { ...state, polls: { @@ -360,6 +429,15 @@ const hmsStatesReducer = ( cuedPollIds: [...state.cuedPollIds, action.pollId], }; } + case PollsStateActionTypes.ADD_LEADERBOARD: { + return { + ...state, + leaderboards: { + ...state.leaderboards, + [action.pollId]: action.leaderboard, + }, + }; + } case PollsStateActionTypes.CLEAR_POLL_FORM_STATE: { return { ...INITIAL_STATE, diff --git a/packages/react-native-room-kit/src/utils/hooks.ts b/packages/react-native-room-kit/src/utils/hooks.ts index 0333da1ea..48ea7f436 100644 --- a/packages/react-native-room-kit/src/utils/hooks.ts +++ b/packages/react-native-room-kit/src/utils/hooks.ts @@ -1,4 +1,4 @@ -import { useEffect } from 'react'; +import { useEffect, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { HMSLocalAudioStats, @@ -13,10 +13,12 @@ import { HMSTrackSource, HMSUpdateListenerActions, } from '@100mslive/react-native-hms'; +import type { HMSPoll } from '@100mslive/react-native-hms'; -import type { RootState } from '../redux'; -import { setRTCStats } from '../redux/actions'; import { ModalTypes } from './types'; +import type { RootState } from '../redux'; +import { addLeaderboard, setRTCStats } from '../redux/actions'; +import { useHMSInstance } from '../hooks-util'; export const useRTCStatsListeners = () => { const dispatch = useDispatch(); @@ -102,3 +104,188 @@ export const useRTCStatsListeners = () => { } }, [hmsInstance, addListeners]); }; + +export const useFetchLeaderboardResponse = ( + pollId: HMSPoll['pollId'] | undefined +) => { + const dispatch = useDispatch(); + const hmsInstance = useHMSInstance(); + + const hasPollWritePermission = useSelector((state: RootState) => { + const permissions = state.hmsStates.localPeer?.role?.permissions; + return permissions?.pollWrite; + }); + + const leaderboardData = useSelector((state: RootState) => { + if (!pollId) return null; + return state.polls.leaderboards[pollId] || null; + }); + + const leaderboardDataExist = !!leaderboardData; + + useEffect(() => { + if (!!leaderboardData) return; + + let mounted = true; + + async function fetchLeaderboard() { + if (pollId) { + const response = await hmsInstance.interactivityCenter.fetchLeaderboard( + pollId, + 5, + 1, // Indexing starts from 1 + !hasPollWritePermission // fetchCurrentUser only if user has only pollRead permission + ); + if (mounted) { + dispatch(addLeaderboard(pollId, response)); + } + } + } + fetchLeaderboard(); + + return () => { + mounted = false; + }; + }, [pollId, leaderboardDataExist, hasPollWritePermission]); + + return leaderboardData; +}; + +export const useLeaderboardSummaryData = ( + pollId: HMSPoll['pollId'] | undefined +): { label: string; value: any }[][] | null => { + const localPeerUserId = useSelector( + (state: RootState) => state.hmsStates.localPeer?.customerUserID + ); + const localPeerPollInitiator = useSelector((state: RootState) => { + if (!pollId) return null; + const pollInitiatorUserID = + state.polls.polls[pollId]?.createdBy?.customerUserID; + return ( + localPeerUserId && + pollInitiatorUserID && + localPeerUserId === pollInitiatorUserID + ); + }); + const canCreateOrEndPoll = useSelector((state: RootState) => { + const permissions = state.hmsStates.localPeer?.role?.permissions; + return permissions?.pollWrite; + }); + + const leaderboardData = useSelector((state: RootState) => { + if (!pollId) return null; + return state.polls.leaderboards[pollId] || null; + }); + const pollQuestionsLength = useSelector((state: RootState) => { + if (!pollId) return null; + return state.polls.polls[pollId]?.questions?.length; + }); + const leaderboardSummary = leaderboardData?.summary; + + const pollInitiatorSummaryData = useMemo(() => { + if (!localPeerPollInitiator) { + return null; + } + return [ + [ + { + label: 'ANSWERED', + value: + leaderboardSummary && + typeof leaderboardSummary.respondedPeersCount === 'number' && + typeof leaderboardSummary.totalPeersCount === 'number' + ? `${Math.round((leaderboardSummary.respondedPeersCount / leaderboardSummary.totalPeersCount) * 100)}% (${leaderboardSummary.respondedPeersCount}/${leaderboardSummary.totalPeersCount})` + : '-', + }, + { + label: 'CORRECT ANSWERS', + value: + leaderboardSummary && + typeof leaderboardSummary.respondedCorrectlyPeersCount === + 'number' && + typeof leaderboardSummary.totalPeersCount === 'number' + ? `${Math.round((leaderboardSummary.respondedCorrectlyPeersCount / leaderboardSummary?.totalPeersCount) * 100)}% (${leaderboardSummary.respondedCorrectlyPeersCount}/${leaderboardSummary.totalPeersCount})` + : '-', + }, + ], + [ + { + label: 'AVG. TIME TAKEN', + value: + leaderboardSummary && + typeof leaderboardSummary.averageTime === 'number' + ? `${(leaderboardSummary.averageTime / 1000).toFixed(2)}s` + : '-', // averageTime is in milliseconds + }, + { + label: 'AVG. SCORE', + value: + leaderboardSummary && + typeof leaderboardSummary.averageScore === 'number' + ? leaderboardSummary.averageScore.toFixed(2) + : '-', + }, + ], + ]; + }, [leaderboardSummary, localPeerPollInitiator]); + + const localLeaderboardEntry = + localPeerUserId && leaderboardData && Array.isArray(leaderboardData.entries) + ? leaderboardData.entries.find( + (entry) => entry.peer?.customerUserId === localPeerUserId + ) + : null; + + const voterSummaryData = useMemo(() => { + if (!localLeaderboardEntry || canCreateOrEndPoll) { + return null; + } + return [ + [ + { + label: 'YOUR RANK', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.totalResponses === 'number' && + leaderboardSummary && + typeof leaderboardSummary.totalPeersCount === 'number' + ? `${localLeaderboardEntry.position}/${leaderboardSummary.totalPeersCount}` + : '-', + }, + { + label: 'CORRECT ANSWERS', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.correctResponses === 'number' && + typeof pollQuestionsLength === 'number' + ? `${Math.round((localLeaderboardEntry.correctResponses / pollQuestionsLength) * 100)}% (${localLeaderboardEntry.correctResponses}/${pollQuestionsLength})` + : '-', + }, + ], + [ + { + label: 'TIME TAKEN', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.duration === 'number' + ? `${(localLeaderboardEntry.duration / 1000).toFixed(2)}s` + : '-', + }, + { + label: 'YOUR POINTS', + value: + localLeaderboardEntry && + typeof localLeaderboardEntry.score === 'number' + ? localLeaderboardEntry.score + : '-', + }, + ], + ]; + }, [localLeaderboardEntry, leaderboardSummary?.totalPeersCount]); + + return localPeerPollInitiator + ? pollInitiatorSummaryData + : voterSummaryData + ? voterSummaryData + : null; +};