diff --git a/bleeding.js b/bleeding.js index f7e4e55ff24c9997a642fc025051a12d669e9f1e..d1e04529844c3a3a22b1cd22435d6324318bfca0 100644 --- a/bleeding.js +++ b/bleeding.js @@ -11,9 +11,9 @@ import { saveBleeding } from './db' import { formatDateForViewHeader } from './format' import { bleeding as labels } from './labels' import cycleDayModule from './get-cycle-day-number' -import { getCycleDaysSortedByDateView } from './db' +import { bleedingDaysSortedByDate } from './db' -const getCycleDay = cycleDayModule(getCycleDaysSortedByDateView()) +const getCycleDay = cycleDayModule(bleedingDaysSortedByDate) export default class Bleeding extends Component { constructor(props) { diff --git a/day-view.js b/day-view.js index 799d815e3b32ccc086451ddb53ad7a6345457ee3..b615ffd42784baf35e9ae052e2f499724af2bb0e 100644 --- a/day-view.js +++ b/day-view.js @@ -8,9 +8,9 @@ import styles from './styles' import { formatDateForViewHeader } from './format' import { bleeding as labels} from './labels' import cycleDayModule from './get-cycle-day-number' -import { getCycleDaysSortedByDateView } from './db' +import { bleedingDaysSortedByDate } from './db' -const getCycleDay = cycleDayModule(getCycleDaysSortedByDateView()) +const getCycleDay = cycleDayModule(bleedingDaysSortedByDate) export default class DayView extends Component { constructor(props) { diff --git a/get-cycle-day-number.js b/get-cycle-day-number.js index 1c6d74fa05c1494208824d51603956ea560a0224..a6c85988a75fef07bdf7d25033b046963ba83019 100644 --- a/get-cycle-day-number.js +++ b/get-cycle-day-number.js @@ -4,15 +4,10 @@ const LocalDate = joda.LocalDate export default function config(bleedingDaysSortedByDateView, opts) { opts = opts || { - // at the very minimum, a cycle can be a bleeding day - // followed by a non-bleeding day, thus a length of 2 maxBreakInBleeding: 1 } return function getCycleDayNumber(targetDateString) { - // sort the cycle days in descending order so we travel into - // the past as we iterate over the array - // also, to retrieve the number, we only need the cycle days before the target day const targetDate = LocalDate.parse(targetDateString) const withWrappedDates = bleedingDaysSortedByDateView .filter(day => !day.bleeding.exclude) @@ -20,16 +15,15 @@ export default function config(bleedingDaysSortedByDateView, opts) { day.wrappedDate = LocalDate.parse(day.date) return day }) - // TODO write test for what if there is no first day before?? aka no firstbleedingdaybeforeindex + const firstBleedingDayBeforeTargetDayIndex = withWrappedDates.findIndex(day => day.wrappedDate.isBefore(targetDate)) - const cycleDays = withWrappedDates.slice(firstBleedingDayBeforeTargetDayIndex) + if (firstBleedingDayBeforeTargetDayIndex < 0) return null + const previousBleedingDays = withWrappedDates.slice(firstBleedingDayBeforeTargetDayIndex) - const lastPeriodStart = cycleDays.find((day, i) => { - return thereIsNoPreviousBleedingDayWithinTheThreshold(day, cycleDays.slice(i + 1), opts.maxBreakInBleeding) + const lastPeriodStart = previousBleedingDays.find((day, i) => { + return thereIsNoPreviousBleedingDayWithinTheThreshold(day, previousBleedingDays.slice(i + 1), opts.maxBreakInBleeding) }) - if (!lastPeriodStart) return null - const diffInDays = lastPeriodStart.wrappedDate.until(targetDate, joda.ChronoUnit.DAYS) // cycle starts at day 1 diff --git a/home.js b/home.js index 101a7eaf6f3b3deb88cff9cc03e108f11f831fdf..c4749e708fea32cc333deeb8ea141dea90a79e9e 100644 --- a/home.js +++ b/home.js @@ -6,22 +6,27 @@ import { } from 'react-native' import styles from './styles' import cycleDayModule from './get-cycle-day-number' -import { getCycleDaysSortedByDateView, deleteAll } from './db' +import { bleedingDaysSortedByDate, deleteAll } from './db' import { LocalDate } from 'js-joda' -const cycleDaysSortedByDateView = getCycleDaysSortedByDateView() -const getCycleDayNumber = cycleDayModule(cycleDaysSortedByDateView) -const now = new Date() -const cycleDayNumber = getCycleDayNumber(LocalDate.of(now.getFullYear(), now.getMonth() + 1, now.getDate())) -const welcomeTextWithCycleDay = `Welcome! Today is day ${cycleDayNumber} of your current cycle` -const welcomeText = `Welcome! We don't have enough information to know what your current cycle day is` +const getCycleDayNumber = cycleDayModule(bleedingDaysSortedByDate) export default class Home extends Component { constructor(props) { super(props) + const now = new Date() + this.todayDateString = LocalDate.of(now.getFullYear(), now.getMonth() + 1, now.getDate()).toString() + const cycleDayNumber = getCycleDayNumber(this.todayDateString) + this.state = { - welcomeText: cycleDayNumber ? welcomeTextWithCycleDay : welcomeText + welcomeText: determineWelcomeText(cycleDayNumber) } + + bleedingDaysSortedByDate.addListener(setStateWithCurrentWelcomeText.bind(this)) + } + + componentWillUnmount() { + bleedingDaysSortedByDate.removeListener(setStateWithCurrentWelcomeText) } render() { @@ -45,3 +50,13 @@ export default class Home extends Component { ) } } + +function determineWelcomeText(cycleDayNumber) { + const welcomeTextWithCycleDay = `Welcome! Today is day ${cycleDayNumber} of your current cycle` + const welcomeText = `Welcome! We don't have enough information to know what your current cycle day is` + return cycleDayNumber ? welcomeTextWithCycleDay : welcomeText +} + +function setStateWithCurrentWelcomeText() { + this.setState({ welcomeText: determineWelcomeText(getCycleDayNumber(this.todayDateString)) }) +} \ No newline at end of file