Skip to content

Commit 6ef2d31

Browse files
authored
NumberInput - support focus (#2671)
* NumberInput - support focus * Add focus color and fix screen onBlur
1 parent a95c781 commit 6ef2d31

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

demo/src/screens/componentScreens/NumberInputScreen.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ const NumberInputScreen = () => {
161161
}, [label, textStyle, validate, validationMessage]);
162162

163163
return (
164-
<TouchableWithoutFeedback onPress={RNKeyboard.dismiss}>
165-
<View centerH>
164+
<TouchableWithoutFeedback style={{flex: 1}} onPress={RNKeyboard.dismiss}>
165+
<View centerH flex>
166166
<Text text40 margin-s10>
167167
Number Input
168168
</Text>

src/components/numberInput/index.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {isEmpty} from 'lodash';
22
import React, {useMemo, useCallback, useState, useRef} from 'react';
33
import {StyleSheet, StyleProp, ViewStyle, TextStyle} from 'react-native';
4-
import {useDidUpdate, useThemeProps} from 'hooks';
4+
import {useDidUpdate, useThemeProps} from '../../hooks';
5+
import {Colors} from '../../style';
56
import MaskedInput from '../maskedInput/new';
67
import TextField, {TextFieldProps, TextFieldRef} from '../../incubator/TextField';
78
import View from '../view';
@@ -97,6 +98,7 @@ function NumberInput(props: NumberInputProps, ref: any) {
9798
const initialNumber = getInitialNumber(propsInitialNumber, options);
9899
const [data, setData] = useState<NumberInputData>(parseInput(`${initialNumber}`, options, propsInitialNumber));
99100
const textField = useRef<TextFieldRef>();
101+
const [isFocused, setIsFocused] = useState(textFieldProps?.autoFocus ?? false);
100102

101103
useDidUpdate(() => {
102104
setOptions(generateOptions(locale, fractionDigits));
@@ -154,11 +156,19 @@ function NumberInput(props: NumberInputProps, ref: any) {
154156
}, [data]);
155157

156158
const onBlur = useCallback(() => {
159+
setIsFocused(false);
157160
if (textFieldProps?.validateOnBlur) {
158161
textField.current?.validate();
159162
}
160-
},
161-
[textFieldProps?.validateOnBlur]);
163+
}, [textFieldProps?.validateOnBlur]);
164+
165+
const onFocus = useCallback(() => {
166+
setIsFocused(true);
167+
}, []);
168+
169+
const dynamicFieldStyle = useCallback(() => {
170+
return isFocused ? {borderBottomColor: Colors.$outlinePrimary} : undefined;
171+
}, [isFocused]);
162172

163173
const renderNumberInput = useCallback((value?: string) => {
164174
return (
@@ -170,16 +180,18 @@ function NumberInput(props: NumberInputProps, ref: any) {
170180
testID={`${testID}.visual`}
171181
value={value}
172182
formatter={formatter}
183+
dynamicFieldStyle={dynamicFieldStyle}
173184
floatingPlaceholder={false}
174185
leadingAccessory={leadingAccessory}
175186
trailingAccessory={trailingAccessory}
176187
containerStyle={[styles.textFieldContainerStyle, textFieldProps?.containerStyle]}
177188
keyboardType={'numeric'}
189+
autoFocus={false}
178190
/>
179191
</View>
180192
);
181193
},
182-
[containerStyle, formatter, leadingAccessory, textFieldProps, trailingAccessory, testID]);
194+
[containerStyle, dynamicFieldStyle, formatter, leadingAccessory, textFieldProps, trailingAccessory, testID]);
183195

184196
return (
185197
<MaskedInput
@@ -191,7 +203,9 @@ function NumberInput(props: NumberInputProps, ref: any) {
191203
onChangeText={onChangeText}
192204
contextMenuHidden={contextMenuHidden}
193205
onBlur={onBlur}
206+
onFocus={onFocus}
194207
editable={textFieldProps?.editable}
208+
autoFocus={textFieldProps?.autoFocus}
195209
/>
196210
);
197211
}

0 commit comments

Comments
 (0)