Merge branch 'marie-move-info-button-out-of-header-to-body' into 'master'

Move info button out of header to body

See merge request bloodyhealth/drip!217
This commit is contained in:
bl00dymarie
2019-05-25 09:35:31 +00:00
7 changed files with 134 additions and 93 deletions
+2 -13
View File
@@ -11,7 +11,6 @@ import SettingsMenu from './settings/settings-menu'
import settingsViews from './settings'
import Stats from './stats'
import {headerTitles, menuTitles} from '../i18n/en/labels'
import InfoSymptom from './cycle-day/symptoms/info-symptom'
import setupNotifications from '../lib/notifications'
// design wants everyhting lowercased, but we don't
@@ -22,7 +21,6 @@ const headerTitlesLowerCase = Object.keys(headerTitles).reduce((acc, curr) => {
}, {})
const HOME_PAGE = 'Home'
const INFO_SYMPTOM_PAGE = 'InfoSymptom'
const CYCLE_DAY_PAGE = 'CycleDay'
const SETTINGS_MENU_PAGE = 'SettingsMenu'
@@ -49,7 +47,7 @@ export default class App extends Component {
if (this.isMenuItem()) {
this.menuOrigin = currentPage
}
if (!this.isSymptomView() && !this.isInfoSymptomView()) {
if (!this.isSymptomView()) {
this.originForSymptomView = currentPage
}
this.setState({ currentPage: pageName, currentProps: props })
@@ -66,10 +64,6 @@ export default class App extends Component {
this.navigate(SETTINGS_MENU_PAGE)
} else if (currentPage === CYCLE_DAY_PAGE) {
this.navigate(this.menuOrigin)
} else if (this.isInfoSymptomView()) {
const { date, cycleDay, symptomView } = currentProps
this.navigate(
symptomView, { date, cycleDay })
} else {
this.navigate(HOME_PAGE)
}
@@ -84,10 +78,6 @@ export default class App extends Component {
return Object.keys(symptomViews).includes(this.state.currentPage)
}
isInfoSymptomView() {
return this.state.currentPage === INFO_SYMPTOM_PAGE
}
isSettingsView() {
return Object.keys(settingsViews).includes(this.state.currentPage)
}
@@ -104,7 +94,6 @@ export default class App extends Component {
Calendar,
CycleDay,
Chart,
InfoSymptom,
SettingsMenu,
...settingsViews,
Stats,
@@ -118,7 +107,7 @@ export default class App extends Component {
{this.isDefaultView() &&
<Header title={title} />
}
{(this.isInfoSymptomView() || this.isSettingsView()) &&
{(this.isSettingsView()) &&
<Header
title={title}
showBackButton={true}
+18 -31
View File
@@ -1,35 +1,22 @@
import React, { Component } from 'react'
import { ScrollView } from 'react-native'
import React from 'react'
import { ScrollView, View, TouchableOpacity } from 'react-native'
import Icon from 'react-native-vector-icons/SimpleLineIcons'
import AppText from '../../app-text'
import labels from '../../../i18n/en/symptom-info.js'
import FramedSegment from '../../framed-segment'
import styles from '../../../styles/index'
import styles, {iconStyles} from '../../../styles/index'
export default class InfoSymptom extends Component {
render() {
const symptomView = this.props.symptomView
const symptomMapping = {
BleedingEditView: 'bleeding',
CervixEditView: 'cervix',
DesireEditView: 'desire',
MoodEditView: 'mood',
MucusEditView: 'mucus',
NoteEditView: 'note',
PainEditView: 'pain',
SexEditView: 'sex',
TemperatureEditView: 'temperature'
}
const currentSymptom = symptomMapping[symptomView]
return (
<ScrollView>
<FramedSegment
style={styles.framedSegmentLast}
title={labels[currentSymptom].title}
>
<AppText>{labels[currentSymptom].text}</AppText>
</FramedSegment>
</ScrollView>
)
}
export default function InfoSymptom(props) {
return (
<View style={styles.infoPopUpWrapper}>
<View style={styles.dimmed}></View>
<View style={styles.infoPopUp}>
<TouchableOpacity onPress={props.close} style={styles.infoSymptomClose}>
<Icon name='close' {...iconStyles.infoPopUpClose}/>
</TouchableOpacity>
<ScrollView style={styles.infoSymptomText}>
<AppText>{labels[props.symptom].text}</AppText>
</ScrollView>
</View>
</View>
)
}
@@ -1,6 +1,7 @@
import React, { Component } from 'react'
import { View } from 'react-native'
import AppText, { SymptomSectionHeader } from '../../app-text'
import styles from '../../../styles'
export default class SymptomSection extends Component {
render() {
@@ -13,8 +14,10 @@ export default class SymptomSection extends Component {
}
}
return (
<View style={placeHeadingInline}>
<SymptomSectionHeader flex={1}>{p.header}</SymptomSectionHeader>
<View style={[placeHeadingInline, styles.symptomSection]}>
{ p.header &&
<SymptomSectionHeader flex={1}>{p.header}</SymptomSectionHeader>
}
<View
flexDirection={p.inline ? 'row' : null}
flex={1}
+41 -5
View File
@@ -1,9 +1,14 @@
import React, { Component } from 'react'
import { BackHandler, View, Alert } from 'react-native'
import {
BackHandler, View, Alert, TouchableOpacity
} from 'react-native'
import { saveSymptom } from '../../../db'
import InfoPopUp from './info-symptom'
import Header from '../../header/symptom-view'
import { headerTitles } from '../../../i18n/en/labels'
import { sharedDialogs } from '../../../i18n/en/cycle-day'
import FeatherIcon from 'react-native-vector-icons/Feather'
import styles, { iconStyles } from '../../../styles'
export default class SymptomView extends Component {
constructor(props) {
@@ -14,6 +19,10 @@ export default class SymptomView extends Component {
)
this.globalBackhandler = props.handleBackButtonPress
this.date = props.date
this.navigate = props.navigate
this.state = {
showInfo: false
}
}
async handleBackButtonPressOnSymptomView() {
@@ -35,10 +44,17 @@ export default class SymptomView extends Component {
}
isDeleteIconActive() {
return Object.values(this.state).some(value => {
const symptomValueHasBeenFilledOut = key => {
// the state tracks whether the symptom info should be shown,
// we ignore that property
if (key === 'showInfo') return
// is there any meaningful value in the current state?
return value || value === 0
})
return this.state[key] || this.state[key] === 0
}
const symptomValues = Object.keys(this.state)
return symptomValues.some(symptomValueHasBeenFilledOut)
}
render() {
@@ -66,7 +82,27 @@ export default class SymptomView extends Component {
)
}}
/>
{this.renderContent()}
<View flex={1}>
{ this.renderContent() }
<TouchableOpacity
onPress={() => {
this.setState({showInfo: true})
}}
style={styles.infoButtonSymptomView}
>
<FeatherIcon
name="info"
{...iconStyles.infoInSymptomView}
style={iconStyles.symptomInfo}
/>
</TouchableOpacity>
{ this.state.showInfo &&
<InfoPopUp
symptom={this.symptomName}
close={() => this.setState({showInfo: false})}
/>
}
</View>
</View>
)
}
+5 -1
View File
@@ -8,6 +8,10 @@ export default function NavigationArrow(props) {
left: 'chevron-thin-left',
right: 'chevron-thin-right'
}[props.direction]
const iconPosition = {
left: 'navigationArrowLeft',
right: 'navigationArrowRight'
}[props.direction]
let pressHandler
if (props.goBack) {
pressHandler = () => props.goBack()
@@ -19,7 +23,7 @@ export default function NavigationArrow(props) {
}
return (
<TouchableOpacity
style={styles.navigationArrow}
style={[styles.navigationArrow, styles[iconPosition]]}
onPress={pressHandler}
>
<Icon
+13 -11
View File
@@ -30,17 +30,19 @@ export default function SymptomViewHeader(props) {
{formatDate(props.date)}
</Text>
</View >
<TouchableOpacity
onPress={props.deleteEntry}
style={[styles.infoButton, {opacity: props.deleteIconActive ? 1 : 0}]}
disabled={!props.deleteIconActive}
>
<Icon
name="delete"
style={styles.symptomDeleteIcon}
{...iconStyles.symptomHeaderIcons}
/>
</TouchableOpacity>
{ props.deleteIconActive &&
<TouchableOpacity
onPress={props.deleteEntry}
style={[
styles.headerDeleteButton,
]}
>
<Icon
name="delete"
{...iconStyles.symptomHeaderIcons}
/>
</TouchableOpacity>
}
</View>
)