Skip to content
Snippets Groups Projects
get-cycle-day-number.js 1.22 KiB
Newer Older
export default function (cycleDays, targetDay) {
  const lastFirstBleedingday = findLastFirstBleedingDay(cycleDays)

  if (!lastFirstBleedingday) return

  const diffInDays = targetDay.diff(lastFirstBleedingday.date, 'days')

  // cycle starts at day 1
  return diffInDays + 1
}

function findLastFirstBleedingDay(cycleDays) {
  // sort the cycle days in descending order
  // so we travel into the past as we iterate
  // over the array
  cycleDays.sort((a,b) => b.date - a.date)

  let sawBleeding = false

  for (let i = 0; i < cycleDays.length; i++) {
    const cycleDay = cycleDays[i]

    // we have detected the day before the beginning
    // of a bleeding period, so the previous cycle day in the array
    // was the first day of bleeding
    if (sawBleeding && (!isBleedingDay(cycleDay))) {
      return cycleDays[i - 1]
    }

    // if we get to the earliest cycle day and there was
    // bleeding on that day, it's the first bleeding day for us
    if (i === cycleDays.length - 1 && isBleedingDay(cycleDay)) {
      return cycleDay
    }

    if (isBleedingDay(cycleDay)) {
      sawBleeding = true
    }
  }
}

function isBleedingDay(cycleDay) {
  return cycleDay.bleeding
    && cycleDay.bleeding.value
    && !cycleDay.exclude
}