41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
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)
|
|
let endDate
|
|
if (preOvulatoryDays.length === maybePreOvuDays.length) {
|
|
endDate = preOvuPhaseEndDate
|
|
} else {
|
|
endDate = preOvulatoryDays[preOvulatoryDays.length - 1].date
|
|
}
|
|
|
|
return {
|
|
cycleDays: preOvulatoryDays,
|
|
start: {
|
|
date: preOvulatoryDays[0].date
|
|
},
|
|
end: {
|
|
date: endDate
|
|
}
|
|
}
|
|
}
|
|
|
|
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) {} |