@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
@@ -1,49 +1,49 @@
1
1
  export declare enum CallEndReason {
2
- Failed = 1,
3
- RemoteEnded = 2,
4
- Unanswered = 3,
5
- AnsweredElsewhere = 4,
6
- DeclinedElsewhere = 5,
2
+ Failed = 1,
3
+ RemoteEnded = 2,
4
+ Unanswered = 3,
5
+ AnsweredElsewhere = 4,
6
+ DeclinedElsewhere = 5
7
7
  }
8
8
  export interface CallKitEvent {
9
- callUUID: string;
10
- [key: string]: any;
9
+ callUUID: string;
10
+ [key: string]: any;
11
11
  }
12
12
  declare class CallKitManager {
13
- private bridge;
14
- private eventEmitter;
15
- private listeners;
16
- /**
17
- * Normalize UUID to lowercase for consistent handling in React Native
18
- * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
19
- */
20
- private normalizeUUID;
21
- /**
22
- * Denormalize UUID back to uppercase for iOS CallKit bridge calls
23
- * iOS CallKit expects UUIDs in uppercase format
24
- */
25
- private denormalizeUUID;
26
- /**
27
- * Normalize event object by converting callUUID to lowercase
28
- */
29
- private normalizeEvent;
30
- constructor();
31
- private setupEventListeners;
32
- private notifyListeners;
33
- startOutgoingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
34
- reportIncomingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
35
- answerCall(callUUID: string): Promise<boolean>;
36
- endCall(callUUID: string): Promise<boolean>;
37
- reportCallConnected(callUUID: string): Promise<boolean>;
38
- reportCallEnded(callUUID: string, reason?: CallEndReason): Promise<boolean>;
39
- updateCall(callUUID: string, displayName: string, handle: string): Promise<boolean>;
40
- getActiveCalls(): Promise<any[]>;
41
- onStartCall(listener: (event: CallKitEvent) => void): () => void;
42
- onAnswerCall(listener: (event: CallKitEvent) => void): () => void;
43
- onEndCall(listener: (event: CallKitEvent) => void): () => void;
44
- onReceivePush(listener: (event: CallKitEvent) => void): () => void;
45
- generateCallUUID(): string;
46
- isAvailable(): boolean;
13
+ private bridge;
14
+ private eventEmitter;
15
+ private listeners;
16
+ /**
17
+ * Normalize UUID to lowercase for consistent handling in React Native
18
+ * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
19
+ */
20
+ private normalizeUUID;
21
+ /**
22
+ * Denormalize UUID back to uppercase for iOS CallKit bridge calls
23
+ * iOS CallKit expects UUIDs in uppercase format
24
+ */
25
+ private denormalizeUUID;
26
+ /**
27
+ * Normalize event object by converting callUUID to lowercase
28
+ */
29
+ private normalizeEvent;
30
+ constructor();
31
+ private setupEventListeners;
32
+ private notifyListeners;
33
+ startOutgoingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
34
+ reportIncomingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
35
+ answerCall(callUUID: string): Promise<boolean>;
36
+ endCall(callUUID: string): Promise<boolean>;
37
+ reportCallConnected(callUUID: string): Promise<boolean>;
38
+ reportCallEnded(callUUID: string, reason?: CallEndReason): Promise<boolean>;
39
+ updateCall(callUUID: string, displayName: string, handle: string): Promise<boolean>;
40
+ getActiveCalls(): Promise<any[]>;
41
+ onStartCall(listener: (event: CallKitEvent) => void): () => void;
42
+ onAnswerCall(listener: (event: CallKitEvent) => void): () => void;
43
+ onEndCall(listener: (event: CallKitEvent) => void): () => void;
44
+ onReceivePush(listener: (event: CallKitEvent) => void): () => void;
45
+ generateCallUUID(): string;
46
+ isAvailable(): boolean;
47
47
  }
48
48
  export declare const CallKit: CallKitManager;
49
49
  export default CallKit;
@@ -1,251 +1,261 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CallKit = exports.CallEndReason = void 0;
4
- const react_native_1 = require('react-native');
4
+ const react_native_1 = require("react-native");
5
5
  // Call end reasons
6
6
  var CallEndReason;
7
7
  (function (CallEndReason) {
8
- CallEndReason[(CallEndReason['Failed'] = 1)] = 'Failed';
9
- CallEndReason[(CallEndReason['RemoteEnded'] = 2)] = 'RemoteEnded';
10
- CallEndReason[(CallEndReason['Unanswered'] = 3)] = 'Unanswered';
11
- CallEndReason[(CallEndReason['AnsweredElsewhere'] = 4)] = 'AnsweredElsewhere';
12
- CallEndReason[(CallEndReason['DeclinedElsewhere'] = 5)] = 'DeclinedElsewhere';
8
+ CallEndReason[CallEndReason["Failed"] = 1] = "Failed";
9
+ CallEndReason[CallEndReason["RemoteEnded"] = 2] = "RemoteEnded";
10
+ CallEndReason[CallEndReason["Unanswered"] = 3] = "Unanswered";
11
+ CallEndReason[CallEndReason["AnsweredElsewhere"] = 4] = "AnsweredElsewhere";
12
+ CallEndReason[CallEndReason["DeclinedElsewhere"] = 5] = "DeclinedElsewhere";
13
13
  })(CallEndReason || (exports.CallEndReason = CallEndReason = {}));
14
14
  class CallKitManager {
15
- /**
16
- * Normalize UUID to lowercase for consistent handling in React Native
17
- * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
18
- */
19
- normalizeUUID(uuid) {
20
- return uuid.toLowerCase();
21
- }
22
- /**
23
- * Denormalize UUID back to uppercase for iOS CallKit bridge calls
24
- * iOS CallKit expects UUIDs in uppercase format
25
- */
26
- denormalizeUUID(uuid) {
27
- return uuid.toUpperCase();
28
- }
29
- /**
30
- * Normalize event object by converting callUUID to lowercase
31
- */
32
- normalizeEvent(event) {
33
- return {
34
- ...event,
35
- callUUID: this.normalizeUUID(event.callUUID),
36
- };
37
- }
38
- constructor() {
39
- this.bridge = null;
40
- this.eventEmitter = null;
41
- this.listeners = new Map();
42
- if (react_native_1.Platform.OS === 'ios') {
43
- const { CallKitBridge } = react_native_1.NativeModules;
44
- if (CallKitBridge) {
45
- this.bridge = CallKitBridge;
46
- this.eventEmitter = new react_native_1.NativeEventEmitter(CallKitBridge);
47
- this.setupEventListeners();
48
- } else {
49
- console.warn('CallKit: CallKitBridge not available');
50
- }
51
- }
52
- }
53
- setupEventListeners() {
54
- if (!this.eventEmitter) return;
55
- // Listen for CallKit actions - normalize UUIDs to lowercase for React Native
56
- this.eventEmitter.addListener('CallKitDidReceiveStartCallAction', (event) => {
57
- const normalizedEvent = this.normalizeEvent(event);
58
- console.log('CallKit: Received start call action', normalizedEvent);
59
- this.notifyListeners('startCall', normalizedEvent);
60
- });
61
- this.eventEmitter.addListener('CallKitDidPerformAnswerCallAction', (event) => {
62
- const normalizedEvent = this.normalizeEvent(event);
63
- console.log('CallKit: Received answer call action', normalizedEvent);
64
- this.notifyListeners('answerCall', normalizedEvent);
65
- });
66
- this.eventEmitter.addListener('CallKitDidPerformEndCallAction', (event) => {
67
- const normalizedEvent = this.normalizeEvent(event);
68
- console.log('CallKit: Received end call action', normalizedEvent);
69
- this.notifyListeners('endCall', normalizedEvent);
70
- });
71
- this.eventEmitter.addListener('CallKitDidReceivePush', (event) => {
72
- const normalizedEvent = this.normalizeEvent(event);
73
- console.log('CallKit: Received push notification event', normalizedEvent);
74
- this.notifyListeners('receivePush', normalizedEvent);
75
- });
76
- }
77
- notifyListeners(eventType, event) {
78
- const listener = this.listeners.get(eventType);
79
- if (listener) {
80
- listener(event);
81
- }
82
- }
83
- // Public API methods
84
- async startOutgoingCall(callUUID, handle, displayName) {
85
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
86
- console.warn('CallKit: Not available on this platform');
87
- return false;
88
- }
89
- try {
90
- // Convert to uppercase for iOS CallKit bridge
91
- const uppercaseUUID = this.denormalizeUUID(callUUID);
92
- console.log('CallKit: Starting outgoing call', {
93
- callUUID: uppercaseUUID,
94
- handle,
95
- displayName,
96
- });
97
- const result = await this.bridge.startOutgoingCall(uppercaseUUID, handle, displayName);
98
- console.log('CallKit: Outgoing call started successfully', result);
99
- return result.success;
100
- } catch (error) {
101
- console.error('CallKit: Failed to start outgoing call', error);
102
- return false;
103
- }
104
- }
105
- async reportIncomingCall(callUUID, handle, displayName) {
106
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
107
- console.warn('CallKit: Not available on this platform');
108
- return false;
109
- }
110
- try {
111
- // Convert to uppercase for iOS CallKit bridge
112
- const uppercaseUUID = this.denormalizeUUID(callUUID);
113
- console.log('CallKit: Reporting incoming call', {
114
- callUUID: uppercaseUUID,
115
- handle,
116
- displayName,
117
- });
118
- const result = await this.bridge.reportIncomingCall(uppercaseUUID, handle, displayName);
119
- console.log('CallKit: Incoming call reported successfully', result);
120
- return result.success;
121
- } catch (error) {
122
- console.error('CallKit: Failed to report incoming call', error);
123
- return false;
124
- }
125
- }
126
- async answerCall(callUUID) {
127
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
128
- console.warn('CallKit: Not available on this platform');
129
- return false;
130
- }
131
- try {
132
- // Convert to uppercase for iOS CallKit bridge
133
- const uppercaseUUID = this.denormalizeUUID(callUUID);
134
- console.log('CallKit: Answering call', { callUUID: uppercaseUUID });
135
- const result = await this.bridge.answerCall(uppercaseUUID);
136
- console.log('CallKit: Call answered successfully', result);
137
- return result.success;
138
- } catch (error) {
139
- console.error('CallKit: Failed to answer call', error);
140
- return false;
141
- }
142
- }
143
- async endCall(callUUID) {
144
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
145
- console.warn('CallKit: Not available on this platform');
146
- return false;
147
- }
148
- try {
149
- // Convert to uppercase for iOS CallKit bridge
150
- const uppercaseUUID = this.denormalizeUUID(callUUID);
151
- console.log('CallKit: Ending call', { callUUID: uppercaseUUID });
152
- const result = await this.bridge.endCall(uppercaseUUID);
153
- console.log('CallKit: Call ended successfully', result);
154
- return result.success;
155
- } catch (error) {
156
- console.error('CallKit: Failed to end call', error);
157
- return false;
158
- }
159
- }
160
- async reportCallConnected(callUUID) {
161
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
162
- return false;
163
- }
164
- try {
165
- // Convert to uppercase for iOS CallKit bridge
166
- const uppercaseUUID = this.denormalizeUUID(callUUID);
167
- console.log('CallKit: Reporting call connected', { callUUID: uppercaseUUID });
168
- const result = await this.bridge.reportCallConnected(uppercaseUUID);
169
- console.log('CallKit: Call connected reported successfully', result);
170
- return result.success;
171
- } catch (error) {
172
- console.error('CallKit: Failed to report call connected', error);
173
- return false;
174
- }
175
- }
176
- async reportCallEnded(callUUID, reason = CallEndReason.RemoteEnded) {
177
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
178
- return false;
179
- }
180
- try {
181
- // Convert to uppercase for iOS CallKit bridge
182
- const uppercaseUUID = this.denormalizeUUID(callUUID);
183
- console.log('CallKit: Reporting call ended', { callUUID: uppercaseUUID, reason });
184
- const result = await this.bridge.reportCallEnded(uppercaseUUID, reason);
185
- console.log('CallKit: Call ended reported successfully', result);
186
- return result.success;
187
- } catch (error) {
188
- console.error('CallKit: Failed to report call ended', error);
189
- return false;
190
- }
191
- }
192
- async updateCall(callUUID, displayName, handle) {
193
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
194
- return false;
195
- }
196
- try {
197
- // Convert to uppercase for iOS CallKit bridge
198
- const uppercaseUUID = this.denormalizeUUID(callUUID);
199
- console.log('CallKit: Updating call', { callUUID: uppercaseUUID, displayName, handle });
200
- const result = await this.bridge.updateCall(uppercaseUUID, displayName, handle);
201
- console.log('CallKit: Call updated successfully', result);
202
- return result.success;
203
- } catch (error) {
204
- console.error('CallKit: Failed to update call', error);
205
- return false;
206
- }
207
- }
208
- async getActiveCalls() {
209
- if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
210
- return [];
211
- }
212
- try {
213
- const calls = await this.bridge.getActiveCalls();
214
- console.log('CallKit: Active calls retrieved', calls);
215
- return calls;
216
- } catch (error) {
217
- console.error('CallKit: Failed to get active calls', error);
218
- return [];
219
- }
220
- }
221
- // Event listener management
222
- onStartCall(listener) {
223
- this.listeners.set('startCall', listener);
224
- return () => this.listeners.delete('startCall');
225
- }
226
- onAnswerCall(listener) {
227
- this.listeners.set('answerCall', listener);
228
- return () => this.listeners.delete('answerCall');
229
- }
230
- onEndCall(listener) {
231
- this.listeners.set('endCall', listener);
232
- return () => this.listeners.delete('endCall');
233
- }
234
- onReceivePush(listener) {
235
- this.listeners.set('receivePush', listener);
236
- return () => this.listeners.delete('receivePush');
237
- }
238
- // Utility methods
239
- generateCallUUID() {
240
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
241
- const r = (Math.random() * 16) | 0;
242
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
243
- return v.toString(16);
244
- });
245
- }
246
- isAvailable() {
247
- return react_native_1.Platform.OS === 'ios' && this.bridge !== null;
248
- }
15
+ /**
16
+ * Normalize UUID to lowercase for consistent handling in React Native
17
+ * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
18
+ */
19
+ normalizeUUID(uuid) {
20
+ return uuid.toLowerCase();
21
+ }
22
+ /**
23
+ * Denormalize UUID back to uppercase for iOS CallKit bridge calls
24
+ * iOS CallKit expects UUIDs in uppercase format
25
+ */
26
+ denormalizeUUID(uuid) {
27
+ return uuid.toUpperCase();
28
+ }
29
+ /**
30
+ * Normalize event object by converting callUUID to lowercase
31
+ */
32
+ normalizeEvent(event) {
33
+ return {
34
+ ...event,
35
+ callUUID: this.normalizeUUID(event.callUUID),
36
+ };
37
+ }
38
+ constructor() {
39
+ this.bridge = null;
40
+ this.eventEmitter = null;
41
+ this.listeners = new Map();
42
+ if (react_native_1.Platform.OS === 'ios') {
43
+ const { CallKitBridge } = react_native_1.NativeModules;
44
+ if (CallKitBridge) {
45
+ this.bridge = CallKitBridge;
46
+ this.eventEmitter = new react_native_1.NativeEventEmitter(CallKitBridge);
47
+ this.setupEventListeners();
48
+ }
49
+ else {
50
+ console.warn('CallKit: CallKitBridge not available');
51
+ }
52
+ }
53
+ }
54
+ setupEventListeners() {
55
+ if (!this.eventEmitter)
56
+ return;
57
+ // Listen for CallKit actions - normalize UUIDs to lowercase for React Native
58
+ this.eventEmitter.addListener('CallKitDidReceiveStartCallAction', (event) => {
59
+ const normalizedEvent = this.normalizeEvent(event);
60
+ console.log('CallKit: Received start call action', normalizedEvent);
61
+ this.notifyListeners('startCall', normalizedEvent);
62
+ });
63
+ this.eventEmitter.addListener('CallKitDidPerformAnswerCallAction', (event) => {
64
+ const normalizedEvent = this.normalizeEvent(event);
65
+ console.log('CallKit: Received answer call action', normalizedEvent);
66
+ this.notifyListeners('answerCall', normalizedEvent);
67
+ });
68
+ this.eventEmitter.addListener('CallKitDidPerformEndCallAction', (event) => {
69
+ const normalizedEvent = this.normalizeEvent(event);
70
+ console.log('CallKit: Received end call action', normalizedEvent);
71
+ this.notifyListeners('endCall', normalizedEvent);
72
+ });
73
+ this.eventEmitter.addListener('CallKitDidReceivePush', (event) => {
74
+ const normalizedEvent = this.normalizeEvent(event);
75
+ console.log('CallKit: Received push notification event', normalizedEvent);
76
+ this.notifyListeners('receivePush', normalizedEvent);
77
+ });
78
+ }
79
+ notifyListeners(eventType, event) {
80
+ const listener = this.listeners.get(eventType);
81
+ if (listener) {
82
+ listener(event);
83
+ }
84
+ }
85
+ // Public API methods
86
+ async startOutgoingCall(callUUID, handle, displayName) {
87
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
88
+ console.warn('CallKit: Not available on this platform');
89
+ return false;
90
+ }
91
+ try {
92
+ // Convert to uppercase for iOS CallKit bridge
93
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
94
+ console.log('CallKit: Starting outgoing call', {
95
+ callUUID: uppercaseUUID,
96
+ handle,
97
+ displayName,
98
+ });
99
+ const result = await this.bridge.startOutgoingCall(uppercaseUUID, handle, displayName);
100
+ console.log('CallKit: Outgoing call started successfully', result);
101
+ return result.success;
102
+ }
103
+ catch (error) {
104
+ console.error('CallKit: Failed to start outgoing call', error);
105
+ return false;
106
+ }
107
+ }
108
+ async reportIncomingCall(callUUID, handle, displayName) {
109
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
110
+ console.warn('CallKit: Not available on this platform');
111
+ return false;
112
+ }
113
+ try {
114
+ // Convert to uppercase for iOS CallKit bridge
115
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
116
+ console.log('CallKit: Reporting incoming call', {
117
+ callUUID: uppercaseUUID,
118
+ handle,
119
+ displayName,
120
+ });
121
+ const result = await this.bridge.reportIncomingCall(uppercaseUUID, handle, displayName);
122
+ console.log('CallKit: Incoming call reported successfully', result);
123
+ return result.success;
124
+ }
125
+ catch (error) {
126
+ console.error('CallKit: Failed to report incoming call', error);
127
+ return false;
128
+ }
129
+ }
130
+ async answerCall(callUUID) {
131
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
132
+ console.warn('CallKit: Not available on this platform');
133
+ return false;
134
+ }
135
+ try {
136
+ // Convert to uppercase for iOS CallKit bridge
137
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
138
+ console.log('CallKit: Answering call', { callUUID: uppercaseUUID });
139
+ const result = await this.bridge.answerCall(uppercaseUUID);
140
+ console.log('CallKit: Call answered successfully', result);
141
+ return result.success;
142
+ }
143
+ catch (error) {
144
+ console.error('CallKit: Failed to answer call', error);
145
+ return false;
146
+ }
147
+ }
148
+ async endCall(callUUID) {
149
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
150
+ console.warn('CallKit: Not available on this platform');
151
+ return false;
152
+ }
153
+ try {
154
+ // Convert to uppercase for iOS CallKit bridge
155
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
156
+ console.log('CallKit: Ending call', { callUUID: uppercaseUUID });
157
+ const result = await this.bridge.endCall(uppercaseUUID);
158
+ console.log('CallKit: Call ended successfully', result);
159
+ return result.success;
160
+ }
161
+ catch (error) {
162
+ console.error('CallKit: Failed to end call', error);
163
+ return false;
164
+ }
165
+ }
166
+ async reportCallConnected(callUUID) {
167
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
168
+ return false;
169
+ }
170
+ try {
171
+ // Convert to uppercase for iOS CallKit bridge
172
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
173
+ console.log('CallKit: Reporting call connected', { callUUID: uppercaseUUID });
174
+ const result = await this.bridge.reportCallConnected(uppercaseUUID);
175
+ console.log('CallKit: Call connected reported successfully', result);
176
+ return result.success;
177
+ }
178
+ catch (error) {
179
+ console.error('CallKit: Failed to report call connected', error);
180
+ return false;
181
+ }
182
+ }
183
+ async reportCallEnded(callUUID, reason = CallEndReason.RemoteEnded) {
184
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
185
+ return false;
186
+ }
187
+ try {
188
+ // Convert to uppercase for iOS CallKit bridge
189
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
190
+ console.log('CallKit: Reporting call ended', { callUUID: uppercaseUUID, reason });
191
+ const result = await this.bridge.reportCallEnded(uppercaseUUID, reason);
192
+ console.log('CallKit: Call ended reported successfully', result);
193
+ return result.success;
194
+ }
195
+ catch (error) {
196
+ console.error('CallKit: Failed to report call ended', error);
197
+ return false;
198
+ }
199
+ }
200
+ async updateCall(callUUID, displayName, handle) {
201
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
202
+ return false;
203
+ }
204
+ try {
205
+ // Convert to uppercase for iOS CallKit bridge
206
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
207
+ console.log('CallKit: Updating call', { callUUID: uppercaseUUID, displayName, handle });
208
+ const result = await this.bridge.updateCall(uppercaseUUID, displayName, handle);
209
+ console.log('CallKit: Call updated successfully', result);
210
+ return result.success;
211
+ }
212
+ catch (error) {
213
+ console.error('CallKit: Failed to update call', error);
214
+ return false;
215
+ }
216
+ }
217
+ async getActiveCalls() {
218
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
219
+ return [];
220
+ }
221
+ try {
222
+ const calls = await this.bridge.getActiveCalls();
223
+ console.log('CallKit: Active calls retrieved', calls);
224
+ return calls;
225
+ }
226
+ catch (error) {
227
+ console.error('CallKit: Failed to get active calls', error);
228
+ return [];
229
+ }
230
+ }
231
+ // Event listener management
232
+ onStartCall(listener) {
233
+ this.listeners.set('startCall', listener);
234
+ return () => this.listeners.delete('startCall');
235
+ }
236
+ onAnswerCall(listener) {
237
+ this.listeners.set('answerCall', listener);
238
+ return () => this.listeners.delete('answerCall');
239
+ }
240
+ onEndCall(listener) {
241
+ this.listeners.set('endCall', listener);
242
+ return () => this.listeners.delete('endCall');
243
+ }
244
+ onReceivePush(listener) {
245
+ this.listeners.set('receivePush', listener);
246
+ return () => this.listeners.delete('receivePush');
247
+ }
248
+ // Utility methods
249
+ generateCallUUID() {
250
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
251
+ const r = (Math.random() * 16) | 0;
252
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
253
+ return v.toString(16);
254
+ });
255
+ }
256
+ isAvailable() {
257
+ return react_native_1.Platform.OS === 'ios' && this.bridge !== null;
258
+ }
249
259
  }
250
260
  // Export singleton instance
251
261
  exports.CallKit = new CallKitManager();