Skip to content
Snippets Groups Projects
home.js 7.31 KiB
Newer Older
Julia Friesel's avatar
Julia Friesel committed
import React, { Component } from 'react'
Julia Friesel's avatar
Julia Friesel committed
import { ScrollView, View, TouchableOpacity, TouchableHighlight, Dimensions } from 'react-native'
import { LocalDate, ChronoUnit } from 'js-joda'
Julia Friesel's avatar
Julia Friesel committed
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'
Julia Friesel's avatar
Julia Friesel committed
import { getFertilityStatusForDay } from '../lib/sympto-adapter'
import styles from '../styles'
import AppText, { AppTextLight } from './app-text'
import DripHomeIcon from '../assets/drip-home-icons'
Julia Friesel's avatar
Julia Friesel committed
import Button from './button'
export default class Home extends Component {
Julia Friesel's avatar
Julia Friesel committed
  constructor(props) {
    super(props)
    this.getCycleDayNumber = cycleModule().getCycleDayNumber
Julia Friesel's avatar
Julia Friesel committed
    this.getBleedingPrediction = cycleModule().getPredictedMenses
    this.todayDateString = LocalDate.now().toString()
Julia Friesel's avatar
Julia Friesel committed
    const prediction = this.getBleedingPrediction()
    const fertilityStatus = getFertilityStatusForDay(this.todayDateString)
Julia Friesel's avatar
Julia Friesel committed
      cycleDayNumber: this.getCycleDayNumber(this.todayDateString),
      predictionText: determinePredictionText(prediction),
      bleedingPredictionRange: getBleedingPredictionRange(prediction),
      ...fertilityStatus
Julia Friesel's avatar
Julia Friesel committed
    this.cycleDays = getCycleDaysSortedByDate()
Julia Friesel's avatar
Julia Friesel committed
  }

Julia Friesel's avatar
Julia Friesel committed
  passTodayTo(componentName) {
    const navigate = this.props.navigate
    navigate(componentName, { date: LocalDate.now().toString() })
Julia Friesel's avatar
Julia Friesel committed
  render() {
Julia Friesel's avatar
Julia Friesel committed
    const cycleDayMoreText = this.state.cycleDayNumber ?
      labels.cycleDayKnown(this.state.cycleDayNumber)
      :
      labels.cycleDayNotEnoughInfo

    const {height, width} = Dimensions.get('window')
Julia Friesel's avatar
Julia Friesel committed
    return (
Julia Friesel's avatar
Julia Friesel committed
      <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}/>
Julia Friesel's avatar
Julia Friesel committed
              </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}>
                {labels.editToday}
Julia Friesel's avatar
Julia Friesel committed
              </Button>
Julia Friesel's avatar
Julia Friesel committed
            </TouchableOpacity>

            <TouchableOpacity
              onPress={() => this.passTodayTo('BleedingEditView')}
              style={styles.homeIconElement}
            >
              <View position='absolute'>
                <DripHomeIcon name="drop" size={105} color={periodColor} />
Julia Friesel's avatar
Julia Friesel committed
              </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}>
                {labels.trackPeriod}
Julia Friesel's avatar
Julia Friesel committed
              </Button>
Julia Friesel's avatar
Julia Friesel committed
            </TouchableOpacity>

            <TouchableOpacity
              onPress={() => this.props.navigate('Chart')}
              style={styles.homeIconElement}
            >
mashazyu's avatar
mashazyu committed

              <View style={styles.homeCircle} position='absolute' />

              <View style={[styles.homeIconTextWrapper, styles.wrapperCircle]}>
Julia Friesel's avatar
Julia Friesel committed
                <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}>
                {labels.checkFertility}
Julia Friesel's avatar
Julia Friesel committed
              </Button>
Julia Friesel's avatar
Julia Friesel committed
            </TouchableOpacity>
Julia Friesel's avatar
Julia Friesel committed

        </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>
Julia Friesel's avatar
Julia Friesel committed
    )
  }
Julia Friesel's avatar
Julia Friesel committed
function determinePredictionText(bleedingPrediction) {
  if (!bleedingPrediction.length) return predictLabels.noPrediction
  const todayDate = LocalDate.now()
  const bleedingStart = LocalDate.parse(bleedingPrediction[0][0])
Julia Friesel's avatar
Julia Friesel committed
  const bleedingEnd = LocalDate.parse(
    bleedingPrediction[0][ bleedingPrediction[0].length - 1 ]
  )
  if (todayDate.isBefore(bleedingStart)) {
Julia Friesel's avatar
Julia Friesel committed
    return predictLabels.predictionInFuture(
      todayDate.until(bleedingStart, ChronoUnit.DAYS),
      todayDate.until(bleedingEnd, ChronoUnit.DAYS)
    )
  }
  if (todayDate.isAfter(bleedingEnd)) {
Julia Friesel's avatar
Julia Friesel committed
    return predictLabels.predictionInPast(
      bleedingStart.toString(), bleedingEnd.toString()
    )
  }
  const daysToEnd = todayDate.until(bleedingEnd, ChronoUnit.DAYS)
  if (daysToEnd === 0) {
Julia Friesel's avatar
Julia Friesel committed
    return predictLabels.predictionStartedNoDaysLeft
  } else if (daysToEnd === 1) {
Julia Friesel's avatar
Julia Friesel committed
    return predictLabels.predictionStarted1DayLeft
Julia Friesel's avatar
Julia Friesel committed
    return predictLabels.predictionStartedXDaysLeft(daysToEnd)
emelko's avatar
emelko committed
}
Julia Friesel's avatar
Julia Friesel committed

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'
}