Skip to content
Snippets Groups Projects
stats.js 3.28 KiB
Newer Older
import React from 'react'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
import { Dimensions, ImageBackground, StyleSheet, View } from 'react-native'

import AppPage from './common/app-page'
import AppText from './common/app-text'
import Segment from './common/segment'
import Table from './common/table'
import {getCycleLengthStats as getCycleInfo} from '../lib/cycle-length'
import {stats as labels} from '../i18n/en/labels'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
import { Sizes, Spacing, Typography } from '../styles'
import { fontRatio } from '../config'
emelko's avatar
emelko committed

const image = require('../assets/cycle-icon.png')
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
const screen = Dimensions.get('screen')

const Stats = () => {
  const cycleLengths = cycleModule().getAllCycleLengths()
  const numberOfCycles = cycleLengths.length
mashazyu's avatar
mashazyu committed
  const hasAtLeastOneCycle = numberOfCycles >= 1
  const cycleData = hasAtLeastOneCycle ? getCycleInfo(cycleLengths)
    : { minimum: '', maximum: '', stdDeviation: '' }
  const statsData = [
mashazyu's avatar
mashazyu committed
    [cycleData.minimum, labels.minLabel],
    [cycleData.maximum, labels.maxLabel],
    [cycleData.stdDeviation ? cycleData.stdDeviation : '', labels.stdLabel],
    [numberOfCycles, labels.basisOfStatsEnd]
  ]
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
  const height = screen.height * 0.2
  const marginTop = (height / 8 - Sizes.icon / fontRatio) / 4

  return (
mashazyu's avatar
mashazyu committed
    <AppPage contentContainerStyle={styles.pageContainer}>
      <Segment last style={styles.pageContainer}>
        <AppText>{labels.cycleLengthExplainer}</AppText>
mashazyu's avatar
mashazyu committed
        {!hasAtLeastOneCycle && <AppText>{labels.emptyStats}</AppText>}
        {hasAtLeastOneCycle &&
          <View style={styles.container}>
            <View style={styles.columnLeft}>
              <ImageBackground
                source={image}
                imageStyle={styles.image}
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
                style={[styles.imageContainter, { height }]}
              >
                <AppText
                  numberOfLines={1}
                  ellipsizeMode="clip"
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
                  style={[styles.accentPurpleGiant, { marginTop }]}
                >
                  {cycleData.mean}
                </AppText>
                <AppText style={styles.accentPurpleHuge}>
                  {labels.daysLabel}
                </AppText>
              </ImageBackground>
              <AppText style={styles.accentOrange}>
                {labels.averageLabel}
emelko's avatar
emelko committed
              </AppText>
            <View style={styles.columnRight}>
              <Table tableContent={statsData} />
          </View>
        }
      </Segment>
    </AppPage>
  )

const column = {
mashazyu's avatar
mashazyu committed
  flexDirection: 'column',
}

const styles = StyleSheet.create({
  accentOrange: {
mashazyu's avatar
mashazyu committed
    ...Typography.accentOrange,
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    fontSize: Sizes.small,
  },
  accentPurpleGiant: {
    ...Typography.accentPurpleGiant,
  },
  accentPurpleHuge: {
    ...Typography.accentPurpleHuge,
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    marginTop: Spacing.base * (-1),
  },
  container: {
    alignItems: 'center',
    flexDirection: 'row',
    justifyContent: 'space-between',
  },
  columnLeft: {
    ...column,
mashazyu's avatar
mashazyu committed
    flex: 4,
  },
  columnRight: {
    ...column,
mashazyu's avatar
mashazyu committed
    flex: 5,
    paddingTop: Spacing.small,
  },
  image: {
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    marginLeft: Spacing.large,
    marginTop: Spacing.large,
    resizeMode: 'contain',
  },
  imageContainter: {
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    paddingTop: Spacing.large * 2,
    marginBottom: Spacing.large,
  },
  pageContainer: {
mashazyu's avatar
mashazyu committed
    marginVertical: Spacing.base,
  }
})

export default Stats