@100mslive/react-native-hms 1.9.9 → 1.9.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/android/local.properties +8 -1
  2. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +2 -0
  3. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +61 -2
  4. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +10 -3
  5. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +328 -0
  6. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityHelper.kt +352 -0
  7. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +184 -0
  8. package/ios/HMSConstants.swift +1 -0
  9. package/ios/HMSDecoder.swift +3 -1
  10. package/ios/HMSInteractivityDecoder.swift +223 -0
  11. package/ios/HMSInteractivityHelper.swift +169 -0
  12. package/ios/HMSManager.m +17 -0
  13. package/ios/HMSManager.swift +30 -1
  14. package/ios/HMSRNInteractivityCenter.swift +89 -0
  15. package/ios/HMSRNSDK.swift +10 -4
  16. package/ios/Hmssdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  17. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  18. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/jatinnagar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  19. package/ios/Hmssdk.xcodeproj/xcuserdata/jatinnagar.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  20. package/lib/commonjs/classes/HMSInteractivityCenter.js +99 -0
  21. package/lib/commonjs/classes/HMSInteractivityCenter.js.map +1 -0
  22. package/lib/commonjs/classes/HMSInteractivityEncoder.js +33 -0
  23. package/lib/commonjs/classes/HMSInteractivityEncoder.js.map +1 -0
  24. package/lib/commonjs/classes/HMSPermissions.js +4 -0
  25. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  26. package/lib/commonjs/classes/HMSPollsListenerActions.js +11 -0
  27. package/lib/commonjs/classes/HMSPollsListenerActions.js.map +1 -0
  28. package/lib/commonjs/classes/HMSSDK.js +8 -0
  29. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  30. package/lib/commonjs/classes/polls/HMSPoll.js +6 -0
  31. package/lib/commonjs/classes/polls/HMSPoll.js.map +1 -0
  32. package/lib/commonjs/classes/polls/HMSPollCategory.js +12 -0
  33. package/lib/commonjs/classes/polls/HMSPollCategory.js.map +1 -0
  34. package/lib/commonjs/classes/polls/HMSPollCreateParams.js +6 -0
  35. package/lib/commonjs/classes/polls/HMSPollCreateParams.js.map +1 -0
  36. package/lib/commonjs/classes/polls/HMSPollQuestion.js +6 -0
  37. package/lib/commonjs/classes/polls/HMSPollQuestion.js.map +1 -0
  38. package/lib/commonjs/classes/polls/HMSPollQuestionAnswer.js +2 -0
  39. package/lib/commonjs/classes/polls/HMSPollQuestionAnswer.js.map +1 -0
  40. package/lib/commonjs/classes/polls/HMSPollQuestionCreateParams.js +6 -0
  41. package/lib/commonjs/classes/polls/HMSPollQuestionCreateParams.js.map +1 -0
  42. package/lib/commonjs/classes/polls/HMSPollQuestionOption.js +2 -0
  43. package/lib/commonjs/classes/polls/HMSPollQuestionOption.js.map +1 -0
  44. package/lib/commonjs/classes/polls/HMSPollQuestionOptionCreateParams.js +6 -0
  45. package/lib/commonjs/classes/polls/HMSPollQuestionOptionCreateParams.js.map +1 -0
  46. package/lib/commonjs/classes/polls/HMSPollQuestionQuizOptionCreateParams.js +6 -0
  47. package/lib/commonjs/classes/polls/HMSPollQuestionQuizOptionCreateParams.js.map +1 -0
  48. package/lib/commonjs/classes/polls/HMSPollQuestionResponse.js +6 -0
  49. package/lib/commonjs/classes/polls/HMSPollQuestionResponse.js.map +1 -0
  50. package/lib/commonjs/classes/polls/HMSPollQuestionResponseCreateParams.js +6 -0
  51. package/lib/commonjs/classes/polls/HMSPollQuestionResponseCreateParams.js.map +1 -0
  52. package/lib/commonjs/classes/polls/HMSPollQuestionResponseResult.js +2 -0
  53. package/lib/commonjs/classes/polls/HMSPollQuestionResponseResult.js.map +1 -0
  54. package/lib/commonjs/classes/polls/HMSPollQuestionResult.js +2 -0
  55. package/lib/commonjs/classes/polls/HMSPollQuestionResult.js.map +1 -0
  56. package/lib/commonjs/classes/polls/HMSPollQuestionType.js +14 -0
  57. package/lib/commonjs/classes/polls/HMSPollQuestionType.js.map +1 -0
  58. package/lib/commonjs/classes/polls/HMSPollResponsePeerInfo.js +2 -0
  59. package/lib/commonjs/classes/polls/HMSPollResponsePeerInfo.js.map +1 -0
  60. package/lib/commonjs/classes/polls/HMSPollResult.js +6 -0
  61. package/lib/commonjs/classes/polls/HMSPollResult.js.map +1 -0
  62. package/lib/commonjs/classes/polls/HMSPollState.js +13 -0
  63. package/lib/commonjs/classes/polls/HMSPollState.js.map +1 -0
  64. package/lib/commonjs/classes/polls/HMSPollType.js +12 -0
  65. package/lib/commonjs/classes/polls/HMSPollType.js.map +1 -0
  66. package/lib/commonjs/classes/polls/HMSPollUpdateType.js +13 -0
  67. package/lib/commonjs/classes/polls/HMSPollUpdateType.js.map +1 -0
  68. package/lib/commonjs/classes/polls/HMSPollUserTrackingMode.js +13 -0
  69. package/lib/commonjs/classes/polls/HMSPollUserTrackingMode.js.map +1 -0
  70. package/lib/commonjs/hooks/polls.js +17 -0
  71. package/lib/commonjs/hooks/polls.js.map +1 -0
  72. package/lib/commonjs/index.js +56 -0
  73. package/lib/commonjs/index.js.map +1 -1
  74. package/lib/commonjs/stores/hms-interactivity-store.js +21 -0
  75. package/lib/commonjs/stores/hms-interactivity-store.js.map +1 -0
  76. package/lib/commonjs/stores/hms-polls-slice.js +19 -0
  77. package/lib/commonjs/stores/hms-polls-slice.js.map +1 -0
  78. package/lib/commonjs/stores/types.js.map +1 -1
  79. package/lib/commonjs/utils/emitter/EventEmitter.js +19 -0
  80. package/lib/commonjs/utils/emitter/EventEmitter.js.map +1 -1
  81. package/lib/module/classes/HMSInteractivityCenter.js +91 -0
  82. package/lib/module/classes/HMSInteractivityCenter.js.map +1 -0
  83. package/lib/module/classes/HMSInteractivityEncoder.js +26 -0
  84. package/lib/module/classes/HMSInteractivityEncoder.js.map +1 -0
  85. package/lib/module/classes/HMSPermissions.js +4 -0
  86. package/lib/module/classes/HMSPermissions.js.map +1 -1
  87. package/lib/module/classes/HMSPollsListenerActions.js +5 -0
  88. package/lib/module/classes/HMSPollsListenerActions.js.map +1 -0
  89. package/lib/module/classes/HMSSDK.js +8 -0
  90. package/lib/module/classes/HMSSDK.js.map +1 -1
  91. package/lib/module/classes/polls/HMSPoll.js +2 -0
  92. package/lib/module/classes/polls/HMSPoll.js.map +1 -0
  93. package/lib/module/classes/polls/HMSPollCategory.js +6 -0
  94. package/lib/module/classes/polls/HMSPollCategory.js.map +1 -0
  95. package/lib/module/classes/polls/HMSPollCreateParams.js +2 -0
  96. package/lib/module/classes/polls/HMSPollCreateParams.js.map +1 -0
  97. package/lib/module/classes/polls/HMSPollQuestion.js +2 -0
  98. package/lib/module/classes/polls/HMSPollQuestion.js.map +1 -0
  99. package/lib/module/classes/polls/HMSPollQuestionAnswer.js +2 -0
  100. package/lib/module/classes/polls/HMSPollQuestionAnswer.js.map +1 -0
  101. package/lib/module/classes/polls/HMSPollQuestionCreateParams.js +2 -0
  102. package/lib/module/classes/polls/HMSPollQuestionCreateParams.js.map +1 -0
  103. package/lib/module/classes/polls/HMSPollQuestionOption.js +2 -0
  104. package/lib/module/classes/polls/HMSPollQuestionOption.js.map +1 -0
  105. package/lib/module/classes/polls/HMSPollQuestionOptionCreateParams.js +2 -0
  106. package/lib/module/classes/polls/HMSPollQuestionOptionCreateParams.js.map +1 -0
  107. package/lib/module/classes/polls/HMSPollQuestionQuizOptionCreateParams.js +2 -0
  108. package/lib/module/classes/polls/HMSPollQuestionQuizOptionCreateParams.js.map +1 -0
  109. package/lib/module/classes/polls/HMSPollQuestionResponse.js +2 -0
  110. package/lib/module/classes/polls/HMSPollQuestionResponse.js.map +1 -0
  111. package/lib/module/classes/polls/HMSPollQuestionResponseCreateParams.js +2 -0
  112. package/lib/module/classes/polls/HMSPollQuestionResponseCreateParams.js.map +1 -0
  113. package/lib/module/classes/polls/HMSPollQuestionResponseResult.js +2 -0
  114. package/lib/module/classes/polls/HMSPollQuestionResponseResult.js.map +1 -0
  115. package/lib/module/classes/polls/HMSPollQuestionResult.js +2 -0
  116. package/lib/module/classes/polls/HMSPollQuestionResult.js.map +1 -0
  117. package/lib/module/classes/polls/HMSPollQuestionType.js +8 -0
  118. package/lib/module/classes/polls/HMSPollQuestionType.js.map +1 -0
  119. package/lib/module/classes/polls/HMSPollResponsePeerInfo.js +2 -0
  120. package/lib/module/classes/polls/HMSPollResponsePeerInfo.js.map +1 -0
  121. package/lib/module/classes/polls/HMSPollResult.js +2 -0
  122. package/lib/module/classes/polls/HMSPollResult.js.map +1 -0
  123. package/lib/module/classes/polls/HMSPollState.js +7 -0
  124. package/lib/module/classes/polls/HMSPollState.js.map +1 -0
  125. package/lib/module/classes/polls/HMSPollType.js +6 -0
  126. package/lib/module/classes/polls/HMSPollType.js.map +1 -0
  127. package/lib/module/classes/polls/HMSPollUpdateType.js +7 -0
  128. package/lib/module/classes/polls/HMSPollUpdateType.js.map +1 -0
  129. package/lib/module/classes/polls/HMSPollUserTrackingMode.js +7 -0
  130. package/lib/module/classes/polls/HMSPollUserTrackingMode.js.map +1 -0
  131. package/lib/module/hooks/polls.js +12 -0
  132. package/lib/module/hooks/polls.js.map +1 -0
  133. package/lib/module/index.js +7 -0
  134. package/lib/module/index.js.map +1 -1
  135. package/lib/module/stores/hms-interactivity-store.js +15 -0
  136. package/lib/module/stores/hms-interactivity-store.js.map +1 -0
  137. package/lib/module/stores/hms-polls-slice.js +12 -0
  138. package/lib/module/stores/hms-polls-slice.js.map +1 -0
  139. package/lib/module/stores/types.js.map +1 -1
  140. package/lib/module/utils/emitter/EventEmitter.js +19 -0
  141. package/lib/module/utils/emitter/EventEmitter.js.map +1 -1
  142. package/lib/typescript/classes/HMSInteractivityCenter.d.ts +35 -0
  143. package/lib/typescript/classes/HMSInteractivityEncoder.d.ts +4 -0
  144. package/lib/typescript/classes/HMSPermissions.d.ts +4 -0
  145. package/lib/typescript/classes/HMSPollsListenerActions.d.ts +3 -0
  146. package/lib/typescript/classes/HMSSDK.d.ts +3 -0
  147. package/lib/typescript/classes/polls/HMSPoll.d.ts +81 -0
  148. package/lib/typescript/classes/polls/HMSPollCategory.d.ts +10 -0
  149. package/lib/typescript/classes/polls/HMSPollCreateParams.d.ts +9 -0
  150. package/lib/typescript/classes/polls/HMSPollQuestion.d.ts +61 -0
  151. package/lib/typescript/classes/polls/HMSPollQuestionAnswer.d.ts +17 -0
  152. package/lib/typescript/classes/polls/HMSPollQuestionCreateParams.d.ts +25 -0
  153. package/lib/typescript/classes/polls/HMSPollQuestionOption.d.ts +21 -0
  154. package/lib/typescript/classes/polls/HMSPollQuestionOptionCreateParams.d.ts +3 -0
  155. package/lib/typescript/classes/polls/HMSPollQuestionQuizOptionCreateParams.d.ts +4 -0
  156. package/lib/typescript/classes/polls/HMSPollQuestionResponse.d.ts +47 -0
  157. package/lib/typescript/classes/polls/HMSPollQuestionResponseCreateParams.d.ts +2 -0
  158. package/lib/typescript/classes/polls/HMSPollQuestionResponseResult.d.ts +17 -0
  159. package/lib/typescript/classes/polls/HMSPollQuestionResult.d.ts +29 -0
  160. package/lib/typescript/classes/polls/HMSPollQuestionType.d.ts +18 -0
  161. package/lib/typescript/classes/polls/HMSPollResponsePeerInfo.d.ts +21 -0
  162. package/lib/typescript/classes/polls/HMSPollResult.d.ts +22 -0
  163. package/lib/typescript/classes/polls/HMSPollState.d.ts +14 -0
  164. package/lib/typescript/classes/polls/HMSPollType.d.ts +4 -0
  165. package/lib/typescript/classes/polls/HMSPollUpdateType.d.ts +5 -0
  166. package/lib/typescript/classes/polls/HMSPollUserTrackingMode.d.ts +14 -0
  167. package/lib/typescript/hooks/polls.d.ts +3 -0
  168. package/lib/typescript/index.d.ts +8 -0
  169. package/lib/typescript/stores/hms-interactivity-store.d.ts +9 -0
  170. package/lib/typescript/stores/hms-polls-slice.d.ts +5 -0
  171. package/lib/typescript/stores/types.d.ts +6 -0
  172. package/lib/typescript/utils/emitter/EventEmitter.d.ts +7 -0
  173. package/package.json +1 -1
  174. package/sdk-versions.json +2 -2
  175. package/src/classes/HMSInteractivityCenter.ts +137 -0
  176. package/src/classes/HMSInteractivityEncoder.ts +29 -0
  177. package/src/classes/HMSPermissions.ts +6 -0
  178. package/src/classes/HMSPollsListenerActions.ts +3 -0
  179. package/src/classes/HMSSDK.tsx +10 -0
  180. package/src/classes/polls/HMSPoll.ts +108 -0
  181. package/src/classes/polls/HMSPollCategory.ts +11 -0
  182. package/src/classes/polls/HMSPollCreateParams.ts +20 -0
  183. package/src/classes/polls/HMSPollQuestion.ts +92 -0
  184. package/src/classes/polls/HMSPollQuestionAnswer.ts +29 -0
  185. package/src/classes/polls/HMSPollQuestionCreateParams.ts +36 -0
  186. package/src/classes/polls/HMSPollQuestionOption.ts +24 -0
  187. package/src/classes/polls/HMSPollQuestionOptionCreateParams.ts +8 -0
  188. package/src/classes/polls/HMSPollQuestionQuizOptionCreateParams.ts +6 -0
  189. package/src/classes/polls/HMSPollQuestionResponse.ts +72 -0
  190. package/src/classes/polls/HMSPollQuestionResponseCreateParams.ts +6 -0
  191. package/src/classes/polls/HMSPollQuestionResponseResult.ts +19 -0
  192. package/src/classes/polls/HMSPollQuestionResult.ts +41 -0
  193. package/src/classes/polls/HMSPollQuestionType.ts +21 -0
  194. package/src/classes/polls/HMSPollResponsePeerInfo.ts +24 -0
  195. package/src/classes/polls/HMSPollResult.ts +26 -0
  196. package/src/classes/polls/HMSPollState.ts +16 -0
  197. package/src/classes/polls/HMSPollType.ts +4 -0
  198. package/src/classes/polls/HMSPollUpdateType.ts +5 -0
  199. package/src/classes/polls/HMSPollUserTrackingMode.ts +16 -0
  200. package/src/hooks/polls.ts +14 -0
  201. package/src/index.ts +9 -0
  202. package/src/stores/hms-interactivity-store.ts +18 -0
  203. package/src/stores/hms-polls-slice.ts +20 -0
  204. package/src/stores/types.ts +20 -3
  205. 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
+ }
@@ -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
  }
@@ -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