@telnyx/react-voice-commons-sdk 0.1.2 → 0.1.4

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 (55) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +469 -483
  3. package/ios/CallKitBridge.swift +2 -7
  4. package/lib/callkit/callkit-coordinator.d.ts +110 -117
  5. package/lib/callkit/callkit-coordinator.js +664 -727
  6. package/lib/callkit/callkit.d.ts +41 -41
  7. package/lib/callkit/callkit.js +252 -242
  8. package/lib/callkit/index.js +15 -47
  9. package/lib/callkit/use-callkit.d.ts +19 -19
  10. package/lib/callkit/use-callkit.js +270 -310
  11. package/lib/context/TelnyxVoiceContext.d.ts +9 -9
  12. package/lib/context/TelnyxVoiceContext.js +10 -13
  13. package/lib/hooks/use-callkit-coordinator.d.ts +9 -17
  14. package/lib/hooks/use-callkit-coordinator.js +45 -50
  15. package/lib/hooks/useAppReadyNotifier.js +13 -15
  16. package/lib/hooks/useAppStateHandler.d.ts +6 -11
  17. package/lib/hooks/useAppStateHandler.js +95 -110
  18. package/lib/hooks/useNetworkStateHandler.d.ts +0 -0
  19. package/lib/hooks/useNetworkStateHandler.js +0 -0
  20. package/lib/index.d.ts +3 -21
  21. package/lib/index.js +50 -201
  22. package/lib/internal/CallKitHandler.d.ts +6 -6
  23. package/lib/internal/CallKitHandler.js +96 -104
  24. package/lib/internal/callkit-manager.d.ts +57 -57
  25. package/lib/internal/callkit-manager.js +299 -316
  26. package/lib/internal/calls/call-state-controller.d.ts +73 -86
  27. package/lib/internal/calls/call-state-controller.js +263 -307
  28. package/lib/internal/session/session-manager.d.ts +71 -75
  29. package/lib/internal/session/session-manager.js +360 -424
  30. package/lib/internal/user-defaults-helpers.js +49 -39
  31. package/lib/internal/voice-pn-bridge.d.ts +114 -12
  32. package/lib/internal/voice-pn-bridge.js +212 -5
  33. package/lib/models/call-state.d.ts +46 -44
  34. package/lib/models/call-state.js +70 -68
  35. package/lib/models/call.d.ts +161 -133
  36. package/lib/models/call.js +454 -382
  37. package/lib/models/config.d.ts +11 -18
  38. package/lib/models/config.js +37 -35
  39. package/lib/models/connection-state.d.ts +10 -10
  40. package/lib/models/connection-state.js +16 -16
  41. package/lib/telnyx-voice-app.d.ts +28 -28
  42. package/lib/telnyx-voice-app.js +513 -480
  43. package/lib/telnyx-voip-client.d.ts +167 -167
  44. package/lib/telnyx-voip-client.js +385 -390
  45. package/package.json +115 -104
  46. package/src/callkit/callkit-coordinator.ts +830 -846
  47. package/src/hooks/useNetworkStateHandler.ts +0 -0
  48. package/src/internal/calls/call-state-controller.ts +407 -384
  49. package/src/internal/session/session-manager.ts +483 -467
  50. package/src/internal/voice-pn-bridge.ts +266 -18
  51. package/src/models/call-state.ts +105 -98
  52. package/src/models/call.ts +502 -388
  53. package/src/telnyx-voice-app.tsx +788 -690
  54. package/src/telnyx-voip-client.ts +551 -539
  55. package/src/types/telnyx-sdk.d.ts +93 -79
@@ -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();