Await alert result before navigating back

This commit is contained in:
Julia Friesel
2019-05-14 13:37:35 +02:00
parent 37564621e0
commit f022fb6b8a
2 changed files with 37 additions and 22 deletions
+11 -6
View File
@@ -7,12 +7,20 @@ import { headerTitles } from '../../../i18n/en/labels'
export default class SymptomView extends Component { export default class SymptomView extends Component {
constructor(props) { constructor(props) {
super() super()
// every specific symptom view provides their own onBackButtonPress method this.backHandler = BackHandler.addEventListener(
this.backHandler = BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPress.bind(this)) 'hardwareBackPress',
this.handleBackButtonPressOnSymptomView.bind(this)
)
this.globalBackhandler = props.handleBackButtonPress this.globalBackhandler = props.handleBackButtonPress
this.date = props.date this.date = props.date
} }
async handleBackButtonPressOnSymptomView() {
// every specific symptom view provides their own onBackButtonPress method
const stopHere = await this.onBackButtonPress()
if (!stopHere) this.globalBackhandler()
}
saveSymptomEntry(entry) { saveSymptomEntry(entry) {
saveSymptom(this.symptomName, this.date, entry) saveSymptom(this.symptomName, this.date, entry)
} }
@@ -31,10 +39,7 @@ export default class SymptomView extends Component {
<Header <Header
title={headerTitles[this.symptomName].toLowerCase()} title={headerTitles[this.symptomName].toLowerCase()}
date={this.date} date={this.date}
goBack={() => { goBack={this.handleBackButtonPressOnSymptomView.bind(this)}
this.onBackButtonPress()
this.globalBackhandler()
}}
deleteEntry={() => { deleteEntry={() => {
this.deleteSymptomEntry() this.deleteSymptomEntry()
this.globalBackhandler() this.globalBackhandler()
+17 -7
View File
@@ -55,13 +55,16 @@ export default class Temp extends SymptomView {
symptomName = 'temperature' symptomName = 'temperature'
onBackButtonPress() { async onBackButtonPress() {
if (typeof this.state.temperature != 'string' || this.state.temperature === '') { if (typeof this.state.temperature != 'string' || this.state.temperature === '') {
this.deleteSymptomEntry() this.deleteSymptomEntry()
return return
} }
this.checkRangeAndSave() const userWantsToSave = await this.warnUserIfTempOutOfRange()
if (!userWantsToSave) return true
this.saveTemperature()
} }
saveTemperature = () => { saveTemperature = () => {
@@ -75,7 +78,7 @@ export default class Temp extends SymptomView {
this.saveSymptomEntry(dataToSave) this.saveSymptomEntry(dataToSave)
} }
checkRangeAndSave = () => { warnUserIfTempOutOfRange = async () => {
const value = Number(this.state.temperature) const value = Number(this.state.temperature)
const { min, max } = config.temperatureScale const { min, max } = config.temperatureScale
const range = { min, max } const range = { min, max }
@@ -88,18 +91,26 @@ export default class Temp extends SymptomView {
warningMsg = labels.outOfRangeWarning warningMsg = labels.outOfRangeWarning
} }
// RN alert runs asynchronously but doesn't provide a callback, so wrap
// it in a promise
return new Promise(resolve => {
if (warningMsg) { if (warningMsg) {
Alert.alert( Alert.alert(
sharedLabels.warning, sharedLabels.warning,
warningMsg, warningMsg,
[ [
{ text: sharedLabels.cancel }, { text: sharedLabels.cancel, onPress: () => {
{ text: sharedLabels.save, onPress: this.saveTemperature} resolve(false)
}},
{ text: sharedLabels.save, onPress: () => {
resolve(true)
}}
] ]
) )
} else { } else {
this.saveTemperature() resolve(true)
} }
})
} }
setTemperature = (temperature) => { setTemperature = (temperature) => {
@@ -136,7 +147,6 @@ export default class Temp extends SymptomView {
onChangeText={this.setTemperature} onChangeText={this.setTemperature}
keyboardType='numeric' keyboardType='numeric'
maxLength={5} maxLength={5}
onBlur={this.checkRange}
/> />
<AppText style={{ marginLeft: 5 }}>°C</AppText> <AppText style={{ marginLeft: 5 }}>°C</AppText>
</View> </View>