Add navigation arrows

This commit is contained in:
Julia Friesel
2018-08-17 08:05:15 +02:00
parent a59aa86dbf
commit fae278435a
3 changed files with 67 additions and 59 deletions
+1 -28
View File
@@ -17,37 +17,10 @@ import {
cervixPosition as positionLabels, cervixPosition as positionLabels,
intensity as intensityLabels intensity as intensityLabels
} from './labels/labels' } from './labels/labels'
import cycleDayModule from '../../lib/cycle'
import { bleedingDaysSortedByDate } from '../../db'
const getCycleDayNumber = cycleDayModule().getCycleDayNumber
export default class DayView extends Component { export default class DayView extends Component {
constructor(props) {
super(props)
this.cycleDay = props.cycleDay
this.showView = props.showView
this.state = {
cycleDayNumber: getCycleDayNumber(this.cycleDay.date),
}
this.setStateWithCycleDayNumber = (function (DayViewComponent) {
return function () {
DayViewComponent.setState({
cycleDayNumber: getCycleDayNumber(DayViewComponent.cycleDay.date)
})
}
})(this)
bleedingDaysSortedByDate.addListener(this.setStateWithCycleDayNumber)
}
componentWillUnmount() {
bleedingDaysSortedByDate.removeListener(this.setStateWithCycleDayNumber)
}
render() { render() {
const cycleDay = this.cycleDay const cycleDay = this.props.cycleDay
return ( return (
<View style={styles.symptomBoxesView}> <View style={styles.symptomBoxesView}>
<SymptomBox <SymptomBox
+41 -19
View File
@@ -4,64 +4,86 @@ import {
Text, Text,
ScrollView ScrollView
} from 'react-native' } from 'react-native'
import Icon from 'react-native-vector-icons/MaterialCommunityIcons'
import cycleModule from '../../lib/cycle' import cycleModule from '../../lib/cycle'
import { formatDateForViewHeader } from './labels/format' import { formatDateForViewHeader } from './labels/format'
import styles from '../../styles' import styles, { iconStyles } from '../../styles'
import actionButtonModule from './action-buttons' import actionButtonModule from './action-buttons'
import symptomComponents from './symptoms' import symptomComponents from './symptoms'
import DayView from './cycle-day-overview' import DayView from './cycle-day-overview'
import { LocalDate } from 'js-joda'
import { getOrCreateCycleDay } from '../../db'
const getCycleDayNumber = cycleModule().getCycleDayNumber const getCycleDayNumber = cycleModule().getCycleDayNumber
const symptomComponentNames = Object.keys(symptomComponents)
export default class Day extends Component { export default class Day extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.cycleDay = props.navigation.state.params.cycleDay
this.state = { this.state = {
visibleComponent: 'DayView', visibleComponent: 'DayView',
cycleDay: props.navigation.state.params.cycleDay
} }
const showView = view => { this.showView = view => {
this.setState({visibleComponent: view}) this.setState({visibleComponent: view})
} }
this.makeActionButtons = actionButtonModule(this.showView)
}
const makeActionButtons = actionButtonModule(showView) goToCycleDay(target) {
const localDate = LocalDate.parse(this.state.cycleDay.date)
const targetDate = target === 'before' ?
localDate.minusDays(1).toString() :
localDate.plusDays(1).toString()
this.setState({cycleDay: getOrCreateCycleDay(targetDate)})
}
const symptomComponentNames = Object.keys(symptomComponents) render() {
this.cycleDayViews = symptomComponentNames.reduce((acc, curr) => { const cycleDayNumber = getCycleDayNumber(this.state.cycleDay.date)
const cycleDayViews = symptomComponentNames.reduce((acc, curr) => {
acc[curr] = React.createElement( acc[curr] = React.createElement(
symptomComponents[curr], symptomComponents[curr],
{ {
cycleDay: this.cycleDay, cycleDay: this.state.cycleDay,
makeActionButtons makeActionButtons: this.makeActionButtons
} }
) )
return acc return acc
}, {}) }, {})
// DayView needs showView instead of makeActionButtons // DayView needs showView instead of makeActionButtons
this.cycleDayViews.DayView = React.createElement(DayView, { cycleDayViews.DayView = React.createElement(DayView, {
cycleDay: this.cycleDay, dateString: this.state.cycleDay.date,
showView cycleDay: this.state.cycleDay,
showView: this.showView
}) })
}
render() {
const cycleDayNumber = getCycleDayNumber(this.cycleDay.date)
return ( return (
<ScrollView> <ScrollView>
<View style={ styles.cycleDayDateView }> <View style={ styles.cycleDayDateView }>
<Icon
name='arrow-left-drop-circle'
{...iconStyles.navigationArrow}
onPress={() => this.goToCycleDay('before')}
/>
<View>
<Text style={styles.dateHeader}> <Text style={styles.dateHeader}>
{formatDateForViewHeader(this.cycleDay.date)} {formatDateForViewHeader(this.state.cycleDay.date)}
</Text> </Text>
{ cycleDayNumber && {cycleDayNumber &&
<Text style={styles.cycleDayNumber} > <Text style={styles.cycleDayNumber} >
Cycle day {cycleDayNumber} Cycle day {cycleDayNumber}
</Text> } </Text>}
</View >
<Icon
name='arrow-right-drop-circle'
{...iconStyles.navigationArrow}
onPress={() => this.goToCycleDay('after')}
/>
</View > </View >
<View> <View>
{ this.cycleDayViews[this.state.visibleComponent] } { cycleDayViews[this.state.visibleComponent] }
</View > </View >
</ScrollView > </ScrollView >
) )
+19 -6
View File
@@ -2,6 +2,7 @@ import { StyleSheet } from 'react-native'
export const primaryColor = '#ff7e5f' export const primaryColor = '#ff7e5f'
export const secondaryColor = '#351c4d' export const secondaryColor = '#351c4d'
export const fontOnPrimaryColor = 'white'
export default StyleSheet.create({ export default StyleSheet.create({
container: { container: {
@@ -17,12 +18,12 @@ export default StyleSheet.create({
dateHeader: { dateHeader: {
fontSize: 18, fontSize: 18,
fontWeight: 'bold', fontWeight: 'bold',
color: 'white', color: fontOnPrimaryColor,
textAlign: 'center', textAlign: 'center',
}, },
cycleDayNumber: { cycleDayNumber: {
fontSize: 15, fontSize: 15,
color: 'white', color: fontOnPrimaryColor,
textAlign: 'center', textAlign: 'center',
marginLeft: 15 marginLeft: 15
}, },
@@ -70,10 +71,15 @@ export default StyleSheet.create({
}, },
cycleDayDateView: { cycleDayDateView: {
backgroundColor: primaryColor, backgroundColor: primaryColor,
padding: 10, paddingVertical: 18,
paddingHorizontal: 15,
alignItems: 'center',
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'center', justifyContent: 'space-between'
alignItems: 'center' },
navigationArrow: {
fontSize: 60,
color: fontOnPrimaryColor
}, },
homeButtons: { homeButtons: {
marginHorizontal: 15 marginHorizontal: 15
@@ -107,6 +113,13 @@ export default StyleSheet.create({
}, },
menuLabel: { menuLabel: {
fontSize: 15, fontSize: 15,
color: 'white' color: fontOnPrimaryColor
}, },
}) })
export const iconStyles = {
navigationArrow: {
size: 45,
color: fontOnPrimaryColor
}
}