@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.
Files changed (58) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/TelnyxVoiceCommons.podspec +31 -31
  3. package/ios/CallKitBridge.m +43 -43
  4. package/ios/CallKitBridge.swift +874 -879
  5. package/ios/VoicePnBridge.m +30 -30
  6. package/ios/VoicePnBridge.swift +86 -86
  7. package/lib/callkit/callkit-coordinator.d.ts +110 -117
  8. package/lib/callkit/callkit-coordinator.js +664 -727
  9. package/lib/callkit/callkit.d.ts +41 -41
  10. package/lib/callkit/callkit.js +252 -242
  11. package/lib/callkit/index.js +15 -47
  12. package/lib/callkit/use-callkit.d.ts +19 -19
  13. package/lib/callkit/use-callkit.js +270 -310
  14. package/lib/context/TelnyxVoiceContext.d.ts +9 -9
  15. package/lib/context/TelnyxVoiceContext.js +10 -13
  16. package/lib/hooks/use-callkit-coordinator.d.ts +9 -17
  17. package/lib/hooks/use-callkit-coordinator.js +45 -50
  18. package/lib/hooks/useAppReadyNotifier.js +13 -15
  19. package/lib/hooks/useAppStateHandler.d.ts +6 -11
  20. package/lib/hooks/useAppStateHandler.js +95 -110
  21. package/lib/hooks/useNetworkStateHandler.d.ts +0 -0
  22. package/lib/hooks/useNetworkStateHandler.js +0 -0
  23. package/lib/index.d.ts +3 -21
  24. package/lib/index.js +50 -201
  25. package/lib/internal/CallKitHandler.d.ts +6 -6
  26. package/lib/internal/CallKitHandler.js +96 -104
  27. package/lib/internal/callkit-manager.d.ts +57 -57
  28. package/lib/internal/callkit-manager.js +299 -316
  29. package/lib/internal/calls/call-state-controller.d.ts +73 -86
  30. package/lib/internal/calls/call-state-controller.js +263 -307
  31. package/lib/internal/session/session-manager.d.ts +71 -75
  32. package/lib/internal/session/session-manager.js +360 -424
  33. package/lib/internal/user-defaults-helpers.js +49 -39
  34. package/lib/internal/voice-pn-bridge.d.ts +114 -12
  35. package/lib/internal/voice-pn-bridge.js +212 -5
  36. package/lib/models/call-state.d.ts +46 -44
  37. package/lib/models/call-state.js +70 -68
  38. package/lib/models/call.d.ts +161 -133
  39. package/lib/models/call.js +454 -382
  40. package/lib/models/config.d.ts +11 -18
  41. package/lib/models/config.js +37 -35
  42. package/lib/models/connection-state.d.ts +10 -10
  43. package/lib/models/connection-state.js +16 -16
  44. package/lib/telnyx-voice-app.d.ts +28 -28
  45. package/lib/telnyx-voice-app.js +463 -481
  46. package/lib/telnyx-voip-client.d.ts +167 -167
  47. package/lib/telnyx-voip-client.js +385 -390
  48. package/package.json +11 -4
  49. package/src/callkit/callkit-coordinator.ts +18 -34
  50. package/src/hooks/useNetworkStateHandler.ts +0 -0
  51. package/src/internal/calls/call-state-controller.ts +81 -58
  52. package/src/internal/session/session-manager.ts +42 -26
  53. package/src/internal/voice-pn-bridge.ts +250 -2
  54. package/src/models/call-state.ts +8 -1
  55. package/src/models/call.ts +119 -5
  56. package/src/telnyx-voice-app.tsx +87 -40
  57. package/src/telnyx-voip-client.ts +15 -3
  58. package/src/types/telnyx-sdk.d.ts +16 -2
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';
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
- (this && this.__createBinding) ||
14
- (Object.create
15
- ? function (o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- var desc = Object.getOwnPropertyDescriptor(m, k);
18
- if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
- desc = {
20
- enumerable: true,
21
- get: function () {
22
- return m[k];
23
- },
24
- };
25
- }
26
- Object.defineProperty(o, k2, desc);
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('./telnyx-voip-client');
66
- Object.defineProperty(exports, 'TelnyxVoipClient', {
67
- enumerable: true,
68
- get: function () {
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('./telnyx-voice-app');
86
- Object.defineProperty(exports, 'TelnyxVoiceApp', {
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('./hooks/useAppStateHandler');
94
- Object.defineProperty(exports, 'useAppStateHandler', {
95
- enumerable: true,
96
- get: function () {
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('./models/call');
109
- Object.defineProperty(exports, 'Call', {
110
- enumerable: true,
111
- get: function () {
112
- return call_1.Call;
113
- },
114
- });
115
- var connection_state_1 = require('./models/connection-state');
116
- Object.defineProperty(exports, 'TelnyxConnectionState', {
117
- enumerable: true,
118
- get: function () {
119
- return connection_state_1.TelnyxConnectionState;
120
- },
121
- });
122
- Object.defineProperty(exports, 'isTelnyxConnectionState', {
123
- enumerable: true,
124
- get: function () {
125
- return connection_state_1.isTelnyxConnectionState;
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('./callkit'), exports);
63
+ __exportStar(require("./callkit"), exports);
210
64
  // Export hooks
211
- var useAppReadyNotifier_1 = require('./hooks/useAppReadyNotifier');
212
- Object.defineProperty(exports, 'useAppReadyNotifier', {
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
- /** 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;
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
- 'use strict';
2
- var __importDefault =
3
- (this && this.__importDefault) ||
4
- function (mod) {
5
- return mod && mod.__esModule ? mod : { default: mod };
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('react');
10
- const react_native_1 = require('react-native');
11
- const expo_router_1 = require('expo-router');
12
- const async_storage_1 = __importDefault(require('@react-native-async-storage/async-storage'));
13
- const TelnyxVoiceContext_1 = require('../context/TelnyxVoiceContext');
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
- const router = (0, expo_router_1.useRouter)();
24
- const { voipClient } = (0, TelnyxVoiceContext_1.useTelnyxVoice)();
25
- // Store active calls by CallKit UUID for coordination
26
- const activeCallsRef = (0, react_1.useRef)(new Map());
27
- (0, react_1.useEffect)(() => {
28
- if (react_native_1.Platform.OS !== 'ios') return;
29
- if (isCallKitHandlerActive) {
30
- console.log('CallKitHandler: Another instance is already active, skipping setup');
31
- return;
32
- }
33
- isCallKitHandlerActive = true;
34
- console.log('CallKitHandler: Setting up DeviceEventEmitter listeners (singleton instance)...');
35
- react_native_1.DeviceEventEmitter.removeAllListeners('incomingVoIPCall');
36
- react_native_1.DeviceEventEmitter.removeAllListeners('callKitAction');
37
- const incomingCallListener = react_native_1.DeviceEventEmitter.addListener(
38
- 'incomingVoIPCall',
39
- async (eventData) => {
40
- console.log('🔥 CallKitHandler: Incoming VoIP call received:', eventData);
41
- if (eventData.action === 'connect_webrtc') {
42
- await handleIncomingCall(eventData);
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
- const handleIncomingCall = async (eventData) => {
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
- 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;
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
  }