Skip to content
Snippets Groups Projects
pre-ovulatory.js 1.21 KiB
Newer Older
import { LocalDate } from "js-joda"

export default function(cycle, previousCycles) {
  // TODO handle no previous cycles
  let preOvuPhaseLength = 5

  //TODO make sure it handles weird cases like fhm < 9
  const minus8DayRuleResult = apply8DayRule(previousCycles)
  if (minus8DayRuleResult) preOvuPhaseLength = minus8DayRuleResult

  const startDate = LocalDate.parse(cycle[0].date)
  const preOvuPhaseEndDate = startDate.plusDays(preOvuPhaseLength - 1).toString()
  const maybePreOvuDays = cycle.slice(0, 5).filter(d => d.date <= preOvuPhaseEndDate)
  const preOvulatoryDays = getDaysUntilFertileMucus(maybePreOvuDays)
  if (preOvulatoryDays.length === maybePreOvuDays.length) {
    endDate = preOvuPhaseEndDate
  } else {
    endDate = preOvulatoryDays[preOvulatoryDays.length - 1].date
  }

Julia Friesel's avatar
Julia Friesel committed
  return {
    cycleDays: preOvulatoryDays,
    start: {
      date: preOvulatoryDays[0].date
    },
    end: {
      date: endDate
Julia Friesel's avatar
Julia Friesel committed
    }
  }
}

function getDaysUntilFertileMucus(days) {
  const firstFertileMucusDayIndex = days.findIndex(day => day.mucus && day.mucus.value > 1)
  if (firstFertileMucusDayIndex > -1) {
    return days.slice(0, firstFertileMucusDayIndex)
  }
  return days
function apply8DayRule(previousCycles) {}