'Set error on textinput if date is below a specified date react native
I am trying to make an age text input for my app that if you are below 18 sets an error state and changes color. Here is my code:
function AgeButton() {
const [age, setAge] = useState('');
const [date, setDate] = useState(new Date(1598051730000));
const [modalVisible, setModalVisible] = useState(false);
const [error, setError] = useState(false);
const {header, modal, bottomModalView} = styles;
const today = new Date()
const minimumAgeYear = today.getFullYear() - 18
const onChange = (event: any, selectedDate: Date) => {
const currentDate = selectedDate || date;
// if (currentDate.getFullYear() > minimumAgeYear) {
// return setError(true);
// }
setDate(currentDate);
setAge(AgeCalculator(date));
};
return (
<View>
<Modal style={bottomModalView} isVisible={modalVisible} backdropOpacity={0} onBackdropPress={() => setModalVisible(false)}>
<View style={modal}>
<DateTimePicker
style={{alignItems: 'center', justifyContent: 'center', height: '70%'}}
testID="dateTimePicker"
value={date}
mode={'date'}
display="spinner"
// @ts-ignore
onChange={onChange}
// maximumDate={new Date(minimumAgeYear, today.getMonth(), today.getDay())}
textColor='#878787'
/>
<Text style={header}>How old are you?</Text>
</View>
</Modal>
<TextInput
onTouchStart={() => setModalVisible(true)}
editable={false}
autoComplete
mode="outlined"
label="Age"
value={age}
onChangeText={age => setAge(age)}
style={{maxHeight: 64, minWidth: '47%', marginRight: 16}}
activeOutlineColor={"#000"}
outlineColor={error ? '#ff3333' : (modalVisible ? "#000" : "#DBDBDB")}
theme={{
colors: {
text: "#000",
placeholder: error ? "#ff3333" : "#878787",
background: "#FFF"
}
}}
/>
</View>
);
}
I have got to the point where I could get the age to error if below 18 however I cannot get it to change if the input changes. Any help in how to do this would be great as originally I tried to just set an maximumDate on the DateTimePicker however this impacts UX as if a user picked their DOB the wrong way round the spinner would not let them
Solution 1:[1]
I just needed to set a turnary operator for the age:
function AgeButton() {
const [age, setAge] = useState('');
const [date, setDate] = useState(new Date(1598051730000));
const [modalVisible, setModalVisible] = useState(false);
const [error, setError] = useState(false);
const {header, modal, bottomModalView} = styles;
const today = new Date()
const onChange = (event: any, selectedDate: Date) => {
const currentDate = selectedDate || date;
age < '18' ? setError(true) : setError(false);
setDate(currentDate);
setAge(AgeCalculator(date));
};
return (
<View>
<Modal style={bottomModalView} isVisible={modalVisible} backdropOpacity={0} onBackdropPress={() => setModalVisible(false)}>
<View style={modal}>
<DateTimePicker
style={{alignItems: 'center', justifyContent: 'center', height: '70%'}}
testID="dateTimePicker"
value={date}
mode={'date'}
display="spinner"
// @ts-ignore
onChange={onChange}
// maximumDate={new Date(minimumAgeYear, today.getMonth(), today.getDay())}
textColor='#878787'
/>
<Text style={header}>How old are you?</Text>
</View>
</Modal>
<TextInput
onTouchStart={() => setModalVisible(true)}
editable={false}
autoComplete
mode="outlined"
label="Age"
value={age}
onChangeText={age => setAge(age)}
style={{maxHeight: 64, minWidth: '47%', marginRight: 16}}
activeOutlineColor={"#000"}
outlineColor={error ? '#ff3333' : (modalVisible ? "#000" : "#DBDBDB")}
theme={{
colors: {
text: error ? "#ff3333" : "#000",
placeholder: error ? "#ff3333" : "#878787",
background: "#FFF"
}
}}
/>
</View>
);
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Oliver Darby |
