omikit-plugin 3.2.71 → 3.2.73

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/README.md CHANGED
@@ -591,7 +591,7 @@ startServices();
591
591
  - The `initCallWithApiKey()` function is usually used for your client, who only has a certain function, calling a fixed number. For example, you can only call your hotline number
592
592
 
593
593
  ```javascript
594
- import { initCallWithApiKey } from 'omikit-plugin';
594
+ import { initCallWithApiKey, getCurrentUser } from 'omikit-plugin';
595
595
  import messaging from '@react-native-firebase/messaging';
596
596
 
597
597
  let token: String;
@@ -617,7 +617,18 @@ const loginInfo = {
617
617
  // Initialize call functionality using the provided API key
618
618
  const result = await initCallWithApiKey(loginInfo);
619
619
 
620
- // If result is true, the user has successfully logged in.
620
+ /* NOTE: Please check the user information again, if the object is not empty then you have successfully logged in.
621
+ Otherwise, if you have not successfully logged in, you should not navigate to the call screen. When startCall with empty information, it may crash your application or not be clear when receiving the startCall error ❌❌*/
622
+
623
+ // Example:
624
+
625
+ if (result){
626
+ const infoUser = await getCurrentUser()
627
+ if (infoUser != null && Object.keys(infoUser).length > 0) {
628
+ // ✅ Login OMI Success
629
+ // Can navigate to call screen or start call 🚀 🚀
630
+ }
631
+ }
621
632
  ```
622
633
 
623
634
  📌 **initCallWithUserPassword()**
@@ -628,7 +639,7 @@ const result = await initCallWithApiKey(loginInfo);
628
639
  - The `initCallWithUserPassword()` function is for employees. They can call any telecommunications number allowed in your business on the OMI system.
629
640
 
630
641
  ```javascript
631
- import { initCallWithUserPassword } from 'omikit-plugin';
642
+ import { initCallWithUserPassword, getCurrentUser } from 'omikit-plugin';
632
643
  import messaging from '@react-native-firebase/messaging';
633
644
 
634
645
  let token: String;
@@ -652,7 +663,20 @@ const loginInfo = {
652
663
 
653
664
  // Initialize call functionality using username and password authentication
654
665
  const result = await initCallWithUserPassword(loginInfo);
655
- // If result is true, the user has successfully logged in.
666
+
667
+
668
+ /* ❌ ❌ NOTE: Please check the user information again, if the object is not empty then you have successfully logged in.
669
+ Otherwise, if you have not successfully logged in, you should not navigate to the call screen. When startCall with empty information, it may crash your application or not be clear when receiving the startCall error ❌❌*/
670
+
671
+ // Example:
672
+
673
+ if (result){
674
+ const infoUser = await getCurrentUser()
675
+ if (infoUser != null && Object.keys(infoUser).length > 0) {
676
+ // ✅ Login OMI Success
677
+ // Can navigate to call screen or start call 🚀 🚀
678
+ }
679
+ }
656
680
  ```
657
681
 
658
682
  📌 **configPushNotification()**
@@ -1062,6 +1086,20 @@ const result = await startCallWithUuid({
1062
1086
  ### 🚀🚀 Events listener 🚀🚀
1063
1087
 
1064
1088
  ```javascript
1089
+ import { omiEmitter } from 'omikit-plugin';
1090
+
1091
+ /*
1092
+ ❌ ❌ With TypeScript, in android, it seems our omiEmitter is not working properly. Please use the following manual declaration, to ensure performance
1093
+ */
1094
+
1095
+ // 📌 For TypeScript, Android
1096
+ import { NativeEventEmitter, NativeModules } from "react-native";
1097
+ const { OmikitPlugin } = NativeModules;
1098
+ const omiEmitter = new NativeEventEmitter(OmikitPlugin);
1099
+
1100
+
1101
+
1102
+
1065
1103
  useEffect(() => {
1066
1104
  omiEmitter.addListener(OmiCallEvent.onCallStateChanged, onCallStateChanged);
1067
1105
  omiEmitter.addListener(OmiCallEvent.onMuted, onMuted);
@@ -1151,6 +1189,7 @@ const onCallStateChanged = (data: any) => {
1151
1189
  - time_end, timeEnd: number (Timestamp when the call ended)
1152
1190
  - time_start_to_answer, timeStartToAnswer: number (Time taken to answer the call)
1153
1191
  - transaction_id, transactionId: string (OMI Call unique ID)
1192
+ - typeNumber: string ("", "internal", "phone", "zalo")
1154
1193
  */
1155
1194
  };
1156
1195
 
@@ -120,7 +120,7 @@ dependencies {
120
120
  // use for OMISDK
121
121
  implementation("androidx.work:work-runtime:2.8.1")
122
122
  implementation "androidx.security:security-crypto:1.1.0-alpha06"
123
- api 'vn.vihat.omicall:omi-sdk:2.3.20'
123
+ api 'vn.vihat.omicall:omi-sdk:2.3.22'
124
124
 
125
125
  implementation "com.facebook.react:react-native:+" // From node_modules
126
126
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
@@ -4,4 +4,4 @@ OmikitPlugin_targetSdkVersion=33
4
4
  OmikitPlugin_compileSdkVersion=33
5
5
  OmikitPlugin_ndkversion=21.4.7075529
6
6
  OMI_USER=omicall
7
- OMI_TOKEN=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
7
+ OMI_TOKEN=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
@@ -24,6 +24,7 @@ import kotlinx.coroutines.CoroutineScope
24
24
  import kotlinx.coroutines.Dispatchers
25
25
  import kotlinx.coroutines.launch
26
26
  import kotlinx.coroutines.withContext
27
+ import kotlinx.coroutines.delay
27
28
  import vn.vihat.omicall.omisdk.OmiAccountListener
28
29
  import vn.vihat.omicall.omisdk.OmiClient
29
30
  import vn.vihat.omicall.omisdk.OmiListener
@@ -38,85 +39,105 @@ import vn.vihat.omicall.omisdk.utils.Utils
38
39
  class OmikitPluginModule(reactContext: ReactApplicationContext?) :
39
40
  ReactContextBaseJavaModule(reactContext), ActivityEventListener, OmiListener {
40
41
  private val mainScope = CoroutineScope(Dispatchers.Main)
41
- private var isIncomming: Boolean = false
42
+ private var isIncoming: Boolean = false
42
43
  private var isAnserCall: Boolean = false
43
44
 
44
45
  override fun getName(): String {
45
46
  return NAME
46
47
  }
47
48
 
49
+
50
+ private val handler = Handler(Looper.getMainLooper())
51
+
48
52
  override fun incomingReceived(callerId: Int?, phoneNumber: String?, isVideo: Boolean?) {
49
- isIncomming = true;
53
+ isIncoming = true;
50
54
  Log.d("OMISDK", "=>> START INCOMING CALL REVICED => ")
51
- val map: WritableMap = WritableNativeMap()
52
- map.putBoolean("isVideo", isVideo ?: true)
53
- map.putBoolean("incoming", isIncomming)
54
- map.putString("callerNumber", phoneNumber)
55
- map.putString("_id", "")
56
- map.putInt("status", CallState.incoming.value)
55
+
56
+ val typeNumber = OmiKitUtils().checkTypeNumber(phoneNumber ?: "")
57
+
58
+ val map: WritableMap = WritableNativeMap().apply {
59
+ putBoolean("isVideo", isVideo ?: true)
60
+ putBoolean("incoming", isIncoming)
61
+ putString("callerNumber", phoneNumber ?: "")
62
+ putString("_id", "")
63
+ putInt("status", CallState.incoming.value)
64
+ putString("typeNumber", typeNumber)
65
+ }
66
+
57
67
  sendEvent(CALL_STATE_CHANGED, map)
58
68
  }
59
69
 
60
70
  override fun onCallEstablished(
61
- callerId: Int,
62
- phoneNumber: String?,
63
- isVideo: Boolean?,
64
- startTime: Long,
65
- transactionId: String?,
71
+ callerId: Int,
72
+ phoneNumber: String?,
73
+ isVideo: Boolean?,
74
+ startTime: Long,
75
+ transactionId: String?,
66
76
  ) {
67
- isAnserCall = true
68
- Log.d("OMISDK", "=>> ON CALL ESTABLISHED => ")
69
- Handler(Looper.getMainLooper()).postDelayed({
70
- Log.d("OmikitReactNative", "onCallEstablished")
71
- val map: WritableMap = WritableNativeMap()
72
- map.putString("callerNumber", phoneNumber)
73
- map.putBoolean("isVideo", isVideo ?: true)
74
- map.putBoolean("incoming", isIncomming)
75
- map.putString("transactionId", transactionId)
76
- map.putInt("status", CallState.confirmed.value)
77
- sendEvent(CALL_STATE_CHANGED, map)
78
- }, 200)
77
+ isAnserCall = true
78
+ Log.d("OMISDK", "=>> ON CALL ESTABLISHED => ")
79
+
80
+ Handler(Looper.getMainLooper()).postDelayed({
81
+ Log.d("OmikitReactNative", "onCallEstablished")
82
+
83
+ val typeNumber = OmiKitUtils().checkTypeNumber(phoneNumber ?: "")
84
+
85
+ val map: WritableMap = WritableNativeMap().apply {
86
+ putString("callerNumber", phoneNumber ?: "")
87
+ putBoolean("isVideo", isVideo ?: true)
88
+ putBoolean("incoming", isIncoming) // 🔹 Kiểm tra lỗi chính tả biến này
89
+ putString("transactionId", transactionId ?: "")
90
+ putInt("status", CallState.confirmed.value)
91
+ putString("typeNumber", typeNumber)
92
+ }
93
+
94
+ sendEvent(CALL_STATE_CHANGED, map)
95
+ }, 200)
79
96
  }
80
97
 
81
98
  override fun onCallEnd(callInfo: MutableMap<String, Any?>, statusCode: Int) {
82
- Log.d("OMISDK RN", "=>> onCallEnd 0000 => $callInfo")
83
- val call = callInfo as Map<*, *>
84
- val map: WritableMap = WritableNativeMap()
85
- val timeStartToAnswer = call["time_start_to_answer"] as Long?
86
- val timeEnd = call["time_end"] as Long
87
- map.putString("direction", call["direction"] as String)
88
- map.putString("transaction_id", call["transaction_id"] as String?)
89
- map.putString("source_number", call["source_number"] as String)
90
- map.putString("destination_number", call["destination_number"] as String)
91
- map.putDouble("time_start_to_answer", (timeStartToAnswer ?: 0).toDouble())
92
- map.putDouble("time_end", timeEnd.toDouble())
93
- map.putString("sip_user", call["sip_user"] as String)
94
- map.putInt("code_end_call", statusCode as Int)
95
- map.putString("disposition", call["disposition"] as String)
96
- map.putInt("status", CallState.disconnected.value)
97
-
98
- map.putString("transactionId", call["transaction_id"] as String?)
99
- map.putString("sourceNumber", call["source_number"] as String)
100
- map.putString("destinationNumber", call["destination_number"] as String)
101
- map.putDouble("timeStartToAnswer", (timeStartToAnswer ?: 0).toDouble())
102
- map.putDouble("timeEnd", timeEnd.toDouble())
103
- map.putString("sipUser", call["sip_user"] as String)
104
- map.putInt("codeEndCall", statusCode as Int)
105
-
106
- Log.d("OMISDK RN", "=>> onCallEnd => $map")
107
- sendEvent(CALL_STATE_CHANGED, map)
99
+ Log.d("OMISDK RN", "=>> onCallEnd 0000 => $callInfo")
100
+
101
+ // Kiểm tra kiểu dữ liệu trước khi ép kiểu để tránh lỗi
102
+ val call = callInfo ?: mutableMapOf()
103
+
104
+ val timeStartToAnswer = (call["time_start_to_answer"] as? Long) ?: 0L
105
+ val timeEnd = (call["time_end"] as? Long) ?: 0L
106
+ val phoneNumber = (call["destination_number"] as? String) ?: (call["source_number"] as? String) ?: ""
107
+ val typeNumber = OmiKitUtils().checkTypeNumber(phoneNumber)
108
+
109
+ val map: WritableMap = WritableNativeMap().apply {
110
+ putString("direction", call["direction"] as? String ?: "")
111
+ putString("transactionId", call["transaction_id"] as? String ?: "")
112
+ putString("sourceNumber", call["source_number"] as? String ?: "")
113
+ putString("destinationNumber", call["destination_number"] as? String ?: "")
114
+ putDouble("timeStartToAnswer", timeStartToAnswer.toDouble())
115
+ putDouble("timeEnd", timeEnd.toDouble())
116
+ putString("sipUser", call["sip_user"] as? String ?: "")
117
+ putInt("codeEndCall", statusCode)
118
+ putString("disposition", call["disposition"] as? String ?: "")
119
+ putInt("status", CallState.disconnected.value)
120
+ putString("typeNumber", typeNumber)
121
+ }
122
+
123
+ Log.d("OMISDK RN", "=>> onCallEnd => $map")
124
+ sendEvent(CALL_STATE_CHANGED, map)
108
125
  }
109
126
 
110
127
  override fun onConnecting() {
111
- Log.d("OMISDK", "=>> ON CONNECTING CALL => ")
112
- val map: WritableMap = WritableNativeMap()
113
- map.putString("callerNumber", "")
114
- map.putBoolean("isVideo", NotificationService.isVideo)
115
- map.putBoolean("incoming", isIncomming)
116
- map.putString("transactionId", "")
117
- map.putString("_id", "")
118
- map.putInt("status", CallState.connecting.value)
119
- sendEvent(CALL_STATE_CHANGED, map)
128
+ Log.d("OMISDK", "=>> ON CONNECTING CALL => ")
129
+
130
+ val map: WritableMap = WritableNativeMap().apply {
131
+ putString("callerNumber", "")
132
+ putBoolean("isVideo", NotificationService.isVideo)
133
+ putBoolean("incoming", isIncoming ?: false)
134
+ putString("transactionId", "")
135
+ putString("_id", "")
136
+ putInt("status", CallState.connecting.value)
137
+ putString("typeNumber", "")
138
+ }
139
+
140
+ sendEvent(CALL_STATE_CHANGED, map)
120
141
  }
121
142
 
122
143
  override fun onDescriptionError() {
@@ -126,25 +147,21 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
126
147
  }
127
148
 
128
149
  override fun onRinging(callerId: Int, transactionId: String?) {
129
- var callDirection = OmiClient.callDirection
130
- val map: WritableMap = WritableNativeMap()
150
+ val callDirection = OmiClient.callDirection
151
+ val prePhoneNumber = OmiClient.prePhoneNumber ?: ""
152
+ val typeNumber = OmiKitUtils().checkTypeNumber(prePhoneNumber)
153
+
154
+ val map: WritableMap = WritableNativeMap().apply {
155
+ putString("callerNumber", if (callDirection == "inbound") prePhoneNumber else "")
156
+ putBoolean("isVideo", NotificationService.isVideo)
157
+ putString("transactionId", transactionId ?: "")
158
+ putInt("status", if (callDirection == "inbound") CallState.incoming.value else CallState.early.value)
159
+ putBoolean("incoming", callDirection == "inbound")
160
+ putString("typeNumber", typeNumber)
161
+ }
131
162
 
132
- if (callDirection == "inbound") {
133
- Log.d("OMISDK", "=>> ON IN COMMING CALL => ")
134
- map.putString("callerNumber", OmiClient.prePhoneNumber)
135
- map.putBoolean("isVideo", NotificationService.isVideo)
136
- map.putBoolean("incoming", true)
137
- map.putString("transactionId", transactionId ?: "")
138
- map.putInt("status", CallState.incoming.value)
139
- } else {
140
- map.putString("callerNumber", "")
141
- map.putBoolean("isVideo", NotificationService.isVideo)
142
- map.putString("transactionId", transactionId ?: "")
143
- map.putInt("status", CallState.early.value)
144
- map.putBoolean("incoming", false)
145
- Log.d("OMISDK", "=>> ON RINGING CALL => ")
146
- }
147
- sendEvent(CALL_STATE_CHANGED, map)
163
+ Log.d("OMISDK", if (callDirection == "inbound") "=>> ON INCOMING CALL => " else "=>> ON RINGING CALL => ")
164
+ sendEvent(CALL_STATE_CHANGED, map)
148
165
  }
149
166
 
150
167
 
@@ -175,15 +192,21 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
175
192
  }
176
193
 
177
194
  override fun onOutgoingStarted(callerId: Int, phoneNumber: String?, isVideo: Boolean?) {
178
- Log.d("OMISDK", "=>> ON OUT GOING STARTED CALL => ")
179
- val map: WritableMap = WritableNativeMap()
180
- map.putString("callerNumber", "")
181
- map.putBoolean("isVideo", NotificationService.isVideo)
182
- map.putString("transactionId", "")
183
- map.putInt("status", CallState.calling.value)
184
- map.putString("_id", "")
185
- map.putBoolean("incoming", isIncomming)
186
- sendEvent(CALL_STATE_CHANGED, map)
195
+ Log.d("OMISDK", "=>> ON OUTGOING STARTED CALL => ")
196
+
197
+ val typeNumber = OmiKitUtils().checkTypeNumber(phoneNumber ?: "")
198
+
199
+ val map: WritableMap = WritableNativeMap().apply {
200
+ putString("callerNumber", phoneNumber ?: "")
201
+ putBoolean("isVideo", NotificationService.isVideo)
202
+ putString("transactionId", "")
203
+ putInt("status", CallState.calling.value)
204
+ putString("_id", "")
205
+ putBoolean("incoming", isIncoming) // 🔹 Kiểm tra lỗi chính tả của biến này
206
+ putString("typeNumber", typeNumber)
207
+ }
208
+
209
+ sendEvent(CALL_STATE_CHANGED, map)
187
210
  }
188
211
 
189
212
  override fun onSwitchBoardAnswer(sip: String) {
@@ -196,14 +219,18 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
196
219
  Log.d("OMISDK", "=> ON REGISTER COMPLETED => status code: $statusCode")
197
220
 
198
221
  if (statusCode != 200) {
222
+ val normalizedStatusCode = if (statusCode == 403) 853 else statusCode
223
+ val typeNumber = ""
224
+
199
225
  val mapObject = WritableNativeMap().apply {
200
- putBoolean("isVideo", false)
201
- putBoolean("incoming", true)
202
- putString("callerNumber", "")
203
- putString("_id", "")
204
- putInt("status", 6)
205
- putInt("code_end_call", if (statusCode == 403) 853 else statusCode)
206
- putInt("codeEndCall", if (statusCode == 403) 853 else statusCode)
226
+ putBoolean("isVideo", false)
227
+ putBoolean("incoming", true)
228
+ putString("callerNumber", "")
229
+ putString("_id", "")
230
+ putInt("status", 6)
231
+ putInt("code_end_call", normalizedStatusCode)
232
+ putInt("codeEndCall", normalizedStatusCode)
233
+ putString("typeNumber", typeNumber)
207
234
  }
208
235
  sendEvent(CALL_STATE_CHANGED, mapObject)
209
236
  }
@@ -405,51 +432,68 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
405
432
  }
406
433
 
407
434
  @ReactMethod
408
- fun getInitialCall(counter: Int = 4, promise: Promise) {
409
- currentActivity?.runOnUiThread {
410
- if (reactApplicationContext != null) {
411
- val call = Utils.getActiveCall(reactApplicationContext!!)
412
- Log.d("getInitialCall RN", "getInitialCall abc $call")
413
- if (call == null) {
435
+ fun getInitialCall(counter: Int = 1, promise: Promise) {
436
+ val context = reactApplicationContext ?: run {
437
+ Log.e("getInitialCall", "❌ React context is null")
438
+ promise.resolve(false)
439
+ return
440
+ }
441
+
442
+ val call = Utils.getActiveCall(context)
443
+ Log.d("getInitialCall RN", "📞 Active call: $call")
444
+
445
+ if (call == null) {
414
446
  if (counter <= 0) {
415
- promise.resolve(false);
447
+ promise.resolve(false)
416
448
  } else {
417
- thread {
418
- Thread.sleep(5000) // Chờ 5 giây
419
- getInitialCall(counter - 1, promise); // Gọi lại hàm đệ quy
420
- }
421
- }
422
- } else {
423
- val phoneNumberTemp: String = call.remoteNumber as String
424
- if (phoneNumberTemp.isNotEmpty()) {
425
- val map: WritableMap = WritableNativeMap()
426
- map.putString("callerNumber", phoneNumberTemp)
427
- val statusPendingCall = OmiKitUtils().getStatusPendingCall(reactApplicationContext)
428
- if (call.state == 3) {
429
- if (statusPendingCall != 0) {
430
- call.state = statusPendingCall
449
+ mainScope.launch {
450
+ Log.d("getInitialCall RN", "🔄 Retrying in 2s... (Attempts left: $counter)")
451
+ delay(1000) // Chờ 2 giây
452
+ getInitialCall(counter - 1, promise) // Gọi lại hàm đệ quy
431
453
  }
432
- }
433
- map.putBoolean("incoming", call.direction == "inbound")
434
- map.putInt("_id", call.id)
435
- map.putInt("status", call.state)
436
- map.putBoolean("muted", false)
437
- map.putBoolean("isVideo", call.isVideo ?: false)
438
- promise.resolve(map)
439
- if (statusPendingCall == 2 && call.state != 5) {
440
- Log.d("getInitialCall RN", "incomingReceive $statusPendingCall")
441
- val map2: WritableMap = WritableNativeMap()
442
- map2.putBoolean("isVideo", call.isVideo ?: false)
443
- map2.putBoolean("incoming", true)
444
- map2.putString("callerNumber", phoneNumberTemp)
445
- map2.putString("_id", "")
446
- map2.putInt("status", 2)
447
- sendEvent(CALL_STATE_CHANGED, map2)
448
- }
449
454
  }
450
- }
455
+ return
456
+ }
457
+
458
+ val phoneNumber = call.remoteNumber as? String ?: ""
459
+ if (phoneNumber.isEmpty()) {
460
+ promise.resolve(false)
461
+ return
462
+ }
463
+
464
+ val typeNumber = OmiKitUtils().checkTypeNumber(phoneNumber ?: "")
465
+
466
+ val map: WritableMap = WritableNativeMap().apply {
467
+ putString("callerNumber", phoneNumber)
468
+ putBoolean("incoming", call.direction == "inbound")
469
+ putInt("_id", call.id)
470
+ putInt("status", call.state)
471
+ putBoolean("muted", false)
472
+ putBoolean("isVideo", call.isVideo ?: false)
473
+ putString("typeNumber", typeNumber)
474
+ }
475
+
476
+ val statusPendingCall = OmiKitUtils().getStatusPendingCall(context)
477
+ if (call.state == 3 && statusPendingCall != 0) {
478
+ call.state = statusPendingCall
479
+ }
480
+
481
+ promise.resolve(map)
482
+
483
+ if (statusPendingCall == 2 && call.state != 5) {
484
+ Log.d("getInitialCall RN", "🚀 Incoming Receive Triggered ($statusPendingCall)")
485
+
486
+
487
+ val eventMap: WritableMap = WritableNativeMap().apply {
488
+ putBoolean("isVideo", call.isVideo ?: false)
489
+ putBoolean("incoming", true)
490
+ putString("callerNumber", phoneNumber)
491
+ putString("_id", "")
492
+ putInt("status", 2)
493
+ putString("typeNumber", typeNumber)
494
+ }
495
+ sendEvent(CALL_STATE_CHANGED, eventMap)
451
496
  }
452
- }
453
497
  }
454
498
 
455
499
 
@@ -540,7 +584,7 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
540
584
 
541
585
  @ReactMethod
542
586
  fun endCall(promise: Promise) {
543
- if (isIncomming && !isAnserCall) {
587
+ if (isIncoming && !isAnserCall) {
544
588
  OmiClient.getInstance(reactApplicationContext!!).decline()
545
589
  } else {
546
590
  OmiClient.getInstance(reactApplicationContext!!).hangUp()
@@ -551,7 +595,7 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
551
595
 
552
596
  @ReactMethod
553
597
  fun rejectCall(promise: Promise) {
554
- if (isIncomming && !isAnserCall) {
598
+ if (isIncoming && !isAnserCall) {
555
599
  OmiClient.getInstance(reactApplicationContext!!).decline()
556
600
  }
557
601
  promise.resolve(true)
@@ -842,18 +886,19 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
842
886
  }
843
887
  }
844
888
 
845
- fun sendEvent(eventName: String?, params: Any?) {
846
- if (eventName == null) {
847
- Log.e("OmikitPlugin", "eventName is null. Event cannot be emitted.")
848
- return
849
- }
850
- if (currentActivity != null) {
851
- currentActivity!!.runOnUiThread {
852
- reactApplicationContext.getJSModule(RCTNativeAppEventEmitter::class.java)
853
- .emit(eventName, params)
889
+ fun sendEvent(eventName: String?, params: Any?) {
890
+ if (eventName == null) {
891
+ Log.e("OmikitPlugin", "eventName is null or empty. Không thể gửi event.")
892
+ return
893
+ }
894
+ if (currentActivity != null) {
895
+ currentActivity!!.runOnUiThread {
896
+ reactApplicationContext.getJSModule(RCTNativeAppEventEmitter::class.java)
897
+ .emit(eventName, params)
898
+ Log.d("OmikitPlugin", "✅ Event $eventName đã được gửi thành công!")
899
+ }
854
900
  }
855
901
  }
856
- }
857
902
 
858
903
  private fun requestPermission(isVideo: Boolean) {
859
904
  var permissions = arrayOf(
@@ -38,4 +38,15 @@ class OmiKitUtils {
38
38
  clearStatusPendingCall(context)
39
39
  return status
40
40
  }
41
+
42
+ fun checkTypeNumber(phoneNumber: String?): String {
43
+ if (phoneNumber.isNullOrBlank()) return "" //
44
+
45
+ return when {
46
+ phoneNumber.length < 8 -> "internal"
47
+ phoneNumber.any { it.isLetter() } && phoneNumber.any { it.isDigit() } -> "zalo"
48
+ else -> "phone"
49
+ }
50
+ }
51
+
41
52
  }
@@ -41,7 +41,7 @@ class CallManager {
41
41
  func transferCall(_ phoneNumber: String)-> Bool {
42
42
  var result = false;
43
43
  do {
44
- if let callInfo = self.omiLib.getCurrentConfirmCall() {
44
+ if let callInfo = omiLib.getCurrentConfirmCall() {
45
45
  if callInfo.callState != .disconnected {
46
46
  callInfo.blindTransferCall(withNumber: phoneNumber);
47
47
  result = true
@@ -58,7 +58,7 @@ class CallManager {
58
58
  do {
59
59
  if let callInfo = omiLib.getCurrentCall() {
60
60
  if callInfo.callState != .disconnected {
61
- self.omiLib.callManager.end(callInfo) { error in
61
+ omiLib.callManager.end(callInfo) { error in
62
62
  if error != nil {
63
63
  }
64
64
  }
@@ -93,42 +93,6 @@ class CallManager {
93
93
  }
94
94
  }
95
95
 
96
- func convertDictionaryToJson(dictionary: [String: Any]) -> String? {
97
- do {
98
- let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: [])
99
- if let jsonString = String(data: jsonData, encoding: .utf8) {
100
- return jsonString
101
- }
102
- } catch {
103
- print("Error converting dictionary to JSON: \(error.localizedDescription)")
104
- }
105
- return nil
106
- }
107
-
108
- private func messageCall(type: Int) -> String {
109
- switch(type){
110
- case 0:
111
- return "INVALID_UUID"
112
- case 1:
113
- return "INVALID_PHONE_NUMBER"
114
- case 2:
115
- return "SAME_PHONE_NUMBER_WITH_PHONE_REGISTER"
116
- case 3:
117
- return "MAX_RETRY"
118
- case 4:
119
- return "PERMISSION_DENIED"
120
- case 5:
121
- return "COULD_NOT_FIND_END_POINT"
122
- case 6:
123
- return "REGISTER_ACCOUNT_FAIL"
124
- case 7:
125
- return "START_CALL_FAIL"
126
- case 9:
127
- return "HAVE_ANOTHER_CALL"
128
- default:
129
- return "START_CALL_SUCCESS"
130
- }
131
- }
132
96
 
133
97
  private func requestPermission(isVideo: Bool) {
134
98
  AVCaptureDevice.requestAccess(for: .audio) { _ in
@@ -160,18 +124,45 @@ class CallManager {
160
124
 
161
125
 
162
126
  func initWithUserPasswordEndpoint(params: [String: Any]) -> Bool {
163
- var result = false
164
- if let userName = params["userName"] as? String, let password = params["password"] as? String, let realm = params["realm"] as? String, let token = params["fcmToken"] as? String {
165
- if let projectID = params["projectId"] as? String, !projectID.isEmpty {
166
- OmiClient.setFcmProjectId(projectID)
127
+ // Kiểm tra thông tin đầu vào
128
+ guard let userName = params["userName"] as? String,
129
+ let password = params["password"] as? String,
130
+ let realm = params["realm"] as? String,
131
+ let token = params["fcmToken"] as? String else {
132
+ print("🚨 Lỗi: Thiếu thông tin đăng nhập!")
133
+ return false
134
+ }
135
+
136
+
137
+ // Nếu `projectId` có giá trị, thiết lập Project ID cho FCM
138
+ if let projectID = params["projectId"] as? String, !projectID.isEmpty {
139
+ OmiClient.setFcmProjectId(projectID)
167
140
  }
168
- OmiClient.initWithUsername(userName, password: password, realm: realm, proxy: "")
141
+
142
+ // Thử khởi tạo OmiClient với username & password
143
+ do {
144
+ try OmiClient.initWithUsername(userName, password: password, realm: realm, proxy: "")
145
+ } catch {
146
+ print("🚨 Lỗi khởi tạo OmiClient: \(error.localizedDescription)")
147
+ return false
148
+ }
149
+
150
+ // Thiết lập FCM Token cho user
169
151
  OmiClient.setUserPushNotificationToken(token)
170
- result = true
171
- }
172
- let isVideo = (params["isVideo"] as? Bool) ?? true
173
- requestPermission(isVideo: isVideo)
174
- return result
152
+
153
+ // Đảm bảo requestPermission chạy trên main thread
154
+ let isVideo = (params["isVideo"] as? Bool) ?? false
155
+ if isVideo {
156
+ DispatchQueue.main.async { [weak self] in
157
+ guard let strongSelf = self else {
158
+ print("⚠️ Không thể gọi requestPermission vì self đã bị giải phóng!")
159
+ return
160
+ }
161
+ strongSelf.requestPermission(isVideo: isVideo)
162
+ }
163
+ }
164
+
165
+ return true
175
166
  }
176
167
 
177
168
  func showMissedCall() {
@@ -232,7 +223,7 @@ class CallManager {
232
223
  }
233
224
 
234
225
  func registerVideoEvent() {
235
- DispatchQueue.main.async {
226
+ DispatchQueue.main.async {
236
227
  NotificationCenter.default.addObserver(CallManager.instance!,
237
228
  selector: #selector(self.videoUpdate(_:)),
238
229
  name: NSNotification.Name.OMICallVideoInfo,
@@ -268,7 +259,7 @@ class CallManager {
268
259
 
269
260
  @objc func videoUpdate(_ notification: NSNotification) {
270
261
  guard let userInfo = notification.userInfo,
271
- let state = userInfo[OMIVideoInfoState] as? Int else {
262
+ let state = userInfo[OMIVideoInfoState] as? Int else {
272
263
  return;
273
264
  }
274
265
  switch (state) {
@@ -310,7 +301,8 @@ class CallManager {
310
301
  "callerNumber": "",
311
302
  "isVideo": false,
312
303
  "transactionId": "",
313
- "_id": ""
304
+ "_id": "",
305
+ "typeNumber": ""
314
306
  ]
315
307
 
316
308
  if(call != nil){
@@ -322,6 +314,7 @@ class CallManager {
322
314
  dataToSend["callerNumber"] = call.callerNumber
323
315
  dataToSend["isVideo"] = call.isVideo
324
316
  dataToSend["transactionId"] = call.omiId
317
+ dataToSend["typeNumber"] = OmiUtils.checkTypeNumber(phoneNumber: call.callerNumber ?? "")
325
318
  }
326
319
 
327
320
  if (callState != OMICallState.disconnected.rawValue) {
@@ -392,49 +385,59 @@ class CallManager {
392
385
 
393
386
  /// Start call
394
387
  func startCall(_ phoneNumber: String, isVideo: Bool, completion: @escaping (_ : String) -> Void) {
395
- let secondsSinceCurrentTime = lastTimeCall.timeIntervalSinceNow
396
- guestPhone = phoneNumber
397
- OmiClient.startCall(phoneNumber, isVideo: isVideo) { status in
398
- DispatchQueue.main.async {
399
- let callCurrent = self.omiLib.getCurrentCall()
400
- var dataToSend: [String: Any] = [
401
- "status": status.rawValue,
402
- "_id": "",
403
- "message": self.messageCall(type: status.rawValue)
404
- ]
405
-
406
- if(callCurrent != nil){
407
- dataToSend["_id"] = String(describing: OmiCallModel(omiCall: callCurrent!).uuid)
408
- }
409
-
410
- if let jsonString = self.convertDictionaryToJson(dictionary: dataToSend) {
411
- completion(jsonString)
412
- } else {
413
- completion("Conversion to JSON failed")
414
- }
415
- return
388
+ let secondsSinceCurrentTime = lastTimeCall.timeIntervalSinceNow
389
+ guestPhone = phoneNumber
390
+ var completionCalled = false // 🔥 Biến kiểm soát callback đã gọi chưa
391
+
392
+ OmiClient.startCall(phoneNumber, isVideo: isVideo) { status in
393
+ DispatchQueue.main.async {
394
+ guard let callCurrent = self.omiLib.getCurrentCall() else {
395
+ if !completionCalled {
396
+ completion("{\"status\": \"6\", \"message\": \"REGISTER_ACCOUNT_FAIL\"}")
397
+ completionCalled = true
398
+ }
399
+ return
400
+ }
401
+
402
+ let dataToSend: [String: Any] = [
403
+ "status": status.rawValue,
404
+ "_id": String(describing: OmiCallModel(omiCall: callCurrent).uuid),
405
+ "message": OmiUtils.messageCall(type: status.rawValue)
406
+ ]
407
+
408
+ if let jsonString = OmiUtils.convertDictionaryToJson(dictionary: dataToSend) {
409
+ if !completionCalled {
410
+ completion(jsonString)
411
+ completionCalled = true
412
+ }
413
+ } else {
414
+ if !completionCalled {
415
+ completion("{\"status\": \"error\", \"message\": \"JSON conversion failed\"}")
416
+ completionCalled = true
417
+ }
418
+ }
419
+ }
416
420
  }
417
- }
418
421
  }
419
422
 
423
+
420
424
  /// Start call
421
425
  func startCallWithUuid(_ uuid: String, isVideo: Bool, completion: @escaping (_ : String) -> Void) {
422
426
  let phoneNumber = OmiClient.getPhone(uuid)
423
427
  if let phone = phoneNumber {
424
428
  guestPhone = phoneNumber ?? ""
425
- DispatchQueue.main.async {
426
- OmiClient.startCall(phone, isVideo: isVideo) { statusCall in
429
+ OmiClient.startCall(phone, isVideo: isVideo) { statusCall in
427
430
  let callCurrent = self.omiLib.getCurrentCall()
428
431
  // completion(status.rawValue)
429
432
  var dataToSend: [String: Any] = [
430
433
  "status": statusCall.rawValue,
431
434
  "_id": "",
432
- "message": self.messageCall(type: statusCall.rawValue)
435
+ "message": OmiUtils.messageCall(type: statusCall.rawValue)
433
436
  ]
434
437
  if(callCurrent != nil){
435
438
  dataToSend["_id"] = String(describing: OmiCallModel(omiCall: callCurrent!).uuid)
436
439
  }
437
- if let jsonString = self.convertDictionaryToJson(dictionary: dataToSend) {
440
+ if let jsonString = OmiUtils.convertDictionaryToJson(dictionary: dataToSend) {
438
441
  completion(jsonString)
439
442
  } else {
440
443
  completion("Conversion to JSON failed")
@@ -442,7 +445,7 @@ class CallManager {
442
445
  return
443
446
 
444
447
  }
445
- }
448
+
446
449
  return
447
450
  }
448
451
  }
@@ -503,8 +506,8 @@ class CallManager {
503
506
 
504
507
  /// Toogle speaker
505
508
  func toogleSpeaker() {
506
- let result = self.omiLib.callManager.audioController.toggleSpeaker();
507
- self.isSpeaker = result
509
+ let result = omiLib.callManager.audioController.toggleSpeaker();
510
+ isSpeaker = result
508
511
  OmikitPlugin.instance.sendSpeakerStatus()
509
512
  }
510
513
 
@@ -2,6 +2,7 @@ import Foundation
2
2
  import AVFoundation
3
3
  import SwiftUI
4
4
  import OmiKit
5
+ import Combine
5
6
 
6
7
  public class OmiUtils {
7
8
 
@@ -14,18 +15,6 @@ public class OmiUtils {
14
15
  return instance!
15
16
  }
16
17
 
17
- func convertDictionaryToJson(dictionary: [String: Any]) -> String? {
18
- do {
19
- let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: [])
20
- if let jsonString = String(data: jsonData, encoding: .utf8) {
21
- return jsonString
22
- }
23
- } catch {
24
- print("Error converting dictionary to JSON: \(error)")
25
- }
26
- return nil
27
- }
28
-
29
18
  func messageCall(type: Int) -> String {
30
19
  switch(type){
31
20
  case 0:
@@ -50,4 +39,46 @@ public class OmiUtils {
50
39
  return "START_CALL_SUCCESS"
51
40
  }
52
41
  }
42
+
43
+
44
+ /// Chuyển đổi Dictionary thành JSON String
45
+ static func convertDictionaryToJson(dictionary: [String: Any]) -> String? {
46
+ do {
47
+ let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: [])
48
+ return String(data: jsonData, encoding: .utf8)
49
+ } catch {
50
+ print("⚠️ Lỗi khi chuyển đổi dictionary sang JSON: \(error.localizedDescription)")
51
+ return nil
52
+ }
53
+ }
54
+
55
+ /// Trả về thông điệp lỗi tương ứng với mã lỗi của cuộc gọi
56
+ static func messageCall(type: Int) -> String {
57
+ switch type {
58
+ case 0: return "INVALID_UUID"
59
+ case 1: return "INVALID_PHONE_NUMBER"
60
+ case 2: return "SAME_PHONE_NUMBER_WITH_PHONE_REGISTER"
61
+ case 3: return "MAX_RETRY"
62
+ case 4: return "PERMISSION_DENIED"
63
+ case 5: return "COULD_NOT_FIND_END_POINT"
64
+ case 6: return "REGISTER_ACCOUNT_FAIL"
65
+ case 7: return "START_CALL_FAIL"
66
+ case 9: return "HAVE_ANOTHER_CALL"
67
+ default: return "START_CALL_SUCCESS"
68
+ }
69
+ }
70
+
71
+ static func checkTypeNumber(phoneNumber: String) -> String {
72
+ var result = "phone"
73
+
74
+ if phoneNumber.count < 8 {
75
+ result = "internal"
76
+ } else if phoneNumber.rangeOfCharacter(from: CharacterSet.letters) != nil &&
77
+ phoneNumber.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
78
+ result = "zalo"
79
+ }
80
+
81
+ return result
82
+ }
83
+
53
84
  }
@@ -49,15 +49,20 @@ public class OmikitPlugin: RCTEventEmitter {
49
49
  // MARK: - Call Methods
50
50
  @objc(initCallWithUserPassword:resolver:rejecter:)
51
51
  func initCallWithUserPassword(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
52
- guard let dataOmi = data as? [String: Any] else {
53
- reject("INVALID_DATA", "Expected a dictionary with user credentials.", nil)
54
- return
55
- }
56
- let result = CallManager.shareInstance().initWithUserPasswordEndpoint(params: dataOmi)
57
- resolve(result)
52
+ // Bước 1: Kiểm tra dữ liệu đầu vào có đúng định dạng không
53
+ guard let dataOmi = data as? [String: Any] else {
54
+ reject("INVALID_DATA", "Expected a dictionary with user credentials.", nil)
55
+ return
56
+ }
57
+ // ✅ Bước 2: Gọi initWithUserPasswordEndpoint() và kiểm tra kết quả
58
+ let result = CallManager.shareInstance().initWithUserPasswordEndpoint(params: dataOmi)
59
+ if result {
60
+ resolve(true)
61
+ } else {
62
+ reject("INIT_FAILED", "Không thể login vào OMI.", nil)
63
+ }
58
64
  }
59
65
 
60
-
61
66
  @objc(initCallWithApiKey:resolver:rejecter:)
62
67
  func initCallWithApiKey(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
63
68
  guard let dataOmi = data as? [String: Any] else {
@@ -70,17 +75,24 @@ public class OmikitPlugin: RCTEventEmitter {
70
75
 
71
76
 
72
77
  @objc(startCall:resolver:rejecter:)
73
- func startCall(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
74
- guard let dataOmi = data as? [String: Any],
75
- let phoneNumber = dataOmi["phoneNumber"] as? String else {
76
- reject("INVALID_DATA", "Expected a dictionary with phone number.", nil)
77
- return
78
- }
79
-
80
- let isVideo = dataOmi["isVideo"] as? Bool ?? false
81
- CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo) { callResult in
82
- resolve(callResult)
83
- }
78
+ func startCall(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
79
+ guard let dataOmi = data as? [String: Any],
80
+ let phoneNumber = dataOmi["phoneNumber"] as? String else {
81
+ reject("INVALID_DATA", "Expected a dictionary with phone number.", nil)
82
+ return
83
+ }
84
+
85
+ let isVideo = dataOmi["isVideo"] as? Bool ?? false
86
+
87
+ CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo) { callResult in
88
+ DispatchQueue.main.async {
89
+ if let result = callResult as? String, !result.isEmpty {
90
+ resolve(result)
91
+ } else {
92
+ reject("CALL_FAILED", "You have not logged into OMI", nil)
93
+ }
94
+ }
95
+ }
84
96
  }
85
97
 
86
98
  @objc(startCallWithUuid:resolver:rejecter:)
@@ -38,11 +38,20 @@ const LINKING_ERROR = `The package 'omikit-plugin' doesn't seem to be linked. Ma
38
38
  ios: "- You have run 'pod install'\n",
39
39
  default: ''
40
40
  }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
41
- const OmikitPlugin = _reactNative.NativeModules.OmikitPlugin ? _reactNative.NativeModules.OmikitPlugin : new Proxy({}, {
42
- get() {
43
- throw new Error(LINKING_ERROR);
44
- }
45
- });
41
+ const {
42
+ OmikitPlugin
43
+ } = _reactNative.NativeModules;
44
+ // ✅ Khai báo chính xác Native Module
45
+ // const OmikitPlugin = NativeModules.OmikitPlugin
46
+ // ? NativeModules.OmikitPlugin
47
+ // : new Proxy(
48
+ // {},
49
+ // {
50
+ // get() {
51
+ // throw new Error(LINKING_ERROR);
52
+ // },
53
+ // }
54
+ // );
46
55
 
47
56
  /**
48
57
  * Starts the Omikit services.
@@ -282,7 +291,7 @@ function transferCall(data) {
282
291
  function rejectCall() {
283
292
  return OmikitPlugin.rejectCall();
284
293
  }
285
- const omiEmitter = new _reactNative.NativeEventEmitter(OmikitPlugin);
294
+ const omiEmitter = _reactNative.Platform.OS === 'ios' ? new _reactNative.NativeEventEmitter(OmikitPlugin) : new _reactNative.NativeEventEmitter();
286
295
  exports.omiEmitter = omiEmitter;
287
296
  const OmiCallEvent = {
288
297
  onCallStateChanged: 'CALL_STATE_CHANGED',
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","OmikitPlugin","NativeModules","Proxy","get","Error","startServices","configPushNotification","data","getInitialCall","OS","initCallWithUserPassword","initCallWithApiKey","startCall","startCallWithUuid","joinCall","endCall","toggleMute","toggleSpeaker","toggleHold","onHold","sendDTMF","switchOmiCamera","toggleOmiVideo","logout","registerVideoEvent","removeVideoEvent","getCurrentUser","getGuestUser","systemAlertWindow","openSystemAlertSetting","getAudio","setAudio","getCurrentAudio","transferCall","rejectCall","omiEmitter","NativeEventEmitter","exports","OmiCallEvent","onCallStateChanged","onSpeaker","onMuted","onRemoteVideoReady","onClickMissedCall","onSwitchboardAnswer","onCallQuality","onAudioChange","onRequestPermissionAndroid"],"sourceRoot":"../../src","sources":["omikit.tsx"],"mappings":"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"}
1
+ {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","OmikitPlugin","NativeModules","startServices","configPushNotification","data","getInitialCall","OS","initCallWithUserPassword","initCallWithApiKey","startCall","startCallWithUuid","joinCall","endCall","toggleMute","toggleSpeaker","toggleHold","onHold","sendDTMF","switchOmiCamera","toggleOmiVideo","logout","registerVideoEvent","removeVideoEvent","getCurrentUser","getGuestUser","systemAlertWindow","openSystemAlertSetting","getAudio","setAudio","getCurrentAudio","transferCall","rejectCall","omiEmitter","NativeEventEmitter","exports","OmiCallEvent","onCallStateChanged","onSpeaker","onMuted","onRemoteVideoReady","onClickMissedCall","onSwitchboardAnswer","onCallQuality","onAudioChange","onRequestPermissionAndroid"],"sourceRoot":"../../src","sources":["omikit.tsx"],"mappings":"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"}
@@ -3,11 +3,20 @@ const LINKING_ERROR = `The package 'omikit-plugin' doesn't seem to be linked. Ma
3
3
  ios: "- You have run 'pod install'\n",
4
4
  default: ''
5
5
  }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
6
- const OmikitPlugin = NativeModules.OmikitPlugin ? NativeModules.OmikitPlugin : new Proxy({}, {
7
- get() {
8
- throw new Error(LINKING_ERROR);
9
- }
10
- });
6
+ const {
7
+ OmikitPlugin
8
+ } = NativeModules;
9
+ // ✅ Khai báo chính xác Native Module
10
+ // const OmikitPlugin = NativeModules.OmikitPlugin
11
+ // ? NativeModules.OmikitPlugin
12
+ // : new Proxy(
13
+ // {},
14
+ // {
15
+ // get() {
16
+ // throw new Error(LINKING_ERROR);
17
+ // },
18
+ // }
19
+ // );
11
20
 
12
21
  /**
13
22
  * Starts the Omikit services.
@@ -247,7 +256,7 @@ export function transferCall(data) {
247
256
  export function rejectCall() {
248
257
  return OmikitPlugin.rejectCall();
249
258
  }
250
- export const omiEmitter = new NativeEventEmitter(OmikitPlugin);
259
+ export const omiEmitter = Platform.OS === 'ios' ? new NativeEventEmitter(OmikitPlugin) : new NativeEventEmitter();
251
260
  export const OmiCallEvent = {
252
261
  onCallStateChanged: 'CALL_STATE_CHANGED',
253
262
  onSpeaker: 'SPEAKER',
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","NativeEventEmitter","LINKING_ERROR","select","ios","default","OmikitPlugin","Proxy","get","Error","startServices","configPushNotification","data","getInitialCall","OS","initCallWithUserPassword","initCallWithApiKey","startCall","startCallWithUuid","joinCall","endCall","toggleMute","toggleSpeaker","toggleHold","onHold","sendDTMF","switchOmiCamera","toggleOmiVideo","logout","registerVideoEvent","removeVideoEvent","getCurrentUser","getGuestUser","systemAlertWindow","openSystemAlertSetting","getAudio","setAudio","getCurrentAudio","transferCall","rejectCall","omiEmitter","OmiCallEvent","onCallStateChanged","onSpeaker","onMuted","onRemoteVideoReady","onClickMissedCall","onSwitchboardAnswer","onCallQuality","onAudioChange","onRequestPermissionAndroid"],"sourceRoot":"../../src","sources":["omikit.tsx"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,EAAEC,kBAAkB,QAAQ,cAAc;AAE1E,MAAMC,aAAa,GAChB,wEAAuE,GACxEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,YAAY,GAAGP,aAAa,CAACO,YAAY,GAC3CP,aAAa,CAACO,YAAY,GAC1B,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CAAC,CACF;;AAEL;AACA;AACA;AACA;AACA,OAAO,SAASQ,aAAaA,CAAA,EAAiB;EAC5C,OAAOJ,YAAY,CAACI,aAAa,EAAE;AACrC;;AAGA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAACC,IAAS,EAAgB;EAC9D,OAAON,YAAY,CAACK,sBAAsB,CAACC,IAAI,CAAC;AAClD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAiB;EAC7C,IAAGb,QAAQ,CAACc,EAAE,IAAI,KAAK,EAAC;IACxB,OAAOR,YAAY,CAACO,cAAc,EAAE;EACpC,CAAC,MAAM;IACL,OAAOP,YAAY,CAACO,cAAc,CAAC,CAAC,CAAC;EACvC;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,wBAAwBA,CAACH,IAAS,EAAoB;EACpE,OAAON,YAAY,CAACS,wBAAwB,CAACH,IAAI,CAAC;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,kBAAkBA,CAACJ,IAAS,EAAoB;EAC9D,OAAON,YAAY,CAACU,kBAAkB,CAACJ,IAAI,CAAC;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASK,SAASA,CAACL,IAAS,EAAoB;EACrD,OAAON,YAAY,CAACW,SAAS,CAACL,IAAI,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,iBAAiBA,CAACN,IAAS,EAAoB;EAC7D,OAAON,YAAY,CAACY,iBAAiB,CAACN,IAAI,CAAC;AAC7C;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASO,QAAQA,CAAA,EAAiB;EACvC,OAAOb,YAAY,CAACa,QAAQ,EAAE;AAChC;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAiB;EACtC,OAAOd,YAAY,CAACc,OAAO,EAAE;AAC/B;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOf,YAAY,CAACe,UAAU,EAAE;AAClC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAqB;EAChD,OAAOhB,YAAY,CAACgB,aAAa,EAAE;AACrC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOjB,YAAY,CAACiB,UAAU,EAAE;AAClC;;AAGA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACZ,IAAS,EAAoB;EAClD,OAAON,YAAY,CAACkB,MAAM,CAACZ,IAAI,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASa,QAAQA,CAACb,IAAS,EAAoB;EACpD,OAAON,YAAY,CAACmB,QAAQ,CAACb,IAAI,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASc,eAAeA,CAAA,EAAqB;EAClD,OAAOpB,YAAY,CAACoB,eAAe,EAAE;AACvC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOrB,YAAY,CAACqB,cAAc,EAAE;AACtC;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAA,EAAqB;EACzC,OAAOtB,YAAY,CAACsB,MAAM,EAAE;AAC9B;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAAqB;EACrD,OAAOvB,YAAY,CAACuB,kBAAkB,EAAE;AAC1C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAA,EAAqB;EACnD,OAAOxB,YAAY,CAACwB,gBAAgB,EAAE;AACxC;;AAGA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAiB;EAC7C,OAAOzB,YAAY,CAACyB,cAAc,EAAE;AACtC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAiB;EAC3C,OAAO1B,YAAY,CAAC0B,YAAY,EAAE;AACpC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAqB;EACpD,OAAO3B,YAAY,CAAC2B,iBAAiB,EAAE;AACzC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAA,EAAkB;EACtD,OAAO5B,YAAY,CAAC4B,sBAAsB,EAAE;AAC9C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,QAAQA,CAAA,EAAiB;EACvC,OAAO7B,YAAY,CAAC6B,QAAQ,EAAE;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,QAAQA,CAACxB,IAAS,EAAiB;EACjD,OAAON,YAAY,CAAC8B,QAAQ,CAACxB,IAAI,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASyB,eAAeA,CAAA,EAAiB;EAC9C,OAAO/B,YAAY,CAAC+B,eAAe,EAAE;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC1B,IAAS,EAAoB;EACxD,OAAON,YAAY,CAACgC,YAAY,CAAC1B,IAAI,CAAC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS2B,UAAUA,CAAA,EAAqB;EAC7C,OAAOjC,YAAY,CAACiC,UAAU,EAAE;AAClC;AAGA,OAAO,MAAMC,UAAU,GAAG,IAAIvC,kBAAkB,CAACK,YAAY,CAAC;AAE9D,OAAO,MAAMmC,YAAY,GAAG;EAC1BC,kBAAkB,EAAE,oBAAoB;EACxCC,SAAS,EAAE,SAAS;EACpBC,OAAO,EAAE,OAAO;EAChBpB,MAAM,EAAE,MAAM;EACdqB,kBAAkB,EAAE,oBAAoB;EACxCC,iBAAiB,EAAE,mBAAmB;EACtCC,mBAAmB,EAAE,oBAAoB;EACzCC,aAAa,EAAE,cAAc;EAC7BC,aAAa,EAAE,cAAc;EAC7BC,0BAA0B,EAAE;AAC9B,CAAC"}
1
+ {"version":3,"names":["NativeModules","Platform","NativeEventEmitter","LINKING_ERROR","select","ios","default","OmikitPlugin","startServices","configPushNotification","data","getInitialCall","OS","initCallWithUserPassword","initCallWithApiKey","startCall","startCallWithUuid","joinCall","endCall","toggleMute","toggleSpeaker","toggleHold","onHold","sendDTMF","switchOmiCamera","toggleOmiVideo","logout","registerVideoEvent","removeVideoEvent","getCurrentUser","getGuestUser","systemAlertWindow","openSystemAlertSetting","getAudio","setAudio","getCurrentAudio","transferCall","rejectCall","omiEmitter","OmiCallEvent","onCallStateChanged","onSpeaker","onMuted","onRemoteVideoReady","onClickMissedCall","onSwitchboardAnswer","onCallQuality","onAudioChange","onRequestPermissionAndroid"],"sourceRoot":"../../src","sources":["omikit.tsx"],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "omikit-plugin",
3
- "version": "3.2.71",
3
+ "version": "3.2.73",
4
4
  "description": "Omikit Plugin by ViHAT",
5
- "main": "lib/commonjs/index",
5
+ "main": "src/commonjs/index",
6
6
  "module": "lib/module/index",
7
7
  "types": "src/types/index.d.ts",
8
8
  "react-native": "src/index",
package/src/index.tsx CHANGED
@@ -2,4 +2,4 @@ export * from './omikit';
2
2
  export * from './omi_local_camera';
3
3
  export * from './omi_remote_camera';
4
4
  export * from './omi_call_state';
5
- export * from './omi_start_call_status';
5
+ export * from './omi_start_call_status';
package/src/omikit.tsx CHANGED
@@ -6,16 +6,19 @@ const LINKING_ERROR =
6
6
  '- You rebuilt the app after installing the package\n' +
7
7
  '- You are not using Expo Go\n';
8
8
 
9
- const OmikitPlugin = NativeModules.OmikitPlugin
10
- ? NativeModules.OmikitPlugin
11
- : new Proxy(
12
- {},
13
- {
14
- get() {
15
- throw new Error(LINKING_ERROR);
16
- },
17
- }
18
- );
9
+ const { OmikitPlugin } = NativeModules;
10
+ // ✅ Khai báo chính xác Native Module
11
+ // const OmikitPlugin = NativeModules.OmikitPlugin
12
+ // ? NativeModules.OmikitPlugin
13
+ // : new Proxy(
14
+ // {},
15
+ // {
16
+ // get() {
17
+ // throw new Error(LINKING_ERROR);
18
+ // },
19
+ // }
20
+ // );
21
+
19
22
 
20
23
  /**
21
24
  * Starts the Omikit services.
@@ -265,7 +268,7 @@ export function rejectCall(): Promise<boolean> {
265
268
  }
266
269
 
267
270
 
268
- export const omiEmitter = new NativeEventEmitter(OmikitPlugin);
271
+ export const omiEmitter = Platform.OS === 'ios' ? new NativeEventEmitter(OmikitPlugin) : new NativeEventEmitter();
269
272
 
270
273
  export const OmiCallEvent = {
271
274
  onCallStateChanged: 'CALL_STATE_CHANGED',
@@ -1,6 +1,6 @@
1
1
  declare module 'omikit-plugin' {
2
2
  import { NativeEventEmitter } from 'react-native';
3
-
3
+
4
4
  export function startServices(): Promise<any>;
5
5
  export function configPushNotification(data: any): Promise<any>;
6
6
  export function getInitialCall(): Promise<any>;
@@ -30,8 +30,6 @@ declare module 'omikit-plugin' {
30
30
  export function transferCall(data: any): Promise<boolean>;
31
31
  export function rejectCall(): Promise<boolean>;
32
32
 
33
- export const omiEmitter: NativeEventEmitter;
34
-
35
33
  export enum OmiCallState {
36
34
  unknown,
37
35
  calling,
@@ -42,9 +40,6 @@ declare module 'omikit-plugin' {
42
40
  disconnected,
43
41
  hold
44
42
  }
45
-
46
-
47
-
48
43
 
49
44
  export const OmiCallEvent: {
50
45
  onCallStateChanged: string;
@@ -58,4 +53,9 @@ declare module 'omikit-plugin' {
58
53
  onAudioChange: string;
59
54
  onRequestPermissionAndroid: string;
60
55
  };
61
- }
56
+
57
+
58
+
59
+ export const omiEmitter: NativeEventEmitter;
60
+ }
61
+