@100mslive/react-native-hms 1.9.9 → 1.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/local.properties +8 -1
- package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +2 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +61 -2
- package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +10 -3
- package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +328 -0
- package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityHelper.kt +352 -0
- package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +184 -0
- package/ios/HMSConstants.swift +1 -0
- package/ios/HMSDecoder.swift +3 -1
- package/ios/HMSInteractivityDecoder.swift +223 -0
- package/ios/HMSInteractivityHelper.swift +169 -0
- package/ios/HMSManager.m +17 -0
- package/ios/HMSManager.swift +30 -1
- package/ios/HMSRNInteractivityCenter.swift +89 -0
- package/ios/HMSRNSDK.swift +10 -4
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/jatinnagar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Hmssdk.xcodeproj/xcuserdata/jatinnagar.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/lib/commonjs/classes/HMSInteractivityCenter.js +93 -0
- package/lib/commonjs/classes/HMSInteractivityCenter.js.map +1 -0
- package/lib/commonjs/classes/HMSInteractivityEncoder.js +33 -0
- package/lib/commonjs/classes/HMSInteractivityEncoder.js.map +1 -0
- package/lib/commonjs/classes/HMSPermissions.js +4 -0
- package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
- package/lib/commonjs/classes/HMSPollsListenerActions.js +11 -0
- package/lib/commonjs/classes/HMSPollsListenerActions.js.map +1 -0
- package/lib/commonjs/classes/HMSSDK.js +8 -0
- package/lib/commonjs/classes/HMSSDK.js.map +1 -1
- package/lib/commonjs/classes/polls/HMSPoll.js +6 -0
- package/lib/commonjs/classes/polls/HMSPoll.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollCategory.js +12 -0
- package/lib/commonjs/classes/polls/HMSPollCategory.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollCreateParams.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollCreateParams.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestion.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestion.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionAnswer.js +2 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionAnswer.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionCreateParams.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionCreateParams.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionOption.js +2 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionOption.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionOptionCreateParams.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionOptionCreateParams.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionQuizOptionCreateParams.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionQuizOptionCreateParams.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponse.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponse.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponseCreateParams.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponseCreateParams.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponseResult.js +2 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResponseResult.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResult.js +2 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionResult.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionType.js +14 -0
- package/lib/commonjs/classes/polls/HMSPollQuestionType.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollResponsePeerInfo.js +2 -0
- package/lib/commonjs/classes/polls/HMSPollResponsePeerInfo.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollResult.js +6 -0
- package/lib/commonjs/classes/polls/HMSPollResult.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollState.js +13 -0
- package/lib/commonjs/classes/polls/HMSPollState.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollType.js +12 -0
- package/lib/commonjs/classes/polls/HMSPollType.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollUpdateType.js +13 -0
- package/lib/commonjs/classes/polls/HMSPollUpdateType.js.map +1 -0
- package/lib/commonjs/classes/polls/HMSPollUserTrackingMode.js +13 -0
- package/lib/commonjs/classes/polls/HMSPollUserTrackingMode.js.map +1 -0
- package/lib/commonjs/hooks/polls.js +17 -0
- package/lib/commonjs/hooks/polls.js.map +1 -0
- package/lib/commonjs/index.js +56 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/stores/hms-interactivity-store.js +21 -0
- package/lib/commonjs/stores/hms-interactivity-store.js.map +1 -0
- package/lib/commonjs/stores/hms-polls-slice.js +19 -0
- package/lib/commonjs/stores/hms-polls-slice.js.map +1 -0
- package/lib/commonjs/stores/types.js.map +1 -1
- package/lib/commonjs/utils/emitter/EventEmitter.js +19 -0
- package/lib/commonjs/utils/emitter/EventEmitter.js.map +1 -1
- package/lib/module/classes/HMSInteractivityCenter.js +85 -0
- package/lib/module/classes/HMSInteractivityCenter.js.map +1 -0
- package/lib/module/classes/HMSInteractivityEncoder.js +26 -0
- package/lib/module/classes/HMSInteractivityEncoder.js.map +1 -0
- package/lib/module/classes/HMSPermissions.js +4 -0
- package/lib/module/classes/HMSPermissions.js.map +1 -1
- package/lib/module/classes/HMSPollsListenerActions.js +5 -0
- package/lib/module/classes/HMSPollsListenerActions.js.map +1 -0
- package/lib/module/classes/HMSSDK.js +8 -0
- package/lib/module/classes/HMSSDK.js.map +1 -1
- package/lib/module/classes/polls/HMSPoll.js +2 -0
- package/lib/module/classes/polls/HMSPoll.js.map +1 -0
- package/lib/module/classes/polls/HMSPollCategory.js +6 -0
- package/lib/module/classes/polls/HMSPollCategory.js.map +1 -0
- package/lib/module/classes/polls/HMSPollCreateParams.js +2 -0
- package/lib/module/classes/polls/HMSPollCreateParams.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestion.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestion.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionAnswer.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionAnswer.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionCreateParams.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionCreateParams.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionOption.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionOption.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionOptionCreateParams.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionOptionCreateParams.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionQuizOptionCreateParams.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionQuizOptionCreateParams.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionResponse.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionResponse.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionResponseCreateParams.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionResponseCreateParams.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionResponseResult.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionResponseResult.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionResult.js +2 -0
- package/lib/module/classes/polls/HMSPollQuestionResult.js.map +1 -0
- package/lib/module/classes/polls/HMSPollQuestionType.js +8 -0
- package/lib/module/classes/polls/HMSPollQuestionType.js.map +1 -0
- package/lib/module/classes/polls/HMSPollResponsePeerInfo.js +2 -0
- package/lib/module/classes/polls/HMSPollResponsePeerInfo.js.map +1 -0
- package/lib/module/classes/polls/HMSPollResult.js +2 -0
- package/lib/module/classes/polls/HMSPollResult.js.map +1 -0
- package/lib/module/classes/polls/HMSPollState.js +7 -0
- package/lib/module/classes/polls/HMSPollState.js.map +1 -0
- package/lib/module/classes/polls/HMSPollType.js +6 -0
- package/lib/module/classes/polls/HMSPollType.js.map +1 -0
- package/lib/module/classes/polls/HMSPollUpdateType.js +7 -0
- package/lib/module/classes/polls/HMSPollUpdateType.js.map +1 -0
- package/lib/module/classes/polls/HMSPollUserTrackingMode.js +7 -0
- package/lib/module/classes/polls/HMSPollUserTrackingMode.js.map +1 -0
- package/lib/module/hooks/polls.js +12 -0
- package/lib/module/hooks/polls.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/stores/hms-interactivity-store.js +15 -0
- package/lib/module/stores/hms-interactivity-store.js.map +1 -0
- package/lib/module/stores/hms-polls-slice.js +12 -0
- package/lib/module/stores/hms-polls-slice.js.map +1 -0
- package/lib/module/stores/types.js.map +1 -1
- package/lib/module/utils/emitter/EventEmitter.js +19 -0
- package/lib/module/utils/emitter/EventEmitter.js.map +1 -1
- package/lib/typescript/classes/HMSInteractivityCenter.d.ts +35 -0
- package/lib/typescript/classes/HMSInteractivityEncoder.d.ts +4 -0
- package/lib/typescript/classes/HMSPermissions.d.ts +4 -0
- package/lib/typescript/classes/HMSPollsListenerActions.d.ts +3 -0
- package/lib/typescript/classes/HMSSDK.d.ts +3 -0
- package/lib/typescript/classes/polls/HMSPoll.d.ts +81 -0
- package/lib/typescript/classes/polls/HMSPollCategory.d.ts +10 -0
- package/lib/typescript/classes/polls/HMSPollCreateParams.d.ts +6 -0
- package/lib/typescript/classes/polls/HMSPollQuestion.d.ts +61 -0
- package/lib/typescript/classes/polls/HMSPollQuestionAnswer.d.ts +17 -0
- package/lib/typescript/classes/polls/HMSPollQuestionCreateParams.d.ts +25 -0
- package/lib/typescript/classes/polls/HMSPollQuestionOption.d.ts +21 -0
- package/lib/typescript/classes/polls/HMSPollQuestionOptionCreateParams.d.ts +3 -0
- package/lib/typescript/classes/polls/HMSPollQuestionQuizOptionCreateParams.d.ts +4 -0
- package/lib/typescript/classes/polls/HMSPollQuestionResponse.d.ts +47 -0
- package/lib/typescript/classes/polls/HMSPollQuestionResponseCreateParams.d.ts +2 -0
- package/lib/typescript/classes/polls/HMSPollQuestionResponseResult.d.ts +17 -0
- package/lib/typescript/classes/polls/HMSPollQuestionResult.d.ts +29 -0
- package/lib/typescript/classes/polls/HMSPollQuestionType.d.ts +18 -0
- package/lib/typescript/classes/polls/HMSPollResponsePeerInfo.d.ts +21 -0
- package/lib/typescript/classes/polls/HMSPollResult.d.ts +22 -0
- package/lib/typescript/classes/polls/HMSPollState.d.ts +14 -0
- package/lib/typescript/classes/polls/HMSPollType.d.ts +4 -0
- package/lib/typescript/classes/polls/HMSPollUpdateType.d.ts +5 -0
- package/lib/typescript/classes/polls/HMSPollUserTrackingMode.d.ts +14 -0
- package/lib/typescript/hooks/polls.d.ts +3 -0
- package/lib/typescript/index.d.ts +8 -0
- package/lib/typescript/stores/hms-interactivity-store.d.ts +9 -0
- package/lib/typescript/stores/hms-polls-slice.d.ts +5 -0
- package/lib/typescript/stores/types.d.ts +6 -0
- package/lib/typescript/utils/emitter/EventEmitter.d.ts +7 -0
- package/package.json +1 -1
- package/sdk-versions.json +2 -2
- package/src/classes/HMSInteractivityCenter.ts +126 -0
- package/src/classes/HMSInteractivityEncoder.ts +29 -0
- package/src/classes/HMSPermissions.ts +6 -0
- package/src/classes/HMSPollsListenerActions.ts +3 -0
- package/src/classes/HMSSDK.tsx +10 -0
- package/src/classes/polls/HMSPoll.ts +108 -0
- package/src/classes/polls/HMSPollCategory.ts +11 -0
- package/src/classes/polls/HMSPollCreateParams.ts +19 -0
- package/src/classes/polls/HMSPollQuestion.ts +92 -0
- package/src/classes/polls/HMSPollQuestionAnswer.ts +29 -0
- package/src/classes/polls/HMSPollQuestionCreateParams.ts +36 -0
- package/src/classes/polls/HMSPollQuestionOption.ts +24 -0
- package/src/classes/polls/HMSPollQuestionOptionCreateParams.ts +8 -0
- package/src/classes/polls/HMSPollQuestionQuizOptionCreateParams.ts +6 -0
- package/src/classes/polls/HMSPollQuestionResponse.ts +72 -0
- package/src/classes/polls/HMSPollQuestionResponseCreateParams.ts +6 -0
- package/src/classes/polls/HMSPollQuestionResponseResult.ts +19 -0
- package/src/classes/polls/HMSPollQuestionResult.ts +41 -0
- package/src/classes/polls/HMSPollQuestionType.ts +21 -0
- package/src/classes/polls/HMSPollResponsePeerInfo.ts +24 -0
- package/src/classes/polls/HMSPollResult.ts +26 -0
- package/src/classes/polls/HMSPollState.ts +16 -0
- package/src/classes/polls/HMSPollType.ts +4 -0
- package/src/classes/polls/HMSPollUpdateType.ts +5 -0
- package/src/classes/polls/HMSPollUserTrackingMode.ts +16 -0
- package/src/hooks/polls.ts +14 -0
- package/src/index.ts +9 -0
- package/src/stores/hms-interactivity-store.ts +18 -0
- package/src/stores/hms-polls-slice.ts +20 -0
- package/src/stores/types.ts +20 -3
- package/src/utils/emitter/EventEmitter.ts +26 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
package com.reactnativehmssdk
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
import live.hms.video.polls.HMSPollBuilder
|
|
5
|
+
import live.hms.video.polls.HMSPollQuestionBuilder
|
|
6
|
+
import live.hms.video.polls.HMSPollResponseBuilder
|
|
7
|
+
import live.hms.video.polls.models.HmsPoll
|
|
8
|
+
import live.hms.video.polls.models.HmsPollCategory
|
|
9
|
+
import live.hms.video.polls.models.HmsPollUserTrackingMode
|
|
10
|
+
import live.hms.video.polls.models.question.HMSPollQuestion
|
|
11
|
+
import live.hms.video.polls.models.question.HMSPollQuestionType
|
|
12
|
+
import live.hms.video.sdk.models.role.HMSRole
|
|
13
|
+
|
|
14
|
+
object HMSInteractivityHelper {
|
|
15
|
+
// region Create a poll
|
|
16
|
+
fun getPollBuilder(
|
|
17
|
+
data: ReadableMap,
|
|
18
|
+
roles: List<HMSRole>,
|
|
19
|
+
): HMSPollBuilder {
|
|
20
|
+
val pollBuilder = HMSPollBuilder.Builder()
|
|
21
|
+
|
|
22
|
+
if (data.hasKey("isAnonymous")) {
|
|
23
|
+
pollBuilder.withAnonymous(data.getBoolean("isAnonymous"))
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (data.hasKey("duration")) {
|
|
27
|
+
pollBuilder.withDuration(data.getInt("duration").toLong())
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (data.hasKey("mode")) {
|
|
31
|
+
pollBuilder.withUserTrackingMode(getUserTrackingMode(data))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (data.hasKey("type")) {
|
|
35
|
+
pollBuilder.withCategory(getPollCategory(data))
|
|
36
|
+
} else {
|
|
37
|
+
pollBuilder.withCategory(HmsPollCategory.POLL)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
data.getString("pollId")?.let {
|
|
41
|
+
pollBuilder.withPollId(it)
|
|
42
|
+
}
|
|
43
|
+
data.getString("title")?.let {
|
|
44
|
+
pollBuilder.withTitle(it)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (data.hasKey("rolesThatCanViewResponses")) {
|
|
48
|
+
pollBuilder.withRolesThatCanViewResponses(getRolesThatCanViewResponses(data, roles))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (data.hasKey("rolesThatCanVote")) {
|
|
52
|
+
pollBuilder.withRolesThatCanVote(getRolesThatCanVote(data, roles))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (data.hasKey("questions")) {
|
|
56
|
+
val questions = data.getArray("questions")?.toArrayList() as? ArrayList<HashMap<String, Any>>
|
|
57
|
+
|
|
58
|
+
if (questions != null) {
|
|
59
|
+
addQuestions(questions, pollBuilder)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return pollBuilder.build()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// endregion
|
|
67
|
+
|
|
68
|
+
// region Poll Builder Helpers
|
|
69
|
+
private fun getQuestionType(type: Int): HMSPollQuestionType {
|
|
70
|
+
return when (type) {
|
|
71
|
+
0 -> HMSPollQuestionType.singleChoice
|
|
72
|
+
1 -> HMSPollQuestionType.multiChoice
|
|
73
|
+
2 -> HMSPollQuestionType.shortAnswer
|
|
74
|
+
3 -> HMSPollQuestionType.longAnswer
|
|
75
|
+
else -> HMSPollQuestionType.singleChoice
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private fun getUserTrackingMode(data: ReadableMap): HmsPollUserTrackingMode {
|
|
80
|
+
return when (data.getInt("mode")) {
|
|
81
|
+
0 -> HmsPollUserTrackingMode.PEER_ID
|
|
82
|
+
1 -> HmsPollUserTrackingMode.USER_ID
|
|
83
|
+
2 -> HmsPollUserTrackingMode.USERNAME
|
|
84
|
+
else -> HmsPollUserTrackingMode.PEER_ID
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fun getPollCategory(data: ReadableMap): HmsPollCategory {
|
|
89
|
+
return when (data.getInt("type")) {
|
|
90
|
+
0 -> HmsPollCategory.POLL
|
|
91
|
+
1 -> HmsPollCategory.QUIZ
|
|
92
|
+
else -> HmsPollCategory.POLL
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private fun getRolesThatCanViewResponses(
|
|
97
|
+
data: ReadableMap,
|
|
98
|
+
roles: List<HMSRole>,
|
|
99
|
+
): List<HMSRole> {
|
|
100
|
+
val rolesThatCanViewResponsesString =
|
|
101
|
+
data.getArray("rolesThatCanViewResponses")?.toArrayList() as? ArrayList<String>
|
|
102
|
+
val encodedTargetedRoles =
|
|
103
|
+
return HMSHelper.getRolesFromRoleNames(rolesThatCanViewResponsesString, roles)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private fun getRolesThatCanVote(
|
|
107
|
+
data: ReadableMap,
|
|
108
|
+
roles: List<HMSRole>,
|
|
109
|
+
): List<HMSRole> {
|
|
110
|
+
val rolesThatCanVoteString =
|
|
111
|
+
data.getArray("rolesThatCanVote")?.toArrayList() as? ArrayList<String>
|
|
112
|
+
return HMSHelper.getRolesFromRoleNames(rolesThatCanVoteString, roles)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private fun addQuestions(
|
|
116
|
+
questions: ArrayList<HashMap<String, Any>>,
|
|
117
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
118
|
+
) {
|
|
119
|
+
for (question in questions) {
|
|
120
|
+
val type = question["type"] as? Double
|
|
121
|
+
type?.let {
|
|
122
|
+
addPollBuilderQuestion(getQuestionType(it.toInt()), question, pollBuilder)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private fun addSingleChoiceQuestion(
|
|
128
|
+
item: HashMap<String, Any>,
|
|
129
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
130
|
+
) {
|
|
131
|
+
if (item["title"] != null && item["options"] != null) {
|
|
132
|
+
val title = item["title"] as? String
|
|
133
|
+
val options = item["options"] as? ArrayList<String>
|
|
134
|
+
|
|
135
|
+
if (title != null && options != null) {
|
|
136
|
+
val questionBuilder =
|
|
137
|
+
HMSPollQuestionBuilder.Builder(HMSPollQuestionType.singleChoice)
|
|
138
|
+
.withTitle(title)
|
|
139
|
+
|
|
140
|
+
for (i in 0 until options.size) {
|
|
141
|
+
questionBuilder.addOption(options[i])
|
|
142
|
+
}
|
|
143
|
+
pollBuilder.addQuestion(questionBuilder.build())
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private fun addMultipleChoiceQuestion(
|
|
149
|
+
item: HashMap<String, Any>,
|
|
150
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
151
|
+
) {
|
|
152
|
+
if (item["title"] != null && item["options"] != null) {
|
|
153
|
+
val title = item["title"] as? String
|
|
154
|
+
val options = item["options"] as? ArrayList<String>
|
|
155
|
+
|
|
156
|
+
if (title != null && options != null) {
|
|
157
|
+
val questionBuilder =
|
|
158
|
+
HMSPollQuestionBuilder.Builder(HMSPollQuestionType.multiChoice)
|
|
159
|
+
.withTitle(title)
|
|
160
|
+
|
|
161
|
+
for (i in 0 until options.size) {
|
|
162
|
+
questionBuilder.addOption(options[i])
|
|
163
|
+
}
|
|
164
|
+
pollBuilder.addQuestion(questionBuilder.build())
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private fun addShortAnswerQuestion(
|
|
170
|
+
item: HashMap<String, Any>,
|
|
171
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
172
|
+
) {
|
|
173
|
+
if (item["title"] != null) {
|
|
174
|
+
val title = item["title"] as? String
|
|
175
|
+
|
|
176
|
+
if (title != null) {
|
|
177
|
+
val questionBuilder =
|
|
178
|
+
HMSPollQuestionBuilder.Builder(HMSPollQuestionType.shortAnswer)
|
|
179
|
+
.withTitle(title)
|
|
180
|
+
pollBuilder.addQuestion(questionBuilder.build())
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private fun addLongAnswerQuestion(
|
|
186
|
+
item: HashMap<String, Any>,
|
|
187
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
188
|
+
) {
|
|
189
|
+
if (item["title"] != null) {
|
|
190
|
+
val title = item["title"] as? String
|
|
191
|
+
|
|
192
|
+
if (title != null) {
|
|
193
|
+
val questionBuilder =
|
|
194
|
+
HMSPollQuestionBuilder.Builder(HMSPollQuestionType.longAnswer)
|
|
195
|
+
.withTitle(title)
|
|
196
|
+
pollBuilder.addQuestion(questionBuilder.build())
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private fun addPollBuilderQuestion(
|
|
202
|
+
type: HMSPollQuestionType,
|
|
203
|
+
item: HashMap<String, Any>,
|
|
204
|
+
pollBuilder: HMSPollBuilder.Builder,
|
|
205
|
+
) {
|
|
206
|
+
val questionBuilder = HMSPollQuestionBuilder.Builder(type)
|
|
207
|
+
|
|
208
|
+
// val answerHidden = item["answerHidden"] as? Boolean
|
|
209
|
+
// if (answerHidden != null) {
|
|
210
|
+
// questionBuilder.withAnswerHidden(answerHidden)
|
|
211
|
+
// }
|
|
212
|
+
|
|
213
|
+
val canBeSkipped = item["skippable"] as? Boolean
|
|
214
|
+
if (canBeSkipped != null) {
|
|
215
|
+
questionBuilder.withCanBeSkipped(canBeSkipped)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
val canChangeResponse = item["once"] as? Boolean
|
|
219
|
+
if (canChangeResponse != null) {
|
|
220
|
+
questionBuilder.withCanChangeResponse(!canChangeResponse)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
val duration = item["duration"] as? Int
|
|
224
|
+
if (duration != null) {
|
|
225
|
+
questionBuilder.withDuration(duration.toLong())
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
val maxLength = item["answerMaxLen"] as? Int
|
|
229
|
+
if (maxLength != null) {
|
|
230
|
+
questionBuilder.withMaxLength(maxLength.toLong())
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
val minLength = item["answerMinLen"] as? Int
|
|
234
|
+
if (minLength != null) {
|
|
235
|
+
questionBuilder.withMinLength(minLength.toLong())
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
val title = item["text"] as? String
|
|
239
|
+
if (title != null) {
|
|
240
|
+
questionBuilder.withTitle(title)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
val weight = item["weight"] as? Int
|
|
244
|
+
if (weight != null) {
|
|
245
|
+
questionBuilder.withWeight(weight)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
val options = item["options"] as? ArrayList<HashMap<String, Any>>
|
|
249
|
+
options?.let {
|
|
250
|
+
addOptions(it, questionBuilder)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
questionBuilder.build().let {
|
|
254
|
+
pollBuilder.addQuestion(it)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private fun addOptions(
|
|
259
|
+
options: ArrayList<HashMap<String, Any>>,
|
|
260
|
+
questionBuilder: HMSPollQuestionBuilder.Builder,
|
|
261
|
+
) {
|
|
262
|
+
for (i in 0 until options.size) {
|
|
263
|
+
val option = options[i]
|
|
264
|
+
|
|
265
|
+
if (option["isCorrect"] != null) {
|
|
266
|
+
val isCorrect = option["isCorrectAnswer"] as? Boolean
|
|
267
|
+
if (isCorrect != null) {
|
|
268
|
+
questionBuilder.addQuizOption(
|
|
269
|
+
option["text"] as? String ?: "",
|
|
270
|
+
isCorrect,
|
|
271
|
+
)
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
questionBuilder.addOption(option["text"] as? String ?: "")
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// endregion
|
|
280
|
+
|
|
281
|
+
// region Poll Response
|
|
282
|
+
|
|
283
|
+
fun getPollResponseBuilder(
|
|
284
|
+
response: ReadableMap,
|
|
285
|
+
poll: HmsPoll,
|
|
286
|
+
pollQuestion: HMSPollQuestion,
|
|
287
|
+
): HMSPollResponseBuilder {
|
|
288
|
+
val pollResponseBuilder = HMSPollResponseBuilder(hmsPoll = poll, userId = null)
|
|
289
|
+
|
|
290
|
+
when (pollQuestion.type) {
|
|
291
|
+
HMSPollQuestionType.longAnswer, HMSPollQuestionType.shortAnswer -> {
|
|
292
|
+
val responseText = response.getString("text")
|
|
293
|
+
if (responseText != null) {
|
|
294
|
+
if (response.hasKey("duration")) {
|
|
295
|
+
val duration = response.getInt("duration")
|
|
296
|
+
pollResponseBuilder.addResponse(pollQuestion, responseText, duration.toLong())
|
|
297
|
+
} else {
|
|
298
|
+
pollResponseBuilder.addResponse(pollQuestion, responseText)
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
HMSPollQuestionType.singleChoice -> {
|
|
303
|
+
val options = response.getArray("options")?.toArrayList() as? ArrayList<Double>
|
|
304
|
+
val pollQuestionOptions = pollQuestion.options
|
|
305
|
+
|
|
306
|
+
if (options != null && pollQuestionOptions != null && options.isNotEmpty()) {
|
|
307
|
+
pollQuestionOptions.firstOrNull()?.let { pollQuestionOption ->
|
|
308
|
+
val questionOption =
|
|
309
|
+
pollQuestionOptions.firstOrNull { pollQuestionOption ->
|
|
310
|
+
pollQuestionOption.index == options[0].toInt()
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (questionOption != null) {
|
|
314
|
+
if (response.hasKey("duration")) {
|
|
315
|
+
val duration = response.getInt("duration")
|
|
316
|
+
pollResponseBuilder.addResponse(pollQuestion, questionOption, duration.toLong())
|
|
317
|
+
} else {
|
|
318
|
+
pollResponseBuilder.addResponse(pollQuestion, questionOption)
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
HMSPollQuestionType.multiChoice -> {
|
|
325
|
+
val options = response.getArray("options")?.toArrayList() as? ArrayList<Int>
|
|
326
|
+
val pollQuestionOptions = pollQuestion.options
|
|
327
|
+
|
|
328
|
+
if (options != null && pollQuestionOptions != null) {
|
|
329
|
+
val questionOptions =
|
|
330
|
+
options.mapNotNull { optionIndex ->
|
|
331
|
+
pollQuestionOptions.firstOrNull { pollQuestionOption ->
|
|
332
|
+
pollQuestionOption.index == optionIndex
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (response.hasKey("duration")) {
|
|
337
|
+
val duration = response.getInt("duration")
|
|
338
|
+
pollResponseBuilder.addResponse(pollQuestion, questionOptions, duration.toLong())
|
|
339
|
+
} else {
|
|
340
|
+
pollResponseBuilder.addResponse(pollQuestion, questionOptions)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else -> {
|
|
345
|
+
// @unknown default case: Invalid pollQuestionType
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return pollResponseBuilder
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// endregion
|
|
352
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
package com.reactnativehmssdk
|
|
2
|
+
import android.util.Log
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
import com.facebook.react.bridge.Promise
|
|
5
|
+
import com.facebook.react.bridge.ReadableMap
|
|
6
|
+
import com.facebook.react.bridge.WritableMap
|
|
7
|
+
import com.reactnativehmssdk.Interactivity.HMSInteractivityDecoder
|
|
8
|
+
import live.hms.video.error.HMSException
|
|
9
|
+
import live.hms.video.interactivity.HmsPollUpdateListener
|
|
10
|
+
import live.hms.video.polls.models.HMSPollUpdateType
|
|
11
|
+
import live.hms.video.polls.models.HmsPoll
|
|
12
|
+
import live.hms.video.polls.models.answer.PollAnswerResponse
|
|
13
|
+
import live.hms.video.sdk.HMSActionResultListener
|
|
14
|
+
import live.hms.video.sdk.HMSSDK
|
|
15
|
+
import live.hms.video.sdk.HmsTypedActionResultListener
|
|
16
|
+
|
|
17
|
+
class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRNSDK) {
|
|
18
|
+
init {
|
|
19
|
+
// Listen for poll updates
|
|
20
|
+
this.sdk.getHmsInteractivityCenter().pollUpdateListener =
|
|
21
|
+
object : HmsPollUpdateListener {
|
|
22
|
+
override fun onPollUpdate(
|
|
23
|
+
hmsPoll: HmsPoll,
|
|
24
|
+
hmsPollUpdateType: HMSPollUpdateType,
|
|
25
|
+
) {
|
|
26
|
+
if (rnSDK.eventsEnableStatus["ON_POLL_UPDATE"] != true) {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
val data: WritableMap = Arguments.createMap()
|
|
31
|
+
|
|
32
|
+
data.putInt("update", HMSInteractivityDecoder.getPollUpdateType(hmsPollUpdateType))
|
|
33
|
+
data.putMap("updatedPoll", HMSInteractivityDecoder.getPoll(hmsPoll))
|
|
34
|
+
|
|
35
|
+
rnSDK.delegate.emitEvent("ON_POLL_UPDATE", data)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// region Create Polls
|
|
41
|
+
|
|
42
|
+
fun quickStartPoll(
|
|
43
|
+
data: ReadableMap,
|
|
44
|
+
promise: Promise?,
|
|
45
|
+
) {
|
|
46
|
+
this.sdk.getHmsInteractivityCenter().quickStartPoll(
|
|
47
|
+
HMSInteractivityHelper.getPollBuilder(data, sdk.getRoles()),
|
|
48
|
+
object : HMSActionResultListener {
|
|
49
|
+
override fun onError(error: HMSException) {
|
|
50
|
+
// Error
|
|
51
|
+
promise?.reject(error.message, error)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
override fun onSuccess() {
|
|
55
|
+
// Success
|
|
56
|
+
promise?.resolve(null)
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
|
|
64
|
+
func add(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
|
|
65
|
+
guard let pollId = data["pollId"] as? String,
|
|
66
|
+
let poll = self.hmssdk?.interactivityCenter.polls.first(where: {poll in poll.pollID == pollId}) else {
|
|
67
|
+
reject?("6004", "Unable to find HMSPoll with given pollId", nil)
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
guard let pollQuestionIndex = data["pollQuestionIndex"] as? Int,
|
|
71
|
+
let pollQuestion = poll.questions?.first(where: {question in question.index == pollQuestionIndex}) else {
|
|
72
|
+
reject?("6004", "Unable to find HMSPollQuestion in poll with given question index", nil)
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
guard let responses = data["responses"] as? NSDictionary else {
|
|
76
|
+
reject?("6004", "responses field is required", nil)
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let pollResponseBuilder = HMSInteractivityHelper.getPollResponseBuilder(responses, poll: poll, pollQuestion: pollQuestion)
|
|
81
|
+
|
|
82
|
+
self.hmssdk?.interactivityCenter.add(response: pollResponseBuilder) { pollQuestionResponseResult, error in
|
|
83
|
+
if let nonnilError = error {
|
|
84
|
+
reject?("6004", nonnilError.localizedDescription, nil)
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
if let pollQuestionResponseResult = pollQuestionResponseResult {
|
|
88
|
+
resolve?(HMSInteractivityDecoder.getHMSPollQuestionResponseResults(pollQuestionResponseResult))
|
|
89
|
+
} else {
|
|
90
|
+
resolve?(nil)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
fun addResponseOnPollQuestion(
|
|
98
|
+
data: ReadableMap,
|
|
99
|
+
promise: Promise?,
|
|
100
|
+
) {
|
|
101
|
+
val pollId = data.getString("pollId")
|
|
102
|
+
if (pollId == null) {
|
|
103
|
+
promise?.reject("6002", "pollId is required")
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
val poll = this.sdk.getHmsInteractivityCenter().polls.find { it.pollId == pollId }
|
|
107
|
+
if (poll == null) {
|
|
108
|
+
promise?.reject("6002", "No HMSPoll with pollId `$pollId`")
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
val pollQuestionIndex = data.getInt("pollQuestionIndex")
|
|
112
|
+
val pollQuestion = poll.questions?.find { it.questionID == pollQuestionIndex }
|
|
113
|
+
if (pollQuestion == null) {
|
|
114
|
+
promise?.reject("6002", "No HMSPollQuestion in poll with given question index")
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
val responses = data.getMap("responses")
|
|
118
|
+
if (responses == null) {
|
|
119
|
+
promise?.reject("6002", "responses field is required")
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
val pollResponseBuilder = HMSInteractivityHelper.getPollResponseBuilder(responses, poll, pollQuestion)
|
|
123
|
+
this.sdk.getHmsInteractivityCenter().add(
|
|
124
|
+
pollResponseBuilder,
|
|
125
|
+
object : HmsTypedActionResultListener<PollAnswerResponse> {
|
|
126
|
+
override fun onError(error: HMSException) {
|
|
127
|
+
promise?.reject(error.code.toString(), error.description)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
override fun onSuccess(result: PollAnswerResponse) {
|
|
131
|
+
promise?.resolve(HMSInteractivityDecoder.getHMSPollQuestionResponseResults(result))
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fun stop(
|
|
138
|
+
data: ReadableMap,
|
|
139
|
+
promise: Promise?,
|
|
140
|
+
) {
|
|
141
|
+
val pollId = data.getString("pollId")
|
|
142
|
+
if (pollId == null) {
|
|
143
|
+
promise?.reject("6002", "pollId is required")
|
|
144
|
+
return
|
|
145
|
+
}
|
|
146
|
+
val poll = this.sdk.getHmsInteractivityCenter().polls.find { it.pollId == pollId }
|
|
147
|
+
if (poll == null) {
|
|
148
|
+
promise?.reject("6002", "No HMSPoll with pollId `$pollId`")
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
this.sdk.getHmsInteractivityCenter().stop(
|
|
152
|
+
poll,
|
|
153
|
+
object : HMSActionResultListener {
|
|
154
|
+
override fun onError(error: HMSException) {
|
|
155
|
+
promise?.reject(error.code.toString(), error.description)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
override fun onSuccess() {
|
|
159
|
+
promise?.resolve(true)
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// endregion
|
|
166
|
+
|
|
167
|
+
// region Poll Update Listener
|
|
168
|
+
|
|
169
|
+
fun showPollStartedToast() {
|
|
170
|
+
// Show toast
|
|
171
|
+
Log.e("Interactivity", "showPollStartedToast")
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
fun loadResultsSummaryIfNeeded() {
|
|
175
|
+
// Load results summary
|
|
176
|
+
Log.e("Interactivity", "loadResultsSummaryIfNeeded")
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
fun updateResultsScreen() {
|
|
180
|
+
// Update results screen
|
|
181
|
+
Log.e("Interactivity", "updateResultsScreen")
|
|
182
|
+
}
|
|
183
|
+
// endregion
|
|
184
|
+
}
|
package/ios/HMSConstants.swift
CHANGED
|
@@ -31,4 +31,5 @@ struct HMSConstants {
|
|
|
31
31
|
static let ON_REMOTE_VIDEO_STATS = "ON_REMOTE_VIDEO_STATS"
|
|
32
32
|
static let ON_SESSION_STORE_AVAILABLE = "ON_SESSION_STORE_AVAILABLE"
|
|
33
33
|
static let ON_SESSION_STORE_CHANGED = "ON_SESSION_STORE_CHANGED"
|
|
34
|
+
static let ON_POLL_UPDATE = "ON_POLL_UPDATE"
|
|
34
35
|
}
|
package/ios/HMSDecoder.swift
CHANGED
|
@@ -448,7 +448,9 @@ class HMSDecoder: NSObject {
|
|
|
448
448
|
"rtmpStreaming": permissions.rtmpStreaming ?? false,
|
|
449
449
|
"mute": permissions.mute ?? false,
|
|
450
450
|
"unmute": permissions.unmute ?? false,
|
|
451
|
-
"changeRole": permissions.changeRole ?? false
|
|
451
|
+
"changeRole": permissions.changeRole ?? false,
|
|
452
|
+
"pollRead": permissions.pollRead ?? false,
|
|
453
|
+
"pollWrite": permissions.pollWrite ?? false
|
|
452
454
|
]
|
|
453
455
|
}
|
|
454
456
|
|