@@ -20,6 +20,12 @@ const styles = StyleSheet.create({
20
20
marginTop : 20 ,
21
21
marginBottom : 20 ,
22
22
} ,
23
+ callButtons : {
24
+ flexDirection : 'row' ,
25
+ justifyContent : 'space-between' ,
26
+ paddingHorizontal : 30 ,
27
+ width : '100%' ,
28
+ } ,
23
29
logContainer : {
24
30
flex : 3 ,
25
31
width : '100%' ,
@@ -50,17 +56,34 @@ const getRandomNumber = () => String(Math.floor(Math.random() * 100000));
50
56
51
57
export default function App ( ) {
52
58
const [ logText , setLog ] = useState ( '' ) ;
59
+ const [ heldCalls , setHeldCalls ] = useState ( { } ) ; // callKeep uuid: held
60
+ const [ mutedCalls , setMutedCalls ] = useState ( { } ) ; // callKeep uuid: muted
53
61
const [ calls , setCalls ] = useState ( { } ) ; // callKeep uuid: number
54
62
55
63
const log = ( text ) => {
56
64
console . info ( text ) ;
57
65
setLog ( logText + "\n" + text ) ;
58
66
} ;
59
67
60
- const addCall = ( callUUID , number ) => setCalls ( { ...calls , [ callUUID ] : number } ) ;
68
+ const addCall = ( callUUID , number ) => {
69
+ setHeldCalls ( { ...heldCalls , [ callUUID ] : false } ) ;
70
+ setCalls ( { ...calls , [ callUUID ] : number } ) ;
71
+ } ;
72
+
61
73
const removeCall = ( callUUID ) => {
62
74
const { [ callUUID ] : _ , ...updated } = calls ;
75
+ const { [ callUUID ] : __ , ...updatedHeldCalls } = heldCalls ;
76
+
63
77
setCalls ( updated ) ;
78
+ setCalls ( updatedHeldCalls ) ;
79
+ } ;
80
+
81
+ const setCallHeld = ( callUUID , held ) => {
82
+ setHeldCalls ( { ...heldCalls , [ callUUID ] : held } ) ;
83
+ } ;
84
+
85
+ const setCallMuted = ( callUUID , muted ) => {
86
+ setMutedCalls ( { ...mutedCalls , [ callUUID ] : muted } ) ;
64
87
} ;
65
88
66
89
const displayIncomingCall = ( number ) => {
@@ -87,7 +110,11 @@ export default function App() {
87
110
log ( `[answerCall] ${ format ( callUUID ) } , number: ${ number } ` ) ;
88
111
89
112
RNCallKeep . startCall ( callUUID , number , number ) ;
90
- RNCallKeep . setCurrentCallActive ( callUUID ) ;
113
+
114
+ BackgroundTimer . setTimeout ( ( ) => {
115
+ log ( `[setCurrentCallActive] ${ format ( callUUID ) } , number: ${ number } ` ) ;
116
+ RNCallKeep . setCurrentCallActive ( callUUID ) ;
117
+ } , 1000 ) ;
91
118
} ;
92
119
93
120
const didPerformDTMFAction = ( { callUUID, digits } ) => {
@@ -106,23 +133,30 @@ export default function App() {
106
133
log ( `[didReceiveStartCallAction] ${ callUUID } , number: ${ handle } ` ) ;
107
134
108
135
RNCallKeep . startCall ( callUUID , handle , handle ) ;
109
- RNCallKeep . setCurrentCallActive ( callUUID ) ;
136
+
137
+ BackgroundTimer . setTimeout ( ( ) => {
138
+ log ( `[setCurrentCallActive] ${ format ( callUUID ) } , number: ${ handle } ` ) ;
139
+ RNCallKeep . setCurrentCallActive ( callUUID ) ;
140
+ } , 1000 ) ;
110
141
} ;
111
142
112
143
const didPerformSetMutedCallAction = ( { muted, callUUID } ) => {
113
144
const number = calls [ callUUID ] ;
114
145
log ( `[didPerformSetMutedCallAction] ${ format ( callUUID ) } , number: ${ number } (${ muted } )` ) ;
146
+
147
+ setCallMuted ( callUUID , muted ) ;
115
148
} ;
116
149
117
150
const didToggleHoldCallAction = ( { hold, callUUID } ) => {
118
151
const number = calls [ callUUID ] ;
119
152
log ( `[didToggleHoldCallAction] ${ format ( callUUID ) } , number: ${ number } (${ hold } )` ) ;
153
+
154
+ setCallHeld ( callUUID , hold ) ;
120
155
} ;
121
156
122
157
const endCall = ( { callUUID } ) => {
123
158
const handle = calls [ callUUID ] ;
124
159
log ( `[endCall] ${ format ( callUUID ) } , number: ${ handle } ` ) ;
125
- console . log ( 'handle' , handle ) ;
126
160
127
161
removeCall ( callUUID ) ;
128
162
} ;
@@ -132,6 +166,22 @@ export default function App() {
132
166
removeCall ( callUUID ) ;
133
167
} ;
134
168
169
+ const setOnHold = ( callUUID , held ) => {
170
+ const handle = calls [ callUUID ] ;
171
+ RNCallKeep . setOnHold ( callUUID , held ) ;
172
+ log ( `[setOnHold: ${ held } ] ${ format ( callUUID ) } , number: ${ handle } ` ) ;
173
+
174
+ setCallHeld ( callUUID , held ) ;
175
+ } ;
176
+
177
+ const setOnMute = ( callUUID , muted ) => {
178
+ const handle = calls [ callUUID ] ;
179
+ RNCallKeep . setMutedCall ( callUUID , muted ) ;
180
+ log ( `[setMutedCall: ${ muted } ] ${ format ( callUUID ) } , number: ${ handle } ` ) ;
181
+
182
+ setCallMuted ( callUUID , muted ) ;
183
+ } ;
184
+
135
185
useEffect ( ( ) => {
136
186
RNCallKeep . addEventListener ( 'answerCall' , answerCall ) ;
137
187
RNCallKeep . addEventListener ( 'didPerformDTMFAction' , didPerformDTMFAction ) ;
@@ -148,7 +198,7 @@ export default function App() {
148
198
RNCallKeep . removeEventListener ( 'didToggleHoldCallAction' , didToggleHoldCallAction ) ;
149
199
RNCallKeep . removeEventListener ( 'endCall' , endCall ) ;
150
200
}
151
- } ) ;
201
+ } , [ ] ) ;
152
202
153
203
if ( Platform . OS === 'ios' && DeviceInfo . isEmulator ( ) ) {
154
204
return < Text style = { styles . container } > CallKeep doesn't work on iOS emulator</ Text > ;
@@ -165,9 +215,27 @@ export default function App() {
165
215
</ TouchableOpacity >
166
216
167
217
{ Object . keys ( calls ) . map ( callUUID => (
168
- < TouchableOpacity key = { callUUID } onPress = { ( ) => hangup ( callUUID ) } style = { styles . button } hitSlop = { hitSlop } >
169
- < Text > Hangup { calls [ callUUID ] } </ Text >
170
- </ TouchableOpacity >
218
+ < View key = { callUUID } style = { styles . callButtons } >
219
+ < TouchableOpacity
220
+ onPress = { ( ) => setOnHold ( callUUID , ! heldCalls [ callUUID ] ) }
221
+ style = { styles . button }
222
+ hitSlop = { hitSlop }
223
+ >
224
+ < Text > { heldCalls [ callUUID ] ? 'Unhold' : 'Hold' } { calls [ callUUID ] } </ Text >
225
+ </ TouchableOpacity >
226
+
227
+ < TouchableOpacity
228
+ onPress = { ( ) => setOnMute ( callUUID , ! mutedCalls [ callUUID ] ) }
229
+ style = { styles . button }
230
+ hitSlop = { hitSlop }
231
+ >
232
+ < Text > { mutedCalls [ callUUID ] ? 'Unmute' : 'Mute' } { calls [ callUUID ] } </ Text >
233
+ </ TouchableOpacity >
234
+
235
+ < TouchableOpacity onPress = { ( ) => hangup ( callUUID ) } style = { styles . button } hitSlop = { hitSlop } >
236
+ < Text > Hangup { calls [ callUUID ] } </ Text >
237
+ </ TouchableOpacity >
238
+ </ View >
171
239
) ) }
172
240
173
241
< ScrollView style = { styles . logContainer } >
0 commit comments