@telnyx/react-voice-commons-sdk 0.1.2 → 0.1.3
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/CHANGELOG.md +42 -0
- package/TelnyxVoiceCommons.podspec +31 -31
- package/ios/CallKitBridge.m +43 -43
- package/ios/CallKitBridge.swift +874 -879
- package/ios/VoicePnBridge.m +30 -30
- package/ios/VoicePnBridge.swift +86 -86
- package/lib/callkit/callkit-coordinator.d.ts +110 -117
- package/lib/callkit/callkit-coordinator.js +664 -727
- package/lib/callkit/callkit.d.ts +41 -41
- package/lib/callkit/callkit.js +252 -242
- package/lib/callkit/index.js +15 -47
- package/lib/callkit/use-callkit.d.ts +19 -19
- package/lib/callkit/use-callkit.js +270 -310
- package/lib/context/TelnyxVoiceContext.d.ts +9 -9
- package/lib/context/TelnyxVoiceContext.js +10 -13
- package/lib/hooks/use-callkit-coordinator.d.ts +9 -17
- package/lib/hooks/use-callkit-coordinator.js +45 -50
- package/lib/hooks/useAppReadyNotifier.js +13 -15
- package/lib/hooks/useAppStateHandler.d.ts +6 -11
- package/lib/hooks/useAppStateHandler.js +95 -110
- package/lib/hooks/useNetworkStateHandler.d.ts +0 -0
- package/lib/hooks/useNetworkStateHandler.js +0 -0
- package/lib/index.d.ts +3 -21
- package/lib/index.js +50 -201
- package/lib/internal/CallKitHandler.d.ts +6 -6
- package/lib/internal/CallKitHandler.js +96 -104
- package/lib/internal/callkit-manager.d.ts +57 -57
- package/lib/internal/callkit-manager.js +299 -316
- package/lib/internal/calls/call-state-controller.d.ts +73 -86
- package/lib/internal/calls/call-state-controller.js +263 -307
- package/lib/internal/session/session-manager.d.ts +71 -75
- package/lib/internal/session/session-manager.js +360 -424
- package/lib/internal/user-defaults-helpers.js +49 -39
- package/lib/internal/voice-pn-bridge.d.ts +114 -12
- package/lib/internal/voice-pn-bridge.js +212 -5
- package/lib/models/call-state.d.ts +46 -44
- package/lib/models/call-state.js +70 -68
- package/lib/models/call.d.ts +161 -133
- package/lib/models/call.js +454 -382
- package/lib/models/config.d.ts +11 -18
- package/lib/models/config.js +37 -35
- package/lib/models/connection-state.d.ts +10 -10
- package/lib/models/connection-state.js +16 -16
- package/lib/telnyx-voice-app.d.ts +28 -28
- package/lib/telnyx-voice-app.js +463 -481
- package/lib/telnyx-voip-client.d.ts +167 -167
- package/lib/telnyx-voip-client.js +385 -390
- package/package.json +11 -4
- package/src/callkit/callkit-coordinator.ts +18 -34
- package/src/hooks/useNetworkStateHandler.ts +0 -0
- package/src/internal/calls/call-state-controller.ts +81 -58
- package/src/internal/session/session-manager.ts +42 -26
- package/src/internal/voice-pn-bridge.ts +250 -2
- package/src/models/call-state.ts +8 -1
- package/src/models/call.ts +119 -5
- package/src/telnyx-voice-app.tsx +87 -40
- package/src/telnyx-voip-client.ts +15 -3
- package/src/types/telnyx-sdk.d.ts +16 -2
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* @telnyx/react-voice-commons-sdk
|
|
4
4
|
*
|
|
@@ -9,209 +9,58 @@
|
|
|
9
9
|
* call state transitions, push notification processing, and native call UI
|
|
10
10
|
* integration.
|
|
11
11
|
*/
|
|
12
|
-
var __createBinding =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: function (o, m, k, k2) {
|
|
29
|
-
if (k2 === undefined) k2 = k;
|
|
30
|
-
o[k2] = m[k];
|
|
31
|
-
});
|
|
32
|
-
var __exportStar =
|
|
33
|
-
(this && this.__exportStar) ||
|
|
34
|
-
function (m, exports) {
|
|
35
|
-
for (var p in m)
|
|
36
|
-
if (p !== 'default' && !Object.prototype.hasOwnProperty.call(exports, p))
|
|
37
|
-
__createBinding(exports, m, p);
|
|
38
|
-
};
|
|
39
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
40
|
-
exports.useAppReadyNotifier =
|
|
41
|
-
exports.createTokenConfig =
|
|
42
|
-
exports.createCredentialConfig =
|
|
43
|
-
exports.validateTokenConfig =
|
|
44
|
-
exports.validateCredentialConfig =
|
|
45
|
-
exports.validateConfig =
|
|
46
|
-
exports.isTokenConfig =
|
|
47
|
-
exports.isCredentialConfig =
|
|
48
|
-
exports.CallStateHelpers =
|
|
49
|
-
exports.isTelnyxCallState =
|
|
50
|
-
exports.TelnyxCallState =
|
|
51
|
-
exports.isTransitioning =
|
|
52
|
-
exports.isConnected =
|
|
53
|
-
exports.canMakeCalls =
|
|
54
|
-
exports.isTelnyxConnectionState =
|
|
55
|
-
exports.TelnyxConnectionState =
|
|
56
|
-
exports.Call =
|
|
57
|
-
exports.useTelnyxVoice =
|
|
58
|
-
exports.useAppStateHandler =
|
|
59
|
-
exports.TelnyxVoiceApp =
|
|
60
|
-
exports.createBackgroundTelnyxVoipClient =
|
|
61
|
-
exports.createTelnyxVoipClient =
|
|
62
|
-
exports.TelnyxVoipClient =
|
|
63
|
-
void 0;
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
24
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.useAppReadyNotifier = exports.createTokenConfig = exports.createCredentialConfig = exports.validateTokenConfig = exports.validateCredentialConfig = exports.validateConfig = exports.isTokenConfig = exports.isCredentialConfig = exports.CallStateHelpers = exports.isTelnyxCallState = exports.TelnyxCallState = exports.isTransitioning = exports.isConnected = exports.canMakeCalls = exports.isTelnyxConnectionState = exports.TelnyxConnectionState = exports.Call = exports.useTelnyxVoice = exports.useAppStateHandler = exports.TelnyxVoiceApp = exports.createBackgroundTelnyxVoipClient = exports.createTelnyxVoipClient = exports.TelnyxVoipClient = void 0;
|
|
64
28
|
// Main client
|
|
65
|
-
var telnyx_voip_client_1 = require(
|
|
66
|
-
Object.defineProperty(exports,
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return telnyx_voip_client_1.TelnyxVoipClient;
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
Object.defineProperty(exports, 'createTelnyxVoipClient', {
|
|
73
|
-
enumerable: true,
|
|
74
|
-
get: function () {
|
|
75
|
-
return telnyx_voip_client_1.createTelnyxVoipClient;
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
Object.defineProperty(exports, 'createBackgroundTelnyxVoipClient', {
|
|
79
|
-
enumerable: true,
|
|
80
|
-
get: function () {
|
|
81
|
-
return telnyx_voip_client_1.createBackgroundTelnyxVoipClient;
|
|
82
|
-
},
|
|
83
|
-
});
|
|
29
|
+
var telnyx_voip_client_1 = require("./telnyx-voip-client");
|
|
30
|
+
Object.defineProperty(exports, "TelnyxVoipClient", { enumerable: true, get: function () { return telnyx_voip_client_1.TelnyxVoipClient; } });
|
|
31
|
+
Object.defineProperty(exports, "createTelnyxVoipClient", { enumerable: true, get: function () { return telnyx_voip_client_1.createTelnyxVoipClient; } });
|
|
32
|
+
Object.defineProperty(exports, "createBackgroundTelnyxVoipClient", { enumerable: true, get: function () { return telnyx_voip_client_1.createBackgroundTelnyxVoipClient; } });
|
|
84
33
|
// TelnyxVoiceApp component
|
|
85
|
-
var telnyx_voice_app_1 = require(
|
|
86
|
-
Object.defineProperty(exports,
|
|
87
|
-
enumerable: true,
|
|
88
|
-
get: function () {
|
|
89
|
-
return telnyx_voice_app_1.TelnyxVoiceApp;
|
|
90
|
-
},
|
|
91
|
-
});
|
|
34
|
+
var telnyx_voice_app_1 = require("./telnyx-voice-app");
|
|
35
|
+
Object.defineProperty(exports, "TelnyxVoiceApp", { enumerable: true, get: function () { return telnyx_voice_app_1.TelnyxVoiceApp; } });
|
|
92
36
|
// Hooks
|
|
93
|
-
var useAppStateHandler_1 = require(
|
|
94
|
-
Object.defineProperty(exports,
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return useAppStateHandler_1.useAppStateHandler;
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
var TelnyxVoiceContext_1 = require('./context/TelnyxVoiceContext');
|
|
101
|
-
Object.defineProperty(exports, 'useTelnyxVoice', {
|
|
102
|
-
enumerable: true,
|
|
103
|
-
get: function () {
|
|
104
|
-
return TelnyxVoiceContext_1.useTelnyxVoice;
|
|
105
|
-
},
|
|
106
|
-
});
|
|
37
|
+
var useAppStateHandler_1 = require("./hooks/useAppStateHandler");
|
|
38
|
+
Object.defineProperty(exports, "useAppStateHandler", { enumerable: true, get: function () { return useAppStateHandler_1.useAppStateHandler; } });
|
|
39
|
+
var TelnyxVoiceContext_1 = require("./context/TelnyxVoiceContext");
|
|
40
|
+
Object.defineProperty(exports, "useTelnyxVoice", { enumerable: true, get: function () { return TelnyxVoiceContext_1.useTelnyxVoice; } });
|
|
107
41
|
// Models
|
|
108
|
-
var call_1 = require(
|
|
109
|
-
Object.defineProperty(exports,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
});
|
|
122
|
-
Object.defineProperty(exports,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
});
|
|
128
|
-
Object.defineProperty(exports, 'canMakeCalls', {
|
|
129
|
-
enumerable: true,
|
|
130
|
-
get: function () {
|
|
131
|
-
return connection_state_1.canMakeCalls;
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
Object.defineProperty(exports, 'isConnected', {
|
|
135
|
-
enumerable: true,
|
|
136
|
-
get: function () {
|
|
137
|
-
return connection_state_1.isConnected;
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
Object.defineProperty(exports, 'isTransitioning', {
|
|
141
|
-
enumerable: true,
|
|
142
|
-
get: function () {
|
|
143
|
-
return connection_state_1.isTransitioning;
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
var call_state_1 = require('./models/call-state');
|
|
147
|
-
Object.defineProperty(exports, 'TelnyxCallState', {
|
|
148
|
-
enumerable: true,
|
|
149
|
-
get: function () {
|
|
150
|
-
return call_state_1.TelnyxCallState;
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
Object.defineProperty(exports, 'isTelnyxCallState', {
|
|
154
|
-
enumerable: true,
|
|
155
|
-
get: function () {
|
|
156
|
-
return call_state_1.isTelnyxCallState;
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
Object.defineProperty(exports, 'CallStateHelpers', {
|
|
160
|
-
enumerable: true,
|
|
161
|
-
get: function () {
|
|
162
|
-
return call_state_1.CallStateHelpers;
|
|
163
|
-
},
|
|
164
|
-
});
|
|
165
|
-
var config_1 = require('./models/config');
|
|
166
|
-
Object.defineProperty(exports, 'isCredentialConfig', {
|
|
167
|
-
enumerable: true,
|
|
168
|
-
get: function () {
|
|
169
|
-
return config_1.isCredentialConfig;
|
|
170
|
-
},
|
|
171
|
-
});
|
|
172
|
-
Object.defineProperty(exports, 'isTokenConfig', {
|
|
173
|
-
enumerable: true,
|
|
174
|
-
get: function () {
|
|
175
|
-
return config_1.isTokenConfig;
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
Object.defineProperty(exports, 'validateConfig', {
|
|
179
|
-
enumerable: true,
|
|
180
|
-
get: function () {
|
|
181
|
-
return config_1.validateConfig;
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
Object.defineProperty(exports, 'validateCredentialConfig', {
|
|
185
|
-
enumerable: true,
|
|
186
|
-
get: function () {
|
|
187
|
-
return config_1.validateCredentialConfig;
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
Object.defineProperty(exports, 'validateTokenConfig', {
|
|
191
|
-
enumerable: true,
|
|
192
|
-
get: function () {
|
|
193
|
-
return config_1.validateTokenConfig;
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
Object.defineProperty(exports, 'createCredentialConfig', {
|
|
197
|
-
enumerable: true,
|
|
198
|
-
get: function () {
|
|
199
|
-
return config_1.createCredentialConfig;
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
Object.defineProperty(exports, 'createTokenConfig', {
|
|
203
|
-
enumerable: true,
|
|
204
|
-
get: function () {
|
|
205
|
-
return config_1.createTokenConfig;
|
|
206
|
-
},
|
|
207
|
-
});
|
|
42
|
+
var call_1 = require("./models/call");
|
|
43
|
+
Object.defineProperty(exports, "Call", { enumerable: true, get: function () { return call_1.Call; } });
|
|
44
|
+
var connection_state_1 = require("./models/connection-state");
|
|
45
|
+
Object.defineProperty(exports, "TelnyxConnectionState", { enumerable: true, get: function () { return connection_state_1.TelnyxConnectionState; } });
|
|
46
|
+
Object.defineProperty(exports, "isTelnyxConnectionState", { enumerable: true, get: function () { return connection_state_1.isTelnyxConnectionState; } });
|
|
47
|
+
Object.defineProperty(exports, "canMakeCalls", { enumerable: true, get: function () { return connection_state_1.canMakeCalls; } });
|
|
48
|
+
Object.defineProperty(exports, "isConnected", { enumerable: true, get: function () { return connection_state_1.isConnected; } });
|
|
49
|
+
Object.defineProperty(exports, "isTransitioning", { enumerable: true, get: function () { return connection_state_1.isTransitioning; } });
|
|
50
|
+
var call_state_1 = require("./models/call-state");
|
|
51
|
+
Object.defineProperty(exports, "TelnyxCallState", { enumerable: true, get: function () { return call_state_1.TelnyxCallState; } });
|
|
52
|
+
Object.defineProperty(exports, "isTelnyxCallState", { enumerable: true, get: function () { return call_state_1.isTelnyxCallState; } });
|
|
53
|
+
Object.defineProperty(exports, "CallStateHelpers", { enumerable: true, get: function () { return call_state_1.CallStateHelpers; } });
|
|
54
|
+
var config_1 = require("./models/config");
|
|
55
|
+
Object.defineProperty(exports, "isCredentialConfig", { enumerable: true, get: function () { return config_1.isCredentialConfig; } });
|
|
56
|
+
Object.defineProperty(exports, "isTokenConfig", { enumerable: true, get: function () { return config_1.isTokenConfig; } });
|
|
57
|
+
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return config_1.validateConfig; } });
|
|
58
|
+
Object.defineProperty(exports, "validateCredentialConfig", { enumerable: true, get: function () { return config_1.validateCredentialConfig; } });
|
|
59
|
+
Object.defineProperty(exports, "validateTokenConfig", { enumerable: true, get: function () { return config_1.validateTokenConfig; } });
|
|
60
|
+
Object.defineProperty(exports, "createCredentialConfig", { enumerable: true, get: function () { return config_1.createCredentialConfig; } });
|
|
61
|
+
Object.defineProperty(exports, "createTokenConfig", { enumerable: true, get: function () { return config_1.createTokenConfig; } });
|
|
208
62
|
// Export CallKit functionality
|
|
209
|
-
__exportStar(require(
|
|
63
|
+
__exportStar(require("./callkit"), exports);
|
|
210
64
|
// Export hooks
|
|
211
|
-
var useAppReadyNotifier_1 = require(
|
|
212
|
-
Object.defineProperty(exports,
|
|
213
|
-
enumerable: true,
|
|
214
|
-
get: function () {
|
|
215
|
-
return useAppReadyNotifier_1.useAppReadyNotifier;
|
|
216
|
-
},
|
|
217
|
-
});
|
|
65
|
+
var useAppReadyNotifier_1 = require("./hooks/useAppReadyNotifier");
|
|
66
|
+
Object.defineProperty(exports, "useAppReadyNotifier", { enumerable: true, get: function () { return useAppReadyNotifier_1.useAppReadyNotifier; } });
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
interface CallKitHandlerProps {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/** Callback when user needs to login from push notification */
|
|
4
|
+
onLoginRequired?: (pushPayload: any) => void;
|
|
5
|
+
/** Callback when call is answered and user should navigate to dialer */
|
|
6
|
+
onNavigateToDialer?: () => void;
|
|
7
|
+
/** Callback when call ends and user should navigate back */
|
|
8
|
+
onNavigateBack?: () => void;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Internal CallKit handler for iOS push notifications
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
var __importDefault =
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
6
|
exports.CallKitHandler = void 0;
|
|
9
|
-
const react_1 = require(
|
|
10
|
-
const react_native_1 = require(
|
|
11
|
-
const expo_router_1 = require(
|
|
12
|
-
const async_storage_1 = __importDefault(require(
|
|
13
|
-
const TelnyxVoiceContext_1 = require(
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
const expo_router_1 = require("expo-router");
|
|
10
|
+
const async_storage_1 = __importDefault(require("@react-native-async-storage/async-storage"));
|
|
11
|
+
const TelnyxVoiceContext_1 = require("../context/TelnyxVoiceContext");
|
|
14
12
|
// Global flag to ensure only one CallKitHandler is active
|
|
15
13
|
let isCallKitHandlerActive = false;
|
|
16
14
|
/**
|
|
@@ -19,100 +17,94 @@ let isCallKitHandlerActive = false;
|
|
|
19
17
|
*
|
|
20
18
|
* @internal - Users should not use this component directly
|
|
21
19
|
*/
|
|
22
|
-
const CallKitHandler = ({ onLoginRequired, onNavigateToDialer, onNavigateBack }) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
20
|
+
const CallKitHandler = ({ onLoginRequired, onNavigateToDialer, onNavigateBack, }) => {
|
|
21
|
+
const router = (0, expo_router_1.useRouter)();
|
|
22
|
+
const { voipClient } = (0, TelnyxVoiceContext_1.useTelnyxVoice)();
|
|
23
|
+
// Store active calls by CallKit UUID for coordination
|
|
24
|
+
const activeCallsRef = (0, react_1.useRef)(new Map());
|
|
25
|
+
(0, react_1.useEffect)(() => {
|
|
26
|
+
if (react_native_1.Platform.OS !== 'ios')
|
|
27
|
+
return;
|
|
28
|
+
if (isCallKitHandlerActive) {
|
|
29
|
+
console.log('CallKitHandler: Another instance is already active, skipping setup');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
isCallKitHandlerActive = true;
|
|
33
|
+
console.log('CallKitHandler: Setting up DeviceEventEmitter listeners (singleton instance)...');
|
|
34
|
+
react_native_1.DeviceEventEmitter.removeAllListeners('incomingVoIPCall');
|
|
35
|
+
react_native_1.DeviceEventEmitter.removeAllListeners('callKitAction');
|
|
36
|
+
const incomingCallListener = react_native_1.DeviceEventEmitter.addListener('incomingVoIPCall', async (eventData) => {
|
|
37
|
+
console.log('🔥 CallKitHandler: Incoming VoIP call received:', eventData);
|
|
38
|
+
if (eventData.action === 'connect_webrtc') {
|
|
39
|
+
await handleIncomingCall(eventData);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const callKitActionListener = react_native_1.DeviceEventEmitter.addListener('callKitAction', async (eventData) => {
|
|
43
|
+
console.log('🔥 CallKitHandler: CallKit action received:', eventData);
|
|
44
|
+
switch (eventData.action) {
|
|
45
|
+
case 'answer':
|
|
46
|
+
await handleAnswerCall(eventData);
|
|
47
|
+
break;
|
|
48
|
+
case 'end':
|
|
49
|
+
await handleEndCall(eventData);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
console.log('CallKitHandler: DeviceEventEmitter listeners set up successfully');
|
|
54
|
+
return () => {
|
|
55
|
+
console.log('CallKitHandler: Cleaning up DeviceEventEmitter listeners');
|
|
56
|
+
incomingCallListener.remove();
|
|
57
|
+
callKitActionListener.remove();
|
|
58
|
+
isCallKitHandlerActive = false;
|
|
59
|
+
};
|
|
60
|
+
}, []);
|
|
61
|
+
const handleIncomingCall = async (eventData) => {
|
|
62
|
+
console.log('CallKitHandler: Handling incoming call', {
|
|
63
|
+
callUUID: eventData.callUUID,
|
|
64
|
+
hasClient: !!voipClient,
|
|
65
|
+
});
|
|
66
|
+
// Store the push notification payload
|
|
67
|
+
await async_storage_1.default.setItem('@push_notification_payload', JSON.stringify(eventData.payload));
|
|
68
|
+
// Mark this call as being processed
|
|
69
|
+
activeCallsRef.current.set(eventData.callUUID, {
|
|
70
|
+
processing: true,
|
|
71
|
+
timestamp: Date.now(),
|
|
72
|
+
});
|
|
73
|
+
// Trigger login required callback if provided
|
|
74
|
+
if (onLoginRequired) {
|
|
75
|
+
onLoginRequired(eventData.payload);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const handleAnswerCall = async (eventData) => {
|
|
79
|
+
console.log('CallKitHandler: User answered call via CallKit', {
|
|
80
|
+
callUUID: eventData.callUUID,
|
|
81
|
+
isTrackedCall: activeCallsRef.current.has(eventData.callUUID),
|
|
82
|
+
});
|
|
83
|
+
// Navigate to dialer after answering
|
|
84
|
+
if (onNavigateToDialer) {
|
|
85
|
+
onNavigateToDialer();
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
router.replace('/dialer');
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const handleEndCall = async (eventData) => {
|
|
92
|
+
console.log('CallKitHandler: User ended call via CallKit', {
|
|
93
|
+
callUUID: eventData.callUUID,
|
|
94
|
+
isTrackedCall: activeCallsRef.current.has(eventData.callUUID),
|
|
95
|
+
});
|
|
96
|
+
// Clean up our local tracking info
|
|
97
|
+
activeCallsRef.current.delete(eventData.callUUID);
|
|
98
|
+
await async_storage_1.default.removeItem('@push_notification_payload');
|
|
99
|
+
// Navigate back after call ends
|
|
100
|
+
if (onNavigateBack) {
|
|
101
|
+
onNavigateBack();
|
|
43
102
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const callKitActionListener = react_native_1.DeviceEventEmitter.addListener(
|
|
47
|
-
'callKitAction',
|
|
48
|
-
async (eventData) => {
|
|
49
|
-
console.log('🔥 CallKitHandler: CallKit action received:', eventData);
|
|
50
|
-
switch (eventData.action) {
|
|
51
|
-
case 'answer':
|
|
52
|
-
await handleAnswerCall(eventData);
|
|
53
|
-
break;
|
|
54
|
-
case 'end':
|
|
55
|
-
await handleEndCall(eventData);
|
|
56
|
-
break;
|
|
103
|
+
else {
|
|
104
|
+
router.replace('/dialer');
|
|
57
105
|
}
|
|
58
|
-
}
|
|
59
|
-
);
|
|
60
|
-
console.log('CallKitHandler: DeviceEventEmitter listeners set up successfully');
|
|
61
|
-
return () => {
|
|
62
|
-
console.log('CallKitHandler: Cleaning up DeviceEventEmitter listeners');
|
|
63
|
-
incomingCallListener.remove();
|
|
64
|
-
callKitActionListener.remove();
|
|
65
|
-
isCallKitHandlerActive = false;
|
|
66
106
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
console.log('CallKitHandler: Handling incoming call', {
|
|
70
|
-
callUUID: eventData.callUUID,
|
|
71
|
-
hasClient: !!voipClient,
|
|
72
|
-
});
|
|
73
|
-
// Store the push notification payload
|
|
74
|
-
await async_storage_1.default.setItem(
|
|
75
|
-
'@push_notification_payload',
|
|
76
|
-
JSON.stringify(eventData.payload)
|
|
77
|
-
);
|
|
78
|
-
// Mark this call as being processed
|
|
79
|
-
activeCallsRef.current.set(eventData.callUUID, {
|
|
80
|
-
processing: true,
|
|
81
|
-
timestamp: Date.now(),
|
|
82
|
-
});
|
|
83
|
-
// Trigger login required callback if provided
|
|
84
|
-
if (onLoginRequired) {
|
|
85
|
-
onLoginRequired(eventData.payload);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
const handleAnswerCall = async (eventData) => {
|
|
89
|
-
console.log('CallKitHandler: User answered call via CallKit', {
|
|
90
|
-
callUUID: eventData.callUUID,
|
|
91
|
-
isTrackedCall: activeCallsRef.current.has(eventData.callUUID),
|
|
92
|
-
});
|
|
93
|
-
// Navigate to dialer after answering
|
|
94
|
-
if (onNavigateToDialer) {
|
|
95
|
-
onNavigateToDialer();
|
|
96
|
-
} else {
|
|
97
|
-
router.replace('/dialer');
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
const handleEndCall = async (eventData) => {
|
|
101
|
-
console.log('CallKitHandler: User ended call via CallKit', {
|
|
102
|
-
callUUID: eventData.callUUID,
|
|
103
|
-
isTrackedCall: activeCallsRef.current.has(eventData.callUUID),
|
|
104
|
-
});
|
|
105
|
-
// Clean up our local tracking info
|
|
106
|
-
activeCallsRef.current.delete(eventData.callUUID);
|
|
107
|
-
await async_storage_1.default.removeItem('@push_notification_payload');
|
|
108
|
-
// Navigate back after call ends
|
|
109
|
-
if (onNavigateBack) {
|
|
110
|
-
onNavigateBack();
|
|
111
|
-
} else {
|
|
112
|
-
router.replace('/dialer');
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
// This component doesn't render anything, it just handles events
|
|
116
|
-
return null;
|
|
107
|
+
// This component doesn't render anything, it just handles events
|
|
108
|
+
return null;
|
|
117
109
|
};
|
|
118
110
|
exports.CallKitHandler = CallKitHandler;
|
|
@@ -9,61 +9,61 @@ import { TelnyxCallState } from '../models/call-state';
|
|
|
9
9
|
* @internal
|
|
10
10
|
*/
|
|
11
11
|
export declare class CallKitManager {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
12
|
+
private _callMappings;
|
|
13
|
+
private _reverseCallMappings;
|
|
14
|
+
private _isEnabled;
|
|
15
|
+
private _callMap?;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Set up CallKit event listeners to handle user actions
|
|
19
|
+
*/
|
|
20
|
+
private _setupCallKitEventListeners;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize CallKit integration
|
|
23
|
+
*/
|
|
24
|
+
initialize(onAnswerCall: (callId: string) => void, onEndCall: (callId: string) => void): void;
|
|
25
|
+
/**
|
|
26
|
+
* Handle outgoing call - start CallKit session
|
|
27
|
+
*/
|
|
28
|
+
handleOutgoingCall(call: Call): Promise<string | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Handle incoming call - show CallKit UI
|
|
31
|
+
*/
|
|
32
|
+
handleIncomingCall(call: Call): Promise<string | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Update call state in CallKit
|
|
35
|
+
*/
|
|
36
|
+
updateCallState(call: Call, state: TelnyxCallState): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* End CallKit session
|
|
39
|
+
*/
|
|
40
|
+
endCall(call: Call): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Handle CallKit answer action
|
|
43
|
+
*/
|
|
44
|
+
private _handleCallKitAnswer;
|
|
45
|
+
/**
|
|
46
|
+
* Handle CallKit end action
|
|
47
|
+
*/
|
|
48
|
+
private _handleCallKitEnd;
|
|
49
|
+
/**
|
|
50
|
+
* Set the call map reference for handling CallKit actions
|
|
51
|
+
*/
|
|
52
|
+
setCallMap(callMap: Map<string, Call>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Check if CallKit is available
|
|
55
|
+
*/
|
|
56
|
+
get isAvailable(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get CallKit UUID for a call
|
|
59
|
+
*/
|
|
60
|
+
getCallKitUUID(callId: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Generate a UUID for CallKit
|
|
63
|
+
*/
|
|
64
|
+
private generateUUID;
|
|
65
|
+
/**
|
|
66
|
+
* Dispose of the CallKit manager
|
|
67
|
+
*/
|
|
68
|
+
dispose(): void;
|
|
69
69
|
}
|