Skip to content
Snippets Groups Projects
nfp-lines.js 2.05 KiB
Newer Older
import { getCycleStatusForDay } from '../../lib/sympto-adapter'
import { normalizeToScale } from './y-axis'

export default function () {
  let cycleStatus
  let cycleStartDate
  let noMoreCycles = false

  function updateCurrentCycle(dateString) {
    cycleStatus = getCycleStatusForDay(dateString)
    if(!cycleStatus) {
      noMoreCycles = true
      return
    }
    if (cycleStatus.phases.preOvulatory) {
      cycleStartDate = cycleStatus.phases.preOvulatory.start.date
    } else {
      cycleStartDate = cycleStatus.phases.periOvulatory.start.date
    }
  }

  function dateIsInPeriOrPostPhase(dateString) {
    return (
      dateString >= cycleStatus.phases.periOvulatory.start.date
    )
  }

  function precededByAnotherTempValue(dateString) {
    return (
      // we are only interested in days that have a preceding
      // temp
      Object.keys(cycleStatus.phases).some(phaseName => {
        return cycleStatus.phases[phaseName].cycleDays.some(day => {
          return day.temperature && day.date < dateString
        })
      })
      // and also a following temp, so we don't draw the line
      // longer than necessary
      &&
      cycleStatus.phases.postOvulatory.cycleDays.some(day => {
        return day.temperature && day.date > dateString
      })
    )
  }

  function isInTempMeasuringPhase(temperature, dateString) {
    return (
      temperature || precededByAnotherTempValue(dateString)
  return function(dateString, temperature) {
    const ret = {}
    if (!cycleStatus && !noMoreCycles) updateCurrentCycle(dateString)
    if (noMoreCycles) return ret

    if (dateString < cycleStartDate) updateCurrentCycle(dateString)
    if (noMoreCycles) return ret

    const tempShift = cycleStatus.temperatureShift

    if (tempShift) {
      if (tempShift.firstHighMeasurementDay.date === dateString) {
        ret.drawFhmLine = true
      }

      if (
        dateIsInPeriOrPostPhase(dateString) &&
        isInTempMeasuringPhase(temperature, dateString)
      ) {
        ret.drawLtlAt = normalizeToScale(tempShift.ltl)
      }
    }

    return ret
  }
}