From 955207ed8d6d825ad432e4b54238d2626651407c Mon Sep 17 00:00:00 2001 From: Julia Friesel Date: Thu, 19 Jul 2018 07:17:30 +0200 Subject: [PATCH] Draw vertical and horizontal line in chart for completed sympto eval --- components/chart/chart.js | 71 ++++++++++++++++++++++++++++++++++++++- lib/sympto-adapter.js | 37 +++++++++++--------- 2 files changed, 91 insertions(+), 17 deletions(-) diff --git a/components/chart/chart.js b/components/chart/chart.js index 877d231..9030bfa 100644 --- a/components/chart/chart.js +++ b/components/chart/chart.js @@ -14,6 +14,7 @@ import { getCycleDay, getOrCreateCycleDay, cycleDaysSortedByDate } from '../../d import cycleModule from '../../lib/cycle' import styles from './styles' import config from './config' +import { getCycleStatusForDay } from '../../lib/sympto-adapter' const getCycleDayNumber = cycleModule().getCycleDayNumber @@ -63,10 +64,21 @@ export default class CycleChart extends Component { const cycleDayNumber = getCycleDayNumber(dateString) const label = styles.column.label const dateLabel = dateString.split('-').slice(1).join('-') + const getFhmAndLtlInfo = setUpFertilityStatusFunc() + const nfpLineInfo = getFhmAndLtlInfo(dateString) return ( this.passDateToDayView(dateString)}> + {nfpLineInfo.drawFhmLine ? + : null} {this.placeHorizontalGrid()} {cycleDayNumber} {dateLabel} @@ -79,6 +91,16 @@ export default class CycleChart extends Component { Q13.5 6.8 15 3z" /> : null} + {nfpLineInfo.drawLtlAt ? + : null} + {y ? this.drawDotAndLines(y, cycleDay.temperature.exclude, index) : null} ) @@ -196,7 +218,6 @@ function makeYAxis() { const tickPositions = [] const labels = [] - // for style reasons, we don't want the first and last tick for (let i = 1; i < numberOfTicks - 1; i++) { const y = tickDistance * i @@ -217,3 +238,51 @@ function makeYAxis() { return {labels, tickPositions} } + +function setUpFertilityStatusFunc() { + 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 && + dateString <= cycleStatus.phases.postOvulatory.start.date + ) + } + + return function(dateString) { + const ret = {} + if (!cycleStatus && !noMoreCycles) updateCurrentCycle(dateString) + if (noMoreCycles) return ret + + if (dateString < cycleStartDate) updateCurrentCycle(dateString) + if (noMoreCycles) return ret + + // now we know we have the current cycle + const tempShift = cycleStatus.temperatureShift + + if (tempShift && tempShift.firstHighMeasurementDay.date === dateString) { + ret.drawFhmLine = true + } + + if (tempShift && dateIsInPeriOrPostPhase(dateString)) { + ret.drawLtlAt = normalizeToScale(tempShift.ltl) + } + + return ret + } +} \ No newline at end of file diff --git a/lib/sympto-adapter.js b/lib/sympto-adapter.js index 337a1a7..1eb9e27 100644 --- a/lib/sympto-adapter.js +++ b/lib/sympto-adapter.js @@ -9,22 +9,8 @@ const { } = cycleModule() export function getFertilityStatusStringForDay(dateString) { - const cycle = getCycleForDay(dateString) - if (!cycle) return fertilityStatus.unknown - - const cycleInfo = {cycle: formatCycleForSympto(cycle)} - - const previousCycle = getPreviousCycle(dateString) - - if (previousCycle) { - cycleInfo.previousCycle = formatCycleForSympto(previousCycle) - const earlierCycles = getCyclesBefore(previousCycle[0]) - if (earlierCycles) { - cycleInfo.earlierCycles = earlierCycles.map(formatCycleForSympto) - } - } - - const status = getFertilityStatus(cycleInfo) + const status = getCycleStatusForDay(dateString) + if (!status) return fertilityStatus.unknown const phaseNameForDay = Object.keys(status.phases).find(phaseName => { const phase = status.phases[phaseName] @@ -41,6 +27,25 @@ export function getFertilityStatusStringForDay(dateString) { return mapToString(phaseNameForDay, dateString, status) } +export function getCycleStatusForDay(dateString) { + const cycle = getCycleForDay(dateString) + if (!cycle) return null + + const cycleInfo = {cycle: formatCycleForSympto(cycle)} + + const previousCycle = getPreviousCycle(dateString) + + if (previousCycle) { + cycleInfo.previousCycle = formatCycleForSympto(previousCycle) + const earlierCycles = getCyclesBefore(previousCycle[0]) + if (earlierCycles) { + cycleInfo.earlierCycles = earlierCycles.map(formatCycleForSympto) + } + } + + return getFertilityStatus(cycleInfo) +} + function mapToString(phaseNameForDay, dateString, status) { const mapping = { preOvulatory: () => fertilityStatus.infertile,