Newer
Older
import { ScrollView, View, TouchableOpacity, TouchableHighlight, Dimensions } from 'react-native'
import { LocalDate, ChronoUnit } from 'js-joda'
import Icon from 'react-native-vector-icons/Entypo'
import { secondaryColor, cycleDayColor, periodColor } from '../styles'
import { home as labels, bleedingPrediction as predictLabels, shared } from '../i18n/en/labels'
import cycleModule from '../lib/cycle'
import { getCycleDaysSortedByDate } from '../db'
import { getFertilityStatusForDay } from '../lib/sympto-adapter'
import styles from '../styles'
import AppText, { AppTextLight } from './app-text'
import DripHomeIcon from '../assets/drip-home-icons'
export default class Home extends Component {
this.getCycleDayNumber = cycleModule().getCycleDayNumber
this.getBleedingPrediction = cycleModule().getPredictedMenses
this.todayDateString = LocalDate.now().toString()
const prediction = this.getBleedingPrediction()
const fertilityStatus = getFertilityStatusForDay(this.todayDateString)
cycleDayNumber: this.getCycleDayNumber(this.todayDateString),
predictionText: determinePredictionText(prediction),
bleedingPredictionRange: getBleedingPredictionRange(prediction),
...fertilityStatus
const navigate = this.props.navigate
navigate(componentName, { date: LocalDate.now().toString() })
const cycleDayMoreText = this.state.cycleDayNumber ?
labels.cycleDayKnown(this.state.cycleDayNumber)
:
labels.cycleDayNotEnoughInfo
const {height, width} = Dimensions.get('window')
<View flex={1}>
<ScrollView>
<View
style={styles.homeView}
>
<TouchableOpacity
onPress={() => this.passTodayTo('CycleDay')}
style={styles.homeIconElement}
>
<View position='absolute'>
<DripHomeIcon name="circle" size={80} color={cycleDayColor}/>
</View>
<View style={[styles.homeIconTextWrapper, styles.wrapperCycle]}>
<AppTextLight style={styles.iconText}>
{this.state.cycleDayNumber || labels.unknown}
</AppTextLight>
</View>
{ this.state.showMore &&
<AppText style={styles.paragraph}>{cycleDayMoreText}</AppText>
}
<Button
onPress={() => this.passTodayTo('CycleDay')}
backgroundColor={cycleDayColor}>
</TouchableOpacity>
<TouchableOpacity
onPress={() => this.passTodayTo('BleedingEditView')}
style={styles.homeIconElement}
>
<View position='absolute'>
<DripHomeIcon name="drop" size={105} color={periodColor} />
</View>
<View style={[styles.homeIconTextWrapper, styles.wrapperDrop]}>
<AppTextLight style={styles.iconText}>
{this.state.bleedingPredictionRange}
</AppTextLight>
</View>
{this.state.showMore &&
<AppText style={styles.paragraph}>
{this.state.predictionText}
</AppText>
}
<Button
onPress={() => this.passTodayTo('BleedingEditView')}
backgroundColor={periodColor}>
</TouchableOpacity>
<TouchableOpacity
onPress={() => this.props.navigate('Chart')}
style={styles.homeIconElement}
>
<View style={styles.homeCircle} position='absolute' />
<View style={[styles.homeIconTextWrapper, styles.wrapperCircle]}>
<AppTextLight style={styles.iconText}>
{this.state.phase ?
this.state.phase.toString()
:
labels.unknown
}
</AppTextLight>
</View>
{this.state.phase &&
<AppTextLight>
{`${labels.phase(this.state.phase)} (${this.state.status})`}
</AppTextLight>
}
{this.state.showMore &&
<AppText styles={styles.paragraph}>
{this.state.statusText}
</AppText>
}
<Button
onPress={() => this.props.navigate('Chart')}
backgroundColor={secondaryColor}>
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
</ScrollView>
{!this.state.showMore &&
<TouchableHighlight
onPress={() => this.setState({showMore: true})}
style={[styles.showMore, {
top: height / 2 - styles.header.height - 30,
left: width - 40
}]}
>
<View style={{alignItems: 'center'}}>
<AppTextLight>{shared.more}</AppTextLight>
<Icon name='chevron-thin-down' />
</View>
</TouchableHighlight>
}
{this.state.showMore &&
<TouchableHighlight
onPress={() => this.setState({showMore: false})}
style={[styles.showLess, {
top: height / 2 - styles.header.height - 30,
left: 10
}]}
>
<View style={{alignItems: 'center'}}>
<AppTextLight>{shared.less}</AppTextLight>
<Icon name='chevron-thin-down' />
</View>
</TouchableHighlight>
}
</View>
function determinePredictionText(bleedingPrediction) {
if (!bleedingPrediction.length) return predictLabels.noPrediction
const todayDate = LocalDate.now()
const bleedingStart = LocalDate.parse(bleedingPrediction[0][0])
const bleedingEnd = LocalDate.parse(
bleedingPrediction[0][ bleedingPrediction[0].length - 1 ]
)
if (todayDate.isBefore(bleedingStart)) {
todayDate.until(bleedingStart, ChronoUnit.DAYS),
todayDate.until(bleedingEnd, ChronoUnit.DAYS)
)
}
if (todayDate.isAfter(bleedingEnd)) {
return predictLabels.predictionInPast(
bleedingStart.toString(), bleedingEnd.toString()
)
}
const daysToEnd = todayDate.until(bleedingEnd, ChronoUnit.DAYS)
if (daysToEnd === 0) {
} else if (daysToEnd === 1) {
return predictLabels.predictionStartedXDaysLeft(daysToEnd)
function getBleedingPredictionRange(prediction) {
if (!prediction.length) return labels.unknown
const todayDate = LocalDate.now()
const bleedingStart = LocalDate.parse(prediction[0][0])
const bleedingEnd = LocalDate.parse(prediction[0][ prediction[0].length - 1 ])
if (todayDate.isBefore(bleedingStart)) {
return `${todayDate.until(bleedingStart, ChronoUnit.DAYS)}-${todayDate.until(bleedingEnd, ChronoUnit.DAYS)}`
}
if (todayDate.isAfter(bleedingEnd)) {
return labels.unknown
}
return '0'
}