omikit-plugin 3.2.71 → 3.2.72
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 +43 -4
- package/android/build.gradle +1 -1
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/omikitplugin/OmikitPluginModule.kt +191 -146
- package/android/src/main/java/com/omikitplugin/utils/OmiKitUtils.kt +11 -0
- package/ios/CallProcess/CallManager.swift +83 -80
- package/ios/CallProcess/OmiUtils.swift +43 -12
- package/ios/Library/OmikitPlugin.swift +30 -18
- package/lib/commonjs/omikit.js +15 -6
- package/lib/commonjs/omikit.js.map +1 -1
- package/lib/module/omikit.js +15 -6
- package/lib/module/omikit.js.map +1 -1
- package/package.json +2 -2
- package/src/index.tsx +1 -1
- package/src/omikit.tsx +14 -11
- package/src/types/index.d.ts +25 -7
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
|
-
|
|
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
|
-
|
|
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
|
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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"
|
|
@@ -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
|
|
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
|
-
|
|
53
|
+
isIncoming = true;
|
|
50
54
|
Log.d("OMISDK", "=>> START INCOMING CALL REVICED => ")
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
map.
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
71
|
+
callerId: Int,
|
|
72
|
+
phoneNumber: String?,
|
|
73
|
+
isVideo: Boolean?,
|
|
74
|
+
startTime: Long,
|
|
75
|
+
transactionId: String?,
|
|
66
76
|
) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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 =
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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
|
-
|
|
447
|
+
promise.resolve(false)
|
|
416
448
|
} else {
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
-
|
|
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":
|
|
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 =
|
|
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 =
|
|
507
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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:)
|
package/lib/commonjs/omikit.js
CHANGED
|
@@ -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
|
|
42
|
-
|
|
43
|
-
|
|
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","
|
|
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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"}
|
package/lib/module/omikit.js
CHANGED
|
@@ -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
|
|
7
|
-
|
|
8
|
-
|
|
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',
|
package/lib/module/omikit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","NativeEventEmitter","LINKING_ERROR","select","ios","default","OmikitPlugin","
|
|
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.
|
|
3
|
+
"version": "3.2.72",
|
|
4
4
|
"description": "Omikit Plugin by ViHAT",
|
|
5
|
-
"main": "
|
|
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
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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',
|
package/src/types/index.d.ts
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,27 @@ declare module 'omikit-plugin' {
|
|
|
58
53
|
onAudioChange: string;
|
|
59
54
|
onRequestPermissionAndroid: string;
|
|
60
55
|
};
|
|
61
|
-
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
// // ✅ Định nghĩa omiEmitter để luôn listen được event
|
|
60
|
+
// export const omiEmitter: NativeEventEmitter;
|
|
61
|
+
|
|
62
|
+
// ✅ Định nghĩa lại `addListener`, `removeListener`, `removeAllListeners`
|
|
63
|
+
export interface OmiEmitterInterface extends NativeEventEmitter {
|
|
64
|
+
addListener(
|
|
65
|
+
eventType: string,
|
|
66
|
+
listener: (event: any) => void
|
|
67
|
+
): void;
|
|
68
|
+
|
|
69
|
+
removeListener(
|
|
70
|
+
eventType: string,
|
|
71
|
+
listener: (event: any) => void
|
|
72
|
+
): void;
|
|
73
|
+
|
|
74
|
+
removeAllListeners(eventType?: string): void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const omiEmitter: OmiEmitterInterface;
|
|
78
|
+
}
|
|
79
|
+
|