omikit-plugin 3.2.50 → 3.2.51
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/ios/Library/OmikitPlugin.swift +80 -198
- package/omikit-plugin.podspec +5 -1
- package/package.json +1 -1
|
@@ -1,234 +1,116 @@
|
|
|
1
|
-
import Foundation
|
|
2
|
-
import React
|
|
3
|
-
import OmiKit
|
|
4
|
-
|
|
5
1
|
@objc(OmikitPlugin)
|
|
6
2
|
public class OmikitPlugin: RCTEventEmitter {
|
|
7
3
|
|
|
8
|
-
@objc public static var instance
|
|
4
|
+
@objc public static var instance: OmikitPlugin!
|
|
9
5
|
|
|
10
6
|
override init() {
|
|
11
7
|
super.init()
|
|
12
8
|
OmikitPlugin.instance = self
|
|
13
9
|
}
|
|
14
|
-
|
|
10
|
+
|
|
11
|
+
// MARK: - Helpers
|
|
12
|
+
private func validateString(_ value: Any?) -> String? {
|
|
13
|
+
guard let string = value as? String, !string.isEmpty else {
|
|
14
|
+
return nil
|
|
15
|
+
}
|
|
16
|
+
return string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private func validateDictionary(_ value: Any?) -> [String: Any]? {
|
|
20
|
+
return value as? [String: Any]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// MARK: - Native Methods
|
|
15
24
|
@objc(startServices:withRejecter:)
|
|
16
|
-
func startServices(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock)
|
|
25
|
+
func startServices(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
|
|
17
26
|
CallManager.shareInstance().registerNotificationCenter(showMissedCall: true)
|
|
18
27
|
resolve(true)
|
|
19
28
|
}
|
|
20
|
-
|
|
21
|
-
@objc(configPushNotification:withResolver:withRejecter:)
|
|
22
|
-
func configPushNotification(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
23
|
-
if let dataOmi = data as? [String: Any] {
|
|
24
|
-
CallManager.shareInstance().configNotification(data: dataOmi)
|
|
25
|
-
}
|
|
26
|
-
resolve(true)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@objc(getInitialCall:withRejecter:)
|
|
30
|
-
func getInitialCall(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
31
|
-
if let call = CallManager.shareInstance().getAvailableCall() {
|
|
32
|
-
let data : [String: Any] = [
|
|
33
|
-
"callerNumber" : call.callerNumber,
|
|
34
|
-
"status": call.lastStatus,
|
|
35
|
-
"muted": call.muted,
|
|
36
|
-
"isVideo": call.isVideo,
|
|
37
|
-
]
|
|
38
|
-
resolve(data)
|
|
39
|
-
return
|
|
40
|
-
}
|
|
41
|
-
resolve(nil)
|
|
42
|
-
}
|
|
43
|
-
|
|
29
|
+
|
|
44
30
|
@objc(initCallWithUserPassword:withResolver:withRejecter:)
|
|
45
|
-
func initCallWithUserPassword(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
31
|
+
func initCallWithUserPassword(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
32
|
+
guard let dataOmi = validateDictionary(data) else {
|
|
33
|
+
reject("E_INVALID_DATA", "Invalid data format", nil)
|
|
34
|
+
return
|
|
49
35
|
}
|
|
36
|
+
|
|
37
|
+
let result = CallManager.shareInstance().initWithUserPasswordEndpoint(params: dataOmi)
|
|
38
|
+
resolve(result)
|
|
50
39
|
}
|
|
51
|
-
|
|
40
|
+
|
|
52
41
|
@objc(initCallWithApiKey:withResolver:withRejecter:)
|
|
53
|
-
func initCallWithApiKey(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@objc(startCall:withResolver:withRejecter:)
|
|
62
|
-
func startCall(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
63
|
-
if let dataOmi = data as? [String: Any] {
|
|
64
|
-
let phoneNumber = dataOmi["phoneNumber"] as! String
|
|
65
|
-
var isVideo = false
|
|
66
|
-
if let isVideoCall = dataOmi["isVideo"] as? Bool {
|
|
67
|
-
isVideo = isVideoCall
|
|
68
|
-
}
|
|
69
|
-
CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo) { callResult in
|
|
70
|
-
resolve(callResult)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
@objc(startCallWithUuid:withResolver:withRejecter:)
|
|
76
|
-
func startCallWithUuid(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
77
|
-
if let dataOmi = data as? [String: Any] {
|
|
78
|
-
let uuid = dataOmi["usrUuid"] as! String
|
|
79
|
-
var isVideo = false
|
|
80
|
-
if let isVideoCall = dataOmi["isVideo"] as? Bool {
|
|
81
|
-
isVideo = isVideoCall
|
|
82
|
-
}
|
|
83
|
-
CallManager.shareInstance().startCallWithUuid(uuid, isVideo: isVideo) { callResult in
|
|
84
|
-
resolve(callResult)
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
@objc(joinCall:withRejecter:)
|
|
90
|
-
func joinCall(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
91
|
-
CallManager.shareInstance().joinCall()
|
|
92
|
-
resolve(true)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@objc(endCall:withRejecter:)
|
|
96
|
-
func endCall(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) -> Void {
|
|
97
|
-
CallManager.shareInstance().endCall()
|
|
98
|
-
resolve(true)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
@objc(toggleMute:withRejecter:)
|
|
102
|
-
func toggleMute(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
103
|
-
CallManager.shareInstance().toggleMute()
|
|
104
|
-
if let call = CallManager.shareInstance().getAvailableCall() {
|
|
105
|
-
resolve(call.muted)
|
|
42
|
+
func initCallWithApiKey(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
43
|
+
guard let dataOmi = validateDictionary(data) else {
|
|
44
|
+
reject("E_INVALID_DATA", "Invalid data format", nil)
|
|
45
|
+
return
|
|
106
46
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
@objc(toggleSpeaker:withRejecter:)
|
|
111
|
-
func toggleSpeaker(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
112
|
-
CallManager.shareInstance().toogleSpeaker()
|
|
113
|
-
resolve(CallManager.shareInstance().isSpeaker)
|
|
47
|
+
|
|
48
|
+
let result = CallManager.shareInstance().initWithApiKeyEndpoint(params: dataOmi)
|
|
49
|
+
resolve(result)
|
|
114
50
|
}
|
|
115
|
-
|
|
116
|
-
@objc(
|
|
117
|
-
func
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
51
|
+
|
|
52
|
+
@objc(configPushNotification:withResolver:withRejecter:)
|
|
53
|
+
func configPushNotification(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
|
|
54
|
+
guard let dataOmi = validateDictionary(data) else {
|
|
55
|
+
reject("E_INVALID_DATA", "Invalid data format", nil)
|
|
56
|
+
return
|
|
121
57
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
@objc(switchOmiCamera:withRejecter:)
|
|
125
|
-
func switchOmiCamera(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
126
|
-
CallManager.shareInstance().switchCamera()
|
|
127
|
-
resolve(true)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
@objc(toggleOmiVideo:withRejecter:)
|
|
131
|
-
func toggleOmiVideo(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
132
|
-
CallManager.shareInstance().toggleCamera()
|
|
133
|
-
resolve(true)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
@objc(logout:withRejecter:)
|
|
137
|
-
func logout(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
138
|
-
CallManager.shareInstance().logout()
|
|
139
|
-
resolve(true)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
@objc(registerVideoEvent:withRejecter:)
|
|
143
|
-
func registerVideoEvent(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
144
|
-
CallManager.shareInstance().registerVideoEvent()
|
|
145
|
-
resolve(true)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
@objc(removeVideoEvent:withRejecter:)
|
|
149
|
-
func removeVideoEvent(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
150
|
-
CallManager.shareInstance().removeVideoEvent()
|
|
58
|
+
|
|
59
|
+
CallManager.shareInstance().configNotification(data: dataOmi)
|
|
151
60
|
resolve(true)
|
|
152
61
|
}
|
|
153
|
-
|
|
154
|
-
@objc(
|
|
155
|
-
func
|
|
156
|
-
|
|
157
|
-
|
|
62
|
+
|
|
63
|
+
@objc(startCall:withResolver:withRejecter:)
|
|
64
|
+
func startCall(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
65
|
+
guard let dataOmi = validateDictionary(data),
|
|
66
|
+
let phoneNumber = validateString(dataOmi["phoneNumber"]),
|
|
67
|
+
let isVideo = dataOmi["isVideo"] as? Bool else {
|
|
68
|
+
reject("E_INVALID_DATA", "Invalid or missing call parameters", nil)
|
|
69
|
+
return
|
|
158
70
|
}
|
|
159
|
-
}
|
|
160
71
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
CallManager.shareInstance().getGuestUser { user in
|
|
164
|
-
resolve(user)
|
|
72
|
+
CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo) { callResult in
|
|
73
|
+
resolve(callResult)
|
|
165
74
|
}
|
|
166
75
|
}
|
|
167
|
-
|
|
168
|
-
@objc(
|
|
169
|
-
func
|
|
170
|
-
|
|
171
|
-
|
|
76
|
+
|
|
77
|
+
@objc(startCallWithUuid:withResolver:withRejecter:)
|
|
78
|
+
func startCallWithUuid(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
79
|
+
guard let dataOmi = validateDictionary(data),
|
|
80
|
+
let uuid = validateString(dataOmi["usrUuid"]),
|
|
81
|
+
let isVideo = dataOmi["isVideo"] as? Bool else {
|
|
82
|
+
reject("E_INVALID_DATA", "Invalid or missing call parameters", nil)
|
|
83
|
+
return
|
|
172
84
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
func getAudio(resolve: @escaping RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) -> Void {
|
|
177
|
-
let audios = CallManager.shareInstance().getAudioOutputs()
|
|
178
|
-
resolve(audios)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
@objc(setAudio:withResolver:withRejecter:)
|
|
182
|
-
func setAudio(data: Any, resolve: @escaping RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) -> Void {
|
|
183
|
-
if let dataOmi = data as? [String: Any] {
|
|
184
|
-
let portType = dataOmi["portType"] as! String
|
|
185
|
-
CallManager.shareInstance().setAudioOutputs(portType: portType)
|
|
85
|
+
|
|
86
|
+
CallManager.shareInstance().startCallWithUuid(uuid, isVideo: isVideo) { callResult in
|
|
87
|
+
resolve(callResult)
|
|
186
88
|
}
|
|
187
89
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
func
|
|
191
|
-
|
|
192
|
-
|
|
90
|
+
|
|
91
|
+
// MARK: - Utility Functions
|
|
92
|
+
public override func supportedEvents() -> [String]! {
|
|
93
|
+
return [
|
|
94
|
+
"CALL_STATE_CHANGED",
|
|
95
|
+
"MUTED",
|
|
96
|
+
"SPEAKER",
|
|
97
|
+
"REMOTE_VIDEO_READY",
|
|
98
|
+
"CLICK_MISSED_CALL",
|
|
99
|
+
"SWITCHBOARD_ANSWER",
|
|
100
|
+
"CALL_QUALITY",
|
|
101
|
+
"AUDIO_CHANGE"
|
|
102
|
+
]
|
|
193
103
|
}
|
|
194
|
-
|
|
104
|
+
|
|
105
|
+
// Helper to send mute status
|
|
195
106
|
func sendMuteStatus() {
|
|
196
107
|
if let call = CallManager.shareInstance().getAvailableCall() {
|
|
197
|
-
sendEvent(withName: MUTED, body: call.muted)
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
func sendSpeakerStatus() {
|
|
202
|
-
sendEvent(withName: SPEAKER, body: CallManager.shareInstance().isSpeaker)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
@objc public func didReceive(data: [String: Any]) {
|
|
206
|
-
if let callerNumber = data["omisdkCallerNumber"] as? String, let isVideo = data["omisdkIsVideo"] as? Bool {
|
|
207
|
-
sendEvent(withName: CLICK_MISSED_CALL, body: [
|
|
208
|
-
"callerNumber": callerNumber,
|
|
209
|
-
"isVideo": isVideo,
|
|
210
|
-
])
|
|
108
|
+
sendEvent(withName: "MUTED", body: call.muted)
|
|
211
109
|
}
|
|
212
110
|
}
|
|
213
111
|
|
|
214
|
-
|
|
215
|
-
func
|
|
216
|
-
|
|
217
|
-
let phoneNumber = dataOmi["phoneNumber"] as! String
|
|
218
|
-
CallManager.shareInstance().transferCall(phoneNumber)
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
public override func supportedEvents() -> [String]! {
|
|
223
|
-
return [
|
|
224
|
-
CALL_STATE_CHANGED,
|
|
225
|
-
MUTED,
|
|
226
|
-
SPEAKER,
|
|
227
|
-
REMOTE_VIDEO_READY,
|
|
228
|
-
CLICK_MISSED_CALL,
|
|
229
|
-
SWITCHBOARD_ANSWER,
|
|
230
|
-
CALL_QUALITY,
|
|
231
|
-
AUDIO_CHANGE,
|
|
232
|
-
]
|
|
112
|
+
// Helper to send speaker status
|
|
113
|
+
func sendSpeakerStatus() {
|
|
114
|
+
sendEvent(withName: "SPEAKER", body: CallManager.shareInstance().isSpeaker)
|
|
233
115
|
}
|
|
234
116
|
}
|
package/omikit-plugin.podspec
CHANGED
|
@@ -22,9 +22,13 @@ Pod::Spec.new do |s|
|
|
|
22
22
|
# Định nghĩa module để tránh lỗi Swift bridging header
|
|
23
23
|
s.static_framework = true
|
|
24
24
|
s.pod_target_xcconfig = {
|
|
25
|
-
"DEFINES_MODULE" => "YES"
|
|
25
|
+
"DEFINES_MODULE" => "YES",
|
|
26
|
+
"SWIFT_VERSION" => "5.0"
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
# Xác định module name
|
|
30
|
+
s.module_name = "omikit_plugin"
|
|
31
|
+
|
|
28
32
|
# Thêm dependency bắt buộc
|
|
29
33
|
s.dependency "React-Core"
|
|
30
34
|
s.dependency "OmiKit", "1.8.1"
|