Merge branch '371-bug-back-navigation-doesn-t-wait-for-temperature-range-warning' into 'master'

Await alert result before navigating back

Closes #371 and #373

See merge request bloodyhealth/drip!215
This commit is contained in:
Julia Friesel
2019-05-14 17:29:15 +00:00
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()
+26 -16
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
} }
if (warningMsg) { // RN alert runs asynchronously but doesn't provide a callback, so wrap
Alert.alert( // it in a promise
sharedLabels.warning, return new Promise(resolve => {
warningMsg, if (warningMsg) {
[ Alert.alert(
{ text: sharedLabels.cancel }, sharedLabels.warning,
{ text: sharedLabels.save, onPress: this.saveTemperature} warningMsg,
] [
) { text: sharedLabels.cancel, onPress: () => {
} else { resolve(false)
this.saveTemperature() }},
} { text: sharedLabels.save, onPress: () => {
resolve(true)
}}
]
)
} else {
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>