@@ -15,57 +15,9 @@ import {
15
15
ActivityIndicator ,
16
16
Keyboard ,
17
17
I18nManager ,
18
+ Platform ,
18
19
} from 'react-native' ;
19
20
20
- const styles = StyleSheet . create ( {
21
- container : {
22
- marginHorizontal : 16 ,
23
- marginTop : 10 ,
24
- } ,
25
- input : {
26
- height : 50 ,
27
- borderRadius : 6 ,
28
- borderWidth : 1 ,
29
- paddingHorizontal : 10 ,
30
- backgroundColor : 'white' ,
31
- fontSize : 16 ,
32
- } ,
33
- loadingIndicator : {
34
- position : 'absolute' ,
35
- top : '50%' ,
36
- transform : [ { translateY : - 10 } ] ,
37
- } ,
38
- rtlText : {
39
- writingDirection : 'rtl' ,
40
- } ,
41
- suggestionsContainer : {
42
- backgroundColor : '#efeff1' , // default background
43
- borderRadius : 6 ,
44
- marginTop : 3 ,
45
- overflow : 'hidden' ,
46
- maxHeight : 200 ,
47
- } ,
48
- suggestionItem : {
49
- padding : 10 ,
50
- borderBottomWidth : StyleSheet . hairlineWidth ,
51
- borderBottomColor : '#c8c7cc' ,
52
- } ,
53
- mainText : {
54
- fontSize : 16 ,
55
- textAlign : 'left' ,
56
- color : '#000000' ,
57
- } ,
58
- secondaryText : {
59
- fontSize : 14 ,
60
- color : '#666' ,
61
- marginTop : 2 ,
62
- textAlign : 'left' ,
63
- } ,
64
- rightAligned : {
65
- right : 15 ,
66
- } ,
67
- } ) ;
68
-
69
21
const DEFAULT_GOOGLE_API_URL =
70
22
'https://places.googleapis.com/v1/places:autocomplete' ;
71
23
const GooglePlacesTextInput = forwardRef (
@@ -84,6 +36,7 @@ const GooglePlacesTextInput = forwardRef(
84
36
onTextChange,
85
37
debounceDelay = 200 ,
86
38
showLoadingIndicator = true ,
39
+ showClearButton = true ,
87
40
style = { } ,
88
41
} ,
89
42
ref
@@ -267,19 +220,55 @@ const GooglePlacesTextInput = forwardRef(
267
220
< View >
268
221
< TextInput
269
222
ref = { inputRef }
270
- style = { [ styles . input , style . input ] }
223
+ style = { [
224
+ styles . input ,
225
+ style . input ,
226
+ { paddingRight : showClearButton ? 75 : 45 } , // Adjust padding based on clear button visibility
227
+ ] }
271
228
placeholder = { placeHolderText }
272
- placeholderTextColor = { style . placeholder ?. color || '#666666' } // Default color
229
+ placeholderTextColor = { style . placeholder ?. color || '#666666' }
273
230
value = { inputText }
274
231
onChangeText = { handleTextChange }
275
232
onFocus = { handleFocus }
276
233
onBlur = { ( ) => setShowSuggestions ( false ) }
234
+ clearButtonMode = "never" // Disable iOS native clear button
277
235
/>
236
+
237
+ { /* Clear button - shown only if showClearButton is true */ }
238
+ { showClearButton && inputText !== '' && (
239
+ < TouchableOpacity
240
+ style = { [ isRTL ? styles . leftIcon : styles . rightIcon ] }
241
+ onPress = { ( ) => {
242
+ setInputText ( '' ) ;
243
+ setPredictions ( [ ] ) ;
244
+ setShowSuggestions ( false ) ;
245
+ onPlaceSelect ?. ( null ) ;
246
+ onTextChange ?. ( '' ) ;
247
+ inputRef . current ?. focus ( ) ;
248
+ } }
249
+ >
250
+ < Text
251
+ style = { Platform . select ( {
252
+ ios : styles . iOSclearButton ,
253
+ android : styles . androidClearButton ,
254
+ } ) }
255
+ >
256
+ { '×' }
257
+ </ Text >
258
+ </ TouchableOpacity >
259
+ ) }
260
+
261
+ { /* Loading indicator - position adjusts based on showClearButton */ }
278
262
{ loading && showLoadingIndicator && (
279
263
< ActivityIndicator
280
- style = { [ styles . loadingIndicator , styles . rightAligned ] }
264
+ style = { [
265
+ isRTL ? styles . leftLoadingIcon : styles . rightLoadingIcon ,
266
+ ! showClearButton &&
267
+ ( isRTL ? styles . leftEdge : styles . rightEdge ) ,
268
+ styles . loadingIndicator ,
269
+ ] }
281
270
size = { 'small' }
282
- color = { style . loadingIndicator ?. color || '#000000' } // Default color
271
+ color = { style . loadingIndicator ?. color || '#000000' }
283
272
/>
284
273
) }
285
274
</ View >
@@ -289,4 +278,111 @@ const GooglePlacesTextInput = forwardRef(
289
278
}
290
279
) ;
291
280
281
+ const styles = StyleSheet . create ( {
282
+ container : {
283
+ marginHorizontal : 16 ,
284
+ marginTop : 10 ,
285
+ } ,
286
+ input : {
287
+ height : 50 ,
288
+ borderRadius : 6 ,
289
+ borderWidth : 1 ,
290
+ paddingHorizontal : 10 ,
291
+ backgroundColor : 'white' ,
292
+ fontSize : 16 ,
293
+ } ,
294
+ loadingIndicator : {
295
+ position : 'absolute' ,
296
+ top : '50%' ,
297
+ transform : [ { translateY : - 10 } ] ,
298
+ } ,
299
+ rtlText : {
300
+ writingDirection : 'rtl' ,
301
+ } ,
302
+ suggestionsContainer : {
303
+ backgroundColor : '#efeff1' , // default background
304
+ borderRadius : 6 ,
305
+ marginTop : 3 ,
306
+ overflow : 'hidden' ,
307
+ maxHeight : 200 ,
308
+ } ,
309
+ suggestionItem : {
310
+ padding : 10 ,
311
+ borderBottomWidth : StyleSheet . hairlineWidth ,
312
+ borderBottomColor : '#c8c7cc' ,
313
+ } ,
314
+ mainText : {
315
+ fontSize : 16 ,
316
+ textAlign : 'left' ,
317
+ color : '#000000' ,
318
+ } ,
319
+ secondaryText : {
320
+ fontSize : 14 ,
321
+ color : '#666' ,
322
+ marginTop : 2 ,
323
+ textAlign : 'left' ,
324
+ } ,
325
+ rightAligned : {
326
+ right : 15 ,
327
+ } ,
328
+ rightIcon : {
329
+ position : 'absolute' ,
330
+ top : '50%' ,
331
+ transform : [ { translateY : - 13 } ] ,
332
+ right : 12 ,
333
+ padding : 0 ,
334
+ } ,
335
+ leftIcon : {
336
+ position : 'absolute' ,
337
+ top : '50%' ,
338
+ transform : [ { translateY : - 13 } ] ,
339
+ left : 12 ,
340
+ padding : 0 ,
341
+ } ,
342
+ rightLoadingIcon : {
343
+ position : 'absolute' ,
344
+ top : '50%' ,
345
+ transform : [ { translateY : - 10 } ] ,
346
+ right : 45 ,
347
+ } ,
348
+ leftLoadingIcon : {
349
+ position : 'absolute' ,
350
+ top : '50%' ,
351
+ transform : [ { translateY : - 10 } ] ,
352
+ left : 45 ,
353
+ } ,
354
+ rightEdge : {
355
+ right : 12 ,
356
+ } ,
357
+ leftEdge : {
358
+ left : 12 ,
359
+ } ,
360
+ iOSclearButton : {
361
+ fontSize : 18 ,
362
+ fontWeight : '400' ,
363
+ color : 'white' ,
364
+ backgroundColor : '#999' ,
365
+ width : 25 ,
366
+ height : 25 ,
367
+ borderRadius : 12.5 ,
368
+ textAlign : 'center' ,
369
+ textAlignVertical : 'center' ,
370
+ lineHeight : 19 ,
371
+ includeFontPadding : false ,
372
+ } ,
373
+ androidClearButton : {
374
+ fontSize : 24 ,
375
+ fontWeight : '400' ,
376
+ color : 'white' ,
377
+ backgroundColor : '#999' ,
378
+ width : 24 ,
379
+ height : 24 ,
380
+ borderRadius : 12 ,
381
+ textAlign : 'center' ,
382
+ textAlignVertical : 'center' ,
383
+ lineHeight : 20 ,
384
+ includeFontPadding : false ,
385
+ } ,
386
+ } ) ;
387
+
292
388
export default GooglePlacesTextInput ;
0 commit comments