From fae278435aaa1448d2d04cb64c4f947a2ca18d94 Mon Sep 17 00:00:00 2001 From: Julia Friesel <julia.friesel@gmail.com> Date: Fri, 17 Aug 2018 08:05:15 +0200 Subject: [PATCH] Add navigation arrows --- components/cycle-day/cycle-day-overview.js | 29 +-------- components/cycle-day/index.js | 70 ++++++++++++++-------- styles/index.js | 27 ++++++--- 3 files changed, 67 insertions(+), 59 deletions(-) diff --git a/components/cycle-day/cycle-day-overview.js b/components/cycle-day/cycle-day-overview.js index 35786826..4b752240 100644 --- a/components/cycle-day/cycle-day-overview.js +++ b/components/cycle-day/cycle-day-overview.js @@ -17,37 +17,10 @@ import { cervixPosition as positionLabels, intensity as intensityLabels } from './labels/labels' -import cycleDayModule from '../../lib/cycle' -import { bleedingDaysSortedByDate } from '../../db' - -const getCycleDayNumber = cycleDayModule().getCycleDayNumber 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() { - const cycleDay = this.cycleDay + const cycleDay = this.props.cycleDay return ( <View style={styles.symptomBoxesView}> <SymptomBox diff --git a/components/cycle-day/index.js b/components/cycle-day/index.js index fab2b2e3..d162a26e 100644 --- a/components/cycle-day/index.js +++ b/components/cycle-day/index.js @@ -4,66 +4,88 @@ import { Text, ScrollView } from 'react-native' +import Icon from 'react-native-vector-icons/MaterialCommunityIcons' import cycleModule from '../../lib/cycle' import { formatDateForViewHeader } from './labels/format' -import styles from '../../styles' +import styles, { iconStyles } from '../../styles' import actionButtonModule from './action-buttons' import symptomComponents from './symptoms' import DayView from './cycle-day-overview' +import { LocalDate } from 'js-joda' +import { getOrCreateCycleDay } from '../../db' const getCycleDayNumber = cycleModule().getCycleDayNumber +const symptomComponentNames = Object.keys(symptomComponents) export default class Day extends Component { constructor(props) { super(props) - this.cycleDay = props.navigation.state.params.cycleDay this.state = { visibleComponent: 'DayView', + cycleDay: props.navigation.state.params.cycleDay } - const showView = view => { + this.showView = 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) - this.cycleDayViews = symptomComponentNames.reduce((acc, curr) => { + render() { + const cycleDayNumber = getCycleDayNumber(this.state.cycleDay.date) + const cycleDayViews = symptomComponentNames.reduce((acc, curr) => { acc[curr] = React.createElement( symptomComponents[curr], { - cycleDay: this.cycleDay, - makeActionButtons + cycleDay: this.state.cycleDay, + makeActionButtons: this.makeActionButtons } ) return acc }, {}) - // DayView needs showView instead of makeActionButtons - this.cycleDayViews.DayView = React.createElement(DayView, { - cycleDay: this.cycleDay, - showView + cycleDayViews.DayView = React.createElement(DayView, { + dateString: this.state.cycleDay.date, + cycleDay: this.state.cycleDay, + showView: this.showView }) - } - render() { - const cycleDayNumber = getCycleDayNumber(this.cycleDay.date) return ( <ScrollView> <View style={ styles.cycleDayDateView }> - <Text style={styles.dateHeader}> - {formatDateForViewHeader(this.cycleDay.date)} - </Text> - { cycleDayNumber && - <Text style={styles.cycleDayNumber} > - Cycle day {cycleDayNumber} - </Text> } + <Icon + name='arrow-left-drop-circle' + {...iconStyles.navigationArrow} + onPress={() => this.goToCycleDay('before')} + /> + <View> + <Text style={styles.dateHeader}> + {formatDateForViewHeader(this.state.cycleDay.date)} + </Text> + {cycleDayNumber && + <Text style={styles.cycleDayNumber} > + Cycle day {cycleDayNumber} + </Text>} + </View > + <Icon + name='arrow-right-drop-circle' + {...iconStyles.navigationArrow} + onPress={() => this.goToCycleDay('after')} + /> </View > <View> - { this.cycleDayViews[this.state.visibleComponent] } + { cycleDayViews[this.state.visibleComponent] } </View > </ScrollView > ) } -} +} \ No newline at end of file diff --git a/styles/index.js b/styles/index.js index 88b76cb6..8896f037 100644 --- a/styles/index.js +++ b/styles/index.js @@ -2,6 +2,7 @@ import { StyleSheet } from 'react-native' export const primaryColor = '#ff7e5f' export const secondaryColor = '#351c4d' +export const fontOnPrimaryColor = 'white' export default StyleSheet.create({ container: { @@ -17,12 +18,12 @@ export default StyleSheet.create({ dateHeader: { fontSize: 18, fontWeight: 'bold', - color: 'white', + color: fontOnPrimaryColor, textAlign: 'center', }, cycleDayNumber: { fontSize: 15, - color: 'white', + color: fontOnPrimaryColor, textAlign: 'center', marginLeft: 15 }, @@ -70,10 +71,15 @@ export default StyleSheet.create({ }, cycleDayDateView: { backgroundColor: primaryColor, - padding: 10, + paddingVertical: 18, + paddingHorizontal: 15, + alignItems: 'center', flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center' + justifyContent: 'space-between' + }, + navigationArrow: { + fontSize: 60, + color: fontOnPrimaryColor }, homeButtons: { marginHorizontal: 15 @@ -107,6 +113,13 @@ export default StyleSheet.create({ }, menuLabel: { fontSize: 15, - color: 'white' + color: fontOnPrimaryColor }, -}) \ No newline at end of file +}) + +export const iconStyles = { + navigationArrow: { + size: 45, + color: fontOnPrimaryColor + } +} \ No newline at end of file -- GitLab