Skip to content
Snippets Groups Projects
calendar.js 2.77 KiB
Newer Older
import React, { Component } from 'react'
import PropTypes from 'prop-types'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
import { StyleSheet, View } from 'react-native'
import { CalendarList } from 'react-native-calendars'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
import { connect } from 'react-redux'
import { setDate } from '../slices/date'
import { navigate } from '../slices/navigation'
import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from '../lib/cycle'
import nothingChanged from '../db/db-unchanged'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
import {
Sofiya Tepikin's avatar
Sofiya Tepikin committed
  calendarTheme,
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
  predictionToCalFormat,
  toCalFormat,
  todayToCalFormat,
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
} from './helpers/calendar'

class CalendarView extends Component {
  static propTypes = {
    setDate: PropTypes.func.isRequired,
    navigate: PropTypes.func.isRequired,
  constructor(props) {
    super(props)
    this.bleedingDays = getBleedingDaysSortedByDate()
    const predictedMenses = cycleModule().getPredictedMenses()
    this.state = {
      bleedingDaysInCalFormat: toCalFormat(this.bleedingDays),
      predictedBleedingDaysInCalFormat: predictionToCalFormat(predictedMenses),
      todayInCalFormat: todayToCalFormat(),
    this.bleedingDays.addListener(this.setStateWithCalFormattedDays)
  setStateWithCalFormattedDays = (_, changes) => {
    if (nothingChanged(changes)) return
    const predictedMenses = cycleModule().getPredictedMenses()
    this.setState({
      bleedingDaysInCalFormat: toCalFormat(this.bleedingDays),
      predictedBleedingDaysInCalFormat: predictionToCalFormat(predictedMenses),
      todayInCalFormat: todayToCalFormat(),
  componentWillUnmount() {
    this.bleedingDays.removeListener(this.setStateWithCalFormattedDays)
  passDateToDayView = (result) => {
    this.props.setDate(result.dateString)
    this.props.navigate('CycleDay')
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    const {
      todayInCalFormat,
      bleedingDaysInCalFormat,
      predictedBleedingDaysInCalFormat,
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
    } = this.state
    const markedDates = Object.assign(
      {},
      todayInCalFormat,
      bleedingDaysInCalFormat,
      predictedBleedingDaysInCalFormat
    )

Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
      <View style={styles.container}>
        <CalendarList
          // If firstDay=1 week starts from Monday. Note that dayNames and dayNamesShort should still start from Sunday.
          firstDay={1}
          onDayPress={this.passDateToDayView.bind(this)}
          markedDates={markedDates}
          markingType='custom'
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
          theme={calendarTheme}
          // Max amount of months allowed to scroll to the past.
          pastScrollRange={120}
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
        />
      </View>
Maria Zadnepryanets's avatar
Maria Zadnepryanets committed
const styles = StyleSheet.create({
  container: { flex: 1 },
const mapDispatchToProps = (dispatch) => {
  return {
    setDate: (date) => dispatch(setDate(date)),
    navigate: (page) => dispatch(navigate(page)),
export default connect(null, mapDispatchToProps)(CalendarView)