react-native-telecom 0.0.0-stage → 0.1.1
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/LICENSE +20 -0
- package/README.md +321 -2
- package/Telecom.podspec +20 -0
- package/android/build.gradle +58 -0
- package/android/src/main/AndroidManifest.xml +43 -0
- package/android/src/main/java/com/telecom/CallSession.kt +37 -0
- package/android/src/main/java/com/telecom/CallSessionManager.kt +486 -0
- package/android/src/main/java/com/telecom/TelecomAudioRouter.kt +227 -0
- package/android/src/main/java/com/telecom/TelecomAvatarLoader.kt +77 -0
- package/android/src/main/java/com/telecom/TelecomCallService.kt +395 -0
- package/android/src/main/java/com/telecom/TelecomCallUi.kt +65 -0
- package/android/src/main/java/com/telecom/TelecomInCallActivity.kt +285 -0
- package/android/src/main/java/com/telecom/TelecomIncomingCallActivity.kt +171 -0
- package/android/src/main/java/com/telecom/TelecomModule.kt +189 -0
- package/android/src/main/java/com/telecom/TelecomPackage.kt +31 -0
- package/android/src/main/java/com/telecom/TelecomPushBridge.kt +82 -0
- package/android/src/main/java/com/telecom/TelecomRingtonePlayer.kt +109 -0
- package/android/src/main/java/com/telecom/TelecomUiConfig.kt +27 -0
- package/android/src/main/res/drawable/rn_telecom_action_pill.xml +6 -0
- package/android/src/main/res/drawable/rn_telecom_answer_circle.xml +8 -0
- package/android/src/main/res/drawable/rn_telecom_answer_circle_green.xml +8 -0
- package/android/src/main/res/drawable/rn_telecom_avatar_bg.xml +6 -0
- package/android/src/main/res/drawable/rn_telecom_avatar_circle.xml +12 -0
- package/android/src/main/res/drawable/rn_telecom_btn_answer.xml +6 -0
- package/android/src/main/res/drawable/rn_telecom_btn_decline.xml +6 -0
- package/android/src/main/res/drawable/rn_telecom_btn_message.xml +9 -0
- package/android/src/main/res/drawable/rn_telecom_btn_secondary.xml +6 -0
- package/android/src/main/res/drawable/rn_telecom_control_circle.xml +8 -0
- package/android/src/main/res/drawable/rn_telecom_control_circle_on.xml +8 -0
- package/android/src/main/res/drawable/rn_telecom_decline_circle.xml +8 -0
- package/android/src/main/res/drawable/rn_telecom_ic_call.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_call_end.xml +16 -0
- package/android/src/main/res/drawable/rn_telecom_ic_call_white.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_dialpad.xml +13 -0
- package/android/src/main/res/drawable/rn_telecom_ic_hold.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_message.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_mic.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_mic_off.xml +10 -0
- package/android/src/main/res/drawable/rn_telecom_ic_speaker.xml +10 -0
- package/android/src/main/res/layout/rn_telecom_control_item.xml +36 -0
- package/android/src/main/res/layout/rn_telecom_incall.xml +168 -0
- package/android/src/main/res/layout/rn_telecom_incoming_call.xml +188 -0
- package/ios/Telecom.h +5 -0
- package/ios/Telecom.mm +66 -0
- package/lib/module/NativeTelecom.js +5 -0
- package/lib/module/NativeTelecom.js.map +1 -0
- package/lib/module/index.js +102 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeTelecom.d.ts +40 -0
- package/lib/typescript/src/NativeTelecom.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +104 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +154 -4
- package/src/NativeTelecom.ts +55 -0
- package/src/index.tsx +217 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Pixel / Material You style incoming call.
|
|
4
|
+
Host apps can override via res/layout/rn_telecom_incoming_call.xml
|
|
5
|
+
-->
|
|
6
|
+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
7
|
+
android:id="@+id/rn_telecom_root"
|
|
8
|
+
android:layout_width="match_parent"
|
|
9
|
+
android:layout_height="match_parent"
|
|
10
|
+
android:background="#FFF7F4EF"
|
|
11
|
+
android:fitsSystemWindows="true">
|
|
12
|
+
|
|
13
|
+
<LinearLayout
|
|
14
|
+
android:layout_width="match_parent"
|
|
15
|
+
android:layout_height="match_parent"
|
|
16
|
+
android:gravity="center_horizontal"
|
|
17
|
+
android:orientation="vertical"
|
|
18
|
+
android:paddingLeft="28dp"
|
|
19
|
+
android:paddingRight="28dp"
|
|
20
|
+
android:paddingTop="72dp"
|
|
21
|
+
android:paddingBottom="36dp">
|
|
22
|
+
|
|
23
|
+
<TextView
|
|
24
|
+
android:id="@+id/rn_telecom_caller_name"
|
|
25
|
+
android:layout_width="match_parent"
|
|
26
|
+
android:layout_height="wrap_content"
|
|
27
|
+
android:gravity="center"
|
|
28
|
+
android:textColor="#FF1C1B1F"
|
|
29
|
+
android:textSize="34sp"
|
|
30
|
+
android:textStyle="bold"
|
|
31
|
+
android:maxLines="2"
|
|
32
|
+
android:ellipsize="end" />
|
|
33
|
+
|
|
34
|
+
<TextView
|
|
35
|
+
android:id="@+id/rn_telecom_handle"
|
|
36
|
+
android:layout_width="match_parent"
|
|
37
|
+
android:layout_height="wrap_content"
|
|
38
|
+
android:layout_marginTop="8dp"
|
|
39
|
+
android:gravity="center"
|
|
40
|
+
android:textColor="#FF49454F"
|
|
41
|
+
android:textSize="16sp" />
|
|
42
|
+
|
|
43
|
+
<TextView
|
|
44
|
+
android:id="@+id/rn_telecom_title"
|
|
45
|
+
android:layout_width="wrap_content"
|
|
46
|
+
android:layout_height="wrap_content"
|
|
47
|
+
android:layout_marginTop="4dp"
|
|
48
|
+
android:gravity="center"
|
|
49
|
+
android:text="Incoming call"
|
|
50
|
+
android:textColor="#FF79747E"
|
|
51
|
+
android:textSize="13sp"
|
|
52
|
+
android:visibility="gone" />
|
|
53
|
+
|
|
54
|
+
<View
|
|
55
|
+
android:layout_width="match_parent"
|
|
56
|
+
android:layout_height="0dp"
|
|
57
|
+
android:layout_weight="1" />
|
|
58
|
+
|
|
59
|
+
<FrameLayout
|
|
60
|
+
android:layout_width="168dp"
|
|
61
|
+
android:layout_height="168dp"
|
|
62
|
+
android:background="@drawable/rn_telecom_avatar_circle"
|
|
63
|
+
android:clipToOutline="true">
|
|
64
|
+
|
|
65
|
+
<TextView
|
|
66
|
+
android:id="@+id/rn_telecom_avatar_initials"
|
|
67
|
+
android:layout_width="match_parent"
|
|
68
|
+
android:layout_height="match_parent"
|
|
69
|
+
android:gravity="center"
|
|
70
|
+
android:textColor="#FFFFFFFF"
|
|
71
|
+
android:textSize="56sp"
|
|
72
|
+
android:textStyle="bold" />
|
|
73
|
+
|
|
74
|
+
<ImageView
|
|
75
|
+
android:id="@+id/rn_telecom_avatar_image"
|
|
76
|
+
android:layout_width="match_parent"
|
|
77
|
+
android:layout_height="match_parent"
|
|
78
|
+
android:contentDescription="@null"
|
|
79
|
+
android:scaleType="centerCrop"
|
|
80
|
+
android:visibility="gone" />
|
|
81
|
+
</FrameLayout>
|
|
82
|
+
|
|
83
|
+
<View
|
|
84
|
+
android:layout_width="match_parent"
|
|
85
|
+
android:layout_height="0dp"
|
|
86
|
+
android:layout_weight="1" />
|
|
87
|
+
|
|
88
|
+
<TextView
|
|
89
|
+
android:id="@+id/rn_telecom_message"
|
|
90
|
+
android:layout_width="wrap_content"
|
|
91
|
+
android:layout_height="40dp"
|
|
92
|
+
android:layout_marginBottom="28dp"
|
|
93
|
+
android:background="@drawable/rn_telecom_btn_message"
|
|
94
|
+
android:drawablePadding="8dp"
|
|
95
|
+
android:gravity="center"
|
|
96
|
+
android:paddingLeft="18dp"
|
|
97
|
+
android:paddingRight="18dp"
|
|
98
|
+
android:text="Message"
|
|
99
|
+
android:textAllCaps="false"
|
|
100
|
+
android:textColor="#FF1C1B1F"
|
|
101
|
+
android:textSize="14sp" />
|
|
102
|
+
|
|
103
|
+
<!-- Bottom: Decline (red) + Answer (green) — tap only -->
|
|
104
|
+
<LinearLayout
|
|
105
|
+
android:id="@+id/rn_telecom_action_bar"
|
|
106
|
+
android:layout_width="match_parent"
|
|
107
|
+
android:layout_height="wrap_content"
|
|
108
|
+
android:gravity="center"
|
|
109
|
+
android:orientation="horizontal"
|
|
110
|
+
android:paddingLeft="12dp"
|
|
111
|
+
android:paddingRight="12dp">
|
|
112
|
+
|
|
113
|
+
<LinearLayout
|
|
114
|
+
android:id="@+id/rn_telecom_decline"
|
|
115
|
+
android:layout_width="0dp"
|
|
116
|
+
android:layout_height="wrap_content"
|
|
117
|
+
android:layout_weight="1"
|
|
118
|
+
android:gravity="center"
|
|
119
|
+
android:orientation="vertical"
|
|
120
|
+
android:clickable="true"
|
|
121
|
+
android:focusable="true"
|
|
122
|
+
android:background="?android:attr/selectableItemBackgroundBorderless"
|
|
123
|
+
android:paddingTop="8dp"
|
|
124
|
+
android:paddingBottom="8dp">
|
|
125
|
+
|
|
126
|
+
<FrameLayout
|
|
127
|
+
android:layout_width="72dp"
|
|
128
|
+
android:layout_height="72dp"
|
|
129
|
+
android:background="@drawable/rn_telecom_decline_circle">
|
|
130
|
+
|
|
131
|
+
<ImageView
|
|
132
|
+
android:layout_width="32dp"
|
|
133
|
+
android:layout_height="32dp"
|
|
134
|
+
android:layout_gravity="center"
|
|
135
|
+
android:contentDescription="@null"
|
|
136
|
+
android:src="@drawable/rn_telecom_ic_call_end"
|
|
137
|
+
android:importantForAccessibility="no" />
|
|
138
|
+
</FrameLayout>
|
|
139
|
+
|
|
140
|
+
<TextView
|
|
141
|
+
android:id="@+id/rn_telecom_decline_label"
|
|
142
|
+
android:layout_width="wrap_content"
|
|
143
|
+
android:layout_height="wrap_content"
|
|
144
|
+
android:layout_marginTop="10dp"
|
|
145
|
+
android:text="Decline"
|
|
146
|
+
android:textColor="#FF1C1B1F"
|
|
147
|
+
android:textSize="14sp" />
|
|
148
|
+
</LinearLayout>
|
|
149
|
+
|
|
150
|
+
<LinearLayout
|
|
151
|
+
android:id="@+id/rn_telecom_answer"
|
|
152
|
+
android:layout_width="0dp"
|
|
153
|
+
android:layout_height="wrap_content"
|
|
154
|
+
android:layout_weight="1"
|
|
155
|
+
android:gravity="center"
|
|
156
|
+
android:orientation="vertical"
|
|
157
|
+
android:clickable="true"
|
|
158
|
+
android:focusable="true"
|
|
159
|
+
android:background="?android:attr/selectableItemBackgroundBorderless"
|
|
160
|
+
android:paddingTop="8dp"
|
|
161
|
+
android:paddingBottom="8dp">
|
|
162
|
+
|
|
163
|
+
<FrameLayout
|
|
164
|
+
android:layout_width="72dp"
|
|
165
|
+
android:layout_height="72dp"
|
|
166
|
+
android:background="@drawable/rn_telecom_answer_circle_green">
|
|
167
|
+
|
|
168
|
+
<ImageView
|
|
169
|
+
android:layout_width="32dp"
|
|
170
|
+
android:layout_height="32dp"
|
|
171
|
+
android:layout_gravity="center"
|
|
172
|
+
android:contentDescription="@null"
|
|
173
|
+
android:src="@drawable/rn_telecom_ic_call_white"
|
|
174
|
+
android:importantForAccessibility="no" />
|
|
175
|
+
</FrameLayout>
|
|
176
|
+
|
|
177
|
+
<TextView
|
|
178
|
+
android:id="@+id/rn_telecom_answer_label"
|
|
179
|
+
android:layout_width="wrap_content"
|
|
180
|
+
android:layout_height="wrap_content"
|
|
181
|
+
android:layout_marginTop="10dp"
|
|
182
|
+
android:text="Answer"
|
|
183
|
+
android:textColor="#FF1C1B1F"
|
|
184
|
+
android:textSize="14sp" />
|
|
185
|
+
</LinearLayout>
|
|
186
|
+
</LinearLayout>
|
|
187
|
+
</LinearLayout>
|
|
188
|
+
</FrameLayout>
|
package/ios/Telecom.h
ADDED
package/ios/Telecom.mm
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#import "Telecom.h"
|
|
2
|
+
|
|
3
|
+
@implementation Telecom
|
|
4
|
+
|
|
5
|
+
- (void)setup:(NSDictionary *)options
|
|
6
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
7
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
8
|
+
{
|
|
9
|
+
reject(@"E_IOS_UNSUPPORTED", @"react-native-telecom v0.x supports Android only. iOS CallKit is coming later.", nil);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
- (void)displayIncomingCall:(NSString *)uuid
|
|
13
|
+
handle:(NSString *)handle
|
|
14
|
+
callerName:(NSString *)callerName
|
|
15
|
+
hasVideo:(BOOL)hasVideo
|
|
16
|
+
autoAnswer:(BOOL)autoAnswer
|
|
17
|
+
{
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
- (void)startCall:(NSString *)uuid
|
|
21
|
+
handle:(NSString *)handle
|
|
22
|
+
callerName:(NSString *)callerName
|
|
23
|
+
hasVideo:(BOOL)hasVideo
|
|
24
|
+
{
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
- (void)answerCall:(NSString *)uuid
|
|
28
|
+
{
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
- (void)endCall:(NSString *)uuid
|
|
32
|
+
{
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (void)endAllCalls
|
|
36
|
+
{
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
- (void)setMuted:(NSString *)uuid muted:(BOOL)muted
|
|
40
|
+
{
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (void)setOnHold:(NSString *)uuid hold:(BOOL)hold
|
|
44
|
+
{
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
- (void)addListener:(NSString *)eventName
|
|
48
|
+
{
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
- (void)removeListeners:(double)count
|
|
52
|
+
{
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
56
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
57
|
+
{
|
|
58
|
+
return std::make_shared<facebook::react::NativeTelecomSpecJSI>(params);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
+ (NSString *)moduleName
|
|
62
|
+
{
|
|
63
|
+
return @"Telecom";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeTelecom.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAsDpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
|
|
4
|
+
import NativeTelecom from "./NativeTelecom.js";
|
|
5
|
+
const isAndroid = Platform.OS === 'android';
|
|
6
|
+
const emitter = new NativeEventEmitter(NativeModules.Telecom ?? NativeTelecom);
|
|
7
|
+
function assertAndroid() {
|
|
8
|
+
if (!isAndroid) {
|
|
9
|
+
throw new Error('react-native-telecom: Android Jetpack Core-Telecom only in v0.x. iOS CallKit support is coming later.');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function setup(options = {}) {
|
|
13
|
+
assertAndroid();
|
|
14
|
+
return NativeTelecom.setup({
|
|
15
|
+
appName: options.appName ?? 'App',
|
|
16
|
+
supportsVideo: options.supportsVideo ?? true,
|
|
17
|
+
ui: options.ui
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function displayIncomingCall(uuid, handle, callerName, hasVideo = false, autoAnswer = false, avatarUrl = '') {
|
|
21
|
+
assertAndroid();
|
|
22
|
+
NativeTelecom.displayIncomingCall(uuid, handle, callerName, hasVideo, autoAnswer, avatarUrl);
|
|
23
|
+
}
|
|
24
|
+
export function startCall(uuid, handle, callerName, hasVideo = false, avatarUrl = '') {
|
|
25
|
+
assertAndroid();
|
|
26
|
+
NativeTelecom.startCall(uuid, handle, callerName, hasVideo, avatarUrl);
|
|
27
|
+
}
|
|
28
|
+
export function answerCall(uuid) {
|
|
29
|
+
assertAndroid();
|
|
30
|
+
NativeTelecom.answerCall(uuid);
|
|
31
|
+
}
|
|
32
|
+
export function endCall(uuid) {
|
|
33
|
+
assertAndroid();
|
|
34
|
+
NativeTelecom.endCall(uuid);
|
|
35
|
+
}
|
|
36
|
+
export function endAllCalls() {
|
|
37
|
+
assertAndroid();
|
|
38
|
+
NativeTelecom.endAllCalls();
|
|
39
|
+
}
|
|
40
|
+
export function setMuted(uuid, muted) {
|
|
41
|
+
assertAndroid();
|
|
42
|
+
NativeTelecom.setMuted(uuid, muted);
|
|
43
|
+
}
|
|
44
|
+
export function setOnHold(uuid, hold) {
|
|
45
|
+
assertAndroid();
|
|
46
|
+
NativeTelecom.setOnHold(uuid, hold);
|
|
47
|
+
}
|
|
48
|
+
export function setAudioRoute(uuid, route) {
|
|
49
|
+
assertAndroid();
|
|
50
|
+
NativeTelecom.setAudioRoute(uuid, route);
|
|
51
|
+
}
|
|
52
|
+
export async function getAvailableAudioRoutes() {
|
|
53
|
+
assertAndroid();
|
|
54
|
+
const routes = await NativeTelecom.getAvailableAudioRoutes();
|
|
55
|
+
return routes;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Local DTMF beep + `dtmfTone` event — forward digits in your signaling/WebRTC. */
|
|
59
|
+
export function sendDtmf(uuid, digits) {
|
|
60
|
+
assertAndroid();
|
|
61
|
+
NativeTelecom.sendDtmf(uuid, digits);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Handle an FCM / push data map from JS (foreground).
|
|
66
|
+
* For killed-state, call `TelecomPushBridge` from your native MessagingService.
|
|
67
|
+
*/
|
|
68
|
+
export async function handlePushMessage(data) {
|
|
69
|
+
assertAndroid();
|
|
70
|
+
return NativeTelecom.handlePushMessage(data);
|
|
71
|
+
}
|
|
72
|
+
export function addEventListener(eventName, listener) {
|
|
73
|
+
assertAndroid();
|
|
74
|
+
return emitter.addListener(eventName, event => {
|
|
75
|
+
listener(event);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export function removeAllListeners(eventName) {
|
|
79
|
+
if (eventName) {
|
|
80
|
+
emitter.removeAllListeners(eventName);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
['answerCall', 'endCall', 'didDisplayIncomingCall', 'didChangeHoldState', 'didChangeMuteState', 'didChangeSpeaker', 'didChangeAudioRoute', 'didActivateAudioSession', 'didDeactivateAudioSession', 'dtmfTone'].forEach(name => emitter.removeAllListeners(name));
|
|
84
|
+
}
|
|
85
|
+
const Telecom = {
|
|
86
|
+
setup,
|
|
87
|
+
displayIncomingCall,
|
|
88
|
+
startCall,
|
|
89
|
+
answerCall,
|
|
90
|
+
endCall,
|
|
91
|
+
endAllCalls,
|
|
92
|
+
setMuted,
|
|
93
|
+
setOnHold,
|
|
94
|
+
setAudioRoute,
|
|
95
|
+
getAvailableAudioRoutes,
|
|
96
|
+
sendDtmf,
|
|
97
|
+
handlePushMessage,
|
|
98
|
+
addEventListener,
|
|
99
|
+
removeAllListeners
|
|
100
|
+
};
|
|
101
|
+
export default Telecom;
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","Platform","NativeTelecom","isAndroid","OS","emitter","Telecom","assertAndroid","Error","setup","options","appName","supportsVideo","ui","displayIncomingCall","uuid","handle","callerName","hasVideo","autoAnswer","avatarUrl","startCall","answerCall","endCall","endAllCalls","setMuted","muted","setOnHold","hold","setAudioRoute","route","getAvailableAudioRoutes","routes","sendDtmf","digits","handlePushMessage","data","addEventListener","eventName","listener","addListener","event","removeAllListeners","forEach","name"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type TurboModule } from 'react-native';
|
|
2
|
+
export type TelecomSetupOptions = {
|
|
3
|
+
appName?: string;
|
|
4
|
+
supportsVideo?: boolean;
|
|
5
|
+
/** Customize the full-screen incoming host Activity (not the CallStyle notification). */
|
|
6
|
+
ui?: {
|
|
7
|
+
incomingTitle?: string;
|
|
8
|
+
answerLabel?: string;
|
|
9
|
+
declineLabel?: string;
|
|
10
|
+
/** Hex colors e.g. `#000000`, `#43A047` */
|
|
11
|
+
backgroundColor?: string;
|
|
12
|
+
titleColor?: string;
|
|
13
|
+
nameColor?: string;
|
|
14
|
+
handleColor?: string;
|
|
15
|
+
answerColor?: string;
|
|
16
|
+
declineColor?: string;
|
|
17
|
+
/** Default true. Set false for notification-only (native CallStyle). */
|
|
18
|
+
launchFullScreenOnIncoming?: boolean;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export type TelecomAudioRoute = 'earpiece' | 'speaker' | 'bluetooth';
|
|
22
|
+
export interface Spec extends TurboModule {
|
|
23
|
+
setup(options: Object): Promise<boolean>;
|
|
24
|
+
displayIncomingCall(uuid: string, handle: string, callerName: string, hasVideo: boolean, autoAnswer: boolean, avatarUrl: string): void;
|
|
25
|
+
startCall(uuid: string, handle: string, callerName: string, hasVideo: boolean, avatarUrl: string): void;
|
|
26
|
+
answerCall(uuid: string): void;
|
|
27
|
+
endCall(uuid: string): void;
|
|
28
|
+
endAllCalls(): void;
|
|
29
|
+
setMuted(uuid: string, muted: boolean): void;
|
|
30
|
+
setOnHold(uuid: string, hold: boolean): void;
|
|
31
|
+
setAudioRoute(uuid: string, route: string): void;
|
|
32
|
+
getAvailableAudioRoutes(): Promise<Object>;
|
|
33
|
+
sendDtmf(uuid: string, digits: string): void;
|
|
34
|
+
handlePushMessage(data: Object): Promise<boolean>;
|
|
35
|
+
addListener(eventName: string): void;
|
|
36
|
+
removeListeners(count: number): void;
|
|
37
|
+
}
|
|
38
|
+
declare const _default: Spec;
|
|
39
|
+
export default _default;
|
|
40
|
+
//# sourceMappingURL=NativeTelecom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeTelecom.d.ts","sourceRoot":"","sources":["../../../src/NativeTelecom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,EAAE,CAAC,EAAE;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,2CAA2C;QAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,wEAAwE;QACxE,0BAA0B,CAAC,EAAE,OAAO,CAAC;KACtC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAAC;IACR,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAAC;IACR,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,IAAI,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAiE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type EmitterSubscription } from 'react-native';
|
|
2
|
+
import { type TelecomAudioRoute, type TelecomSetupOptions } from './NativeTelecom.js';
|
|
3
|
+
export type { TelecomAudioRoute, TelecomSetupOptions };
|
|
4
|
+
export type TelecomAudioRouteInfo = {
|
|
5
|
+
id: TelecomAudioRoute;
|
|
6
|
+
name: string;
|
|
7
|
+
available: boolean;
|
|
8
|
+
selected: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type TelecomEvents = {
|
|
11
|
+
answerCall: {
|
|
12
|
+
callUUID: string;
|
|
13
|
+
};
|
|
14
|
+
endCall: {
|
|
15
|
+
callUUID: string;
|
|
16
|
+
};
|
|
17
|
+
didDisplayIncomingCall: {
|
|
18
|
+
callUUID: string;
|
|
19
|
+
handle: string;
|
|
20
|
+
callerName: string;
|
|
21
|
+
hasVideo: boolean;
|
|
22
|
+
direction: 'incoming' | 'outgoing';
|
|
23
|
+
avatarUrl?: string;
|
|
24
|
+
};
|
|
25
|
+
didChangeHoldState: {
|
|
26
|
+
callUUID: string;
|
|
27
|
+
hold: boolean;
|
|
28
|
+
};
|
|
29
|
+
didChangeMuteState: {
|
|
30
|
+
callUUID: string;
|
|
31
|
+
muted: boolean;
|
|
32
|
+
};
|
|
33
|
+
didChangeSpeaker: {
|
|
34
|
+
callUUID: string;
|
|
35
|
+
speakerOn: boolean;
|
|
36
|
+
};
|
|
37
|
+
didChangeAudioRoute: {
|
|
38
|
+
callUUID: string;
|
|
39
|
+
route: TelecomAudioRoute;
|
|
40
|
+
};
|
|
41
|
+
didActivateAudioSession: {
|
|
42
|
+
callUUID: string;
|
|
43
|
+
route: TelecomAudioRoute;
|
|
44
|
+
};
|
|
45
|
+
didDeactivateAudioSession: {
|
|
46
|
+
callUUID?: string;
|
|
47
|
+
};
|
|
48
|
+
dtmfTone: {
|
|
49
|
+
callUUID: string;
|
|
50
|
+
digit: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type TelecomEventName = keyof TelecomEvents;
|
|
54
|
+
export type TelecomPushPayload = {
|
|
55
|
+
uuid?: string;
|
|
56
|
+
callUUID?: string;
|
|
57
|
+
handle?: string;
|
|
58
|
+
number?: string;
|
|
59
|
+
callerName?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
hasVideo?: boolean | string;
|
|
62
|
+
autoAnswer?: boolean | string;
|
|
63
|
+
avatarUrl?: string;
|
|
64
|
+
avatar?: string;
|
|
65
|
+
type?: string;
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
};
|
|
68
|
+
export declare function setup(options?: TelecomSetupOptions): Promise<boolean>;
|
|
69
|
+
export declare function displayIncomingCall(uuid: string, handle: string, callerName: string, hasVideo?: boolean, autoAnswer?: boolean, avatarUrl?: string): void;
|
|
70
|
+
export declare function startCall(uuid: string, handle: string, callerName: string, hasVideo?: boolean, avatarUrl?: string): void;
|
|
71
|
+
export declare function answerCall(uuid: string): void;
|
|
72
|
+
export declare function endCall(uuid: string): void;
|
|
73
|
+
export declare function endAllCalls(): void;
|
|
74
|
+
export declare function setMuted(uuid: string, muted: boolean): void;
|
|
75
|
+
export declare function setOnHold(uuid: string, hold: boolean): void;
|
|
76
|
+
export declare function setAudioRoute(uuid: string, route: TelecomAudioRoute): void;
|
|
77
|
+
export declare function getAvailableAudioRoutes(): Promise<TelecomAudioRouteInfo[]>;
|
|
78
|
+
/** Local DTMF beep + `dtmfTone` event — forward digits in your signaling/WebRTC. */
|
|
79
|
+
export declare function sendDtmf(uuid: string, digits: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Handle an FCM / push data map from JS (foreground).
|
|
82
|
+
* For killed-state, call `TelecomPushBridge` from your native MessagingService.
|
|
83
|
+
*/
|
|
84
|
+
export declare function handlePushMessage(data: TelecomPushPayload): Promise<boolean>;
|
|
85
|
+
export declare function addEventListener<E extends TelecomEventName>(eventName: E, listener: (event: TelecomEvents[E]) => void): EmitterSubscription;
|
|
86
|
+
export declare function removeAllListeners(eventName?: TelecomEventName): void;
|
|
87
|
+
declare const Telecom: {
|
|
88
|
+
setup: typeof setup;
|
|
89
|
+
displayIncomingCall: typeof displayIncomingCall;
|
|
90
|
+
startCall: typeof startCall;
|
|
91
|
+
answerCall: typeof answerCall;
|
|
92
|
+
endCall: typeof endCall;
|
|
93
|
+
endAllCalls: typeof endAllCalls;
|
|
94
|
+
setMuted: typeof setMuted;
|
|
95
|
+
setOnHold: typeof setOnHold;
|
|
96
|
+
setAudioRoute: typeof setAudioRoute;
|
|
97
|
+
getAvailableAudioRoutes: typeof getAvailableAudioRoutes;
|
|
98
|
+
sendDtmf: typeof sendDtmf;
|
|
99
|
+
handlePushMessage: typeof handlePushMessage;
|
|
100
|
+
addEventListener: typeof addEventListener;
|
|
101
|
+
removeAllListeners: typeof removeAllListeners;
|
|
102
|
+
};
|
|
103
|
+
export default Telecom;
|
|
104
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
|