Compare commits

..

39 Commits

Author SHA1 Message Date
wunderfisch 8f4b208f3e specify tracking category cervical mucus 2024-02-26 15:29:32 +01:00
wunderfisch 2e24eb2d35 fixing issue import and empty statement 2024-02-26 15:28:11 +01:00
wunderfisch eac0b81b70 changes in customization texts and small changes to styling 2024-02-26 13:28:43 +01:00
bl00dymarie 7ca8d3c611 Update versionName, versionCode and iOS plist 1.2402.23 2024-02-23 17:02:57 +01:00
wunderfisch 4be8f1aa4e small changes in styling. more space beween switch lines, smaller switches in iOS (testing please), less bottom margin for segments 2024-02-23 16:53:00 +01:00
bl00dymarie 405e27bdbe Remove isSecondarySymptomDisabled;
because maybe we don't need it anymore with fertilityTracking taking its job
2024-02-23 16:50:30 +01:00
bl00dymarie 1c73509473 Move cervix & mucus off turn fertility off logic out of local storage 2024-02-23 16:38:44 +01:00
bl00dymarie 5855ea0a34 Move temp off turns fertility off logic out of local storage 2024-02-23 16:38:11 +01:00
bl00dymarie 27bb25e6da Add check for if tempReminder is null 2024-02-23 15:27:44 +01:00
bl00dymarie 8150b791ed Only check if fertility tracking enabled for display of secondary Symptom 2024-02-23 15:27:44 +01:00
bl00dymarie 3c0ea9b208 Turn fertility tracking off when mucus and cervix tracking are off 2024-02-23 15:27:44 +01:00
bl00dymarie d0d691c6af Turn fertility tracking off when temperature tracking is off 2024-02-23 15:27:44 +01:00
bl00dymarie 29c3b9b108 Disable fertility tracking switch depending on temp, mucus or cervix 2024-02-23 15:27:44 +01:00
bl00dymarie c037c630d3 Check for FertilityTrackingEnabled in sympto-adapter 2024-02-23 15:27:44 +01:00
bl00dymarie 31888c3331 Check for FertilityTrackingEnabled on chart 2024-02-23 15:27:44 +01:00
bl00dymarie faad51f4f1 Check for FertilityTrackingEnabled on home 2024-02-23 15:27:44 +01:00
bl00dymarie e395730d98 First step for fertilityTracking Toggle 2024-02-23 15:27:44 +01:00
wunderfisch 092b557396 make second symptom buttons show alert if switched off 2024-02-23 12:39:31 +01:00
wunderfisch 4ebec41a0a fix saving of secondary symptom 2024-02-23 12:16:32 +01:00
bl00dymarie e69ca93382 Remove idle code 2024-02-22 13:29:16 +00:00
bl00dymarie aa440742ca Merge branch 'main' into '676-feature-customisation-not-display-mucus-cervix'
# Conflicts:
#   components/settings/customization/index.js
2024-02-22 13:22:38 +00:00
bl00dymarie b9ec4c7108 Merge branch 'main' into 676-feature-customisation-not-display-mucus-cervix 2024-02-20 12:29:28 +01:00
bl00dymarie d66e5f36e5 Rename to secondarySymptomDisabledPrompt 2024-02-19 18:10:57 +01:00
bl00dymarie 69c546f684 Rename shouldUseCervix to useCervixAsSecondarySymptom 2024-02-19 18:05:20 +01:00
bl00dymarie dc304afe75 Rename labels to more neutral 'secondarySymptom' 2024-02-19 18:01:57 +01:00
bl00dymarie 63bc8a1daf Rename to useCervixAsSecondarySymptom 2024-02-19 17:51:25 +01:00
bl00dymarie 7fa130f9e1 Rename to useCervixAsSecondarySymptomObservable 2024-02-19 17:13:40 +01:00
wunderfisch 5f55500831 small changes on secondary symptom to make it work nicly with the button logic instead of the former switch and to display the correct texts 2024-02-19 12:13:58 +01:00
bl00dymarie d23b5fe420 Add oneTimeTransformIntoNumber for secondarySymptom Switch 2024-02-14 16:10:05 +01:00
bl00dymarie 311cee0e17 Adapt color for secondarySymptom Boxes 2024-02-14 16:10:00 +01:00
bl00dymarie 76137fc000 Replace hard coded text 2024-02-14 16:09:47 +01:00
bl00dymarie 09614319e3 Add SelectTabGroup for secondary Symptom Switch 2024-02-14 16:08:07 +01:00
wunderfisch ebbfd8aba5 merging work on secondary symptom logic and buttons 2024-02-14 10:26:13 +01:00
bl00dymarie 1662bb29f0 Change prop Type to value instead of bool for saveUseCervix 2024-02-13 17:24:29 +01:00
bl00dymarie a59dfa8336 Add SelectTabGroup for secondary Symptom Switch 2024-02-13 17:24:26 +01:00
wunderfisch d7f1eb81fb centralizing code to set the Secondary Symptom from different actions in one function 2024-02-13 15:46:04 +01:00
wunderfisch 82803bbb83 fix: disabling the secondary symptom toggle when not both categories are enabled, didn't work before after new save 2024-02-13 11:52:33 +01:00
wunderfisch 8a8b3217fa small changes on Secondary Symptom disable function 2024-02-12 16:05:49 +01:00
wunderfisch e11acbab78 Disable and switch secondary symptom depending on cervical mucus and cervix turned on or off. 2024-02-12 14:49:43 +01:00
14 changed files with 278 additions and 65 deletions
+2 -2
View File
@@ -134,8 +134,8 @@ android {
applicationId "com.drip" applicationId "com.drip"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 27 versionCode 29
versionName "1.2402.15" versionName "1.2402.23"
ndk { ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
} }
+7 -3
View File
@@ -14,7 +14,10 @@ import {
determinePredictionText, determinePredictionText,
formatWithOrdinalSuffix, formatWithOrdinalSuffix,
} from './helpers/home' } from './helpers/home'
import { periodPredictionObservable } from '../local-storage' import {
fertilityTrackingObservable,
periodPredictionObservable,
} from '../local-storage'
import { Colors, Fonts, Sizes, Spacing } from '../styles' import { Colors, Fonts, Sizes, Spacing } from '../styles'
import { LocalDate } from '@js-joda/core' import { LocalDate } from '@js-joda/core'
@@ -28,11 +31,12 @@ const Home = ({ navigate, setDate }) => {
navigate('CycleDay') navigate('CycleDay')
} }
const isFertilityTrackingEnabled = fertilityTrackingObservable.value
const todayDateString = LocalDate.now().toString() const todayDateString = LocalDate.now().toString()
const { getCycleDayNumber, getPredictedMenses } = cycleModule() const { getCycleDayNumber, getPredictedMenses } = cycleModule()
const cycleDayNumber = getCycleDayNumber(todayDateString) const cycleDayNumber = getCycleDayNumber(todayDateString)
const { status, phase, statusText } = const { status, phase, statusText } =
getFertilityStatusForDay(todayDateString) isFertilityTrackingEnabled && getFertilityStatusForDay(todayDateString)
const isPeriodPredictionEnabled = periodPredictionObservable.value const isPeriodPredictionEnabled = periodPredictionObservable.value
const prediction = determinePredictionText(getPredictedMenses(), t) const prediction = determinePredictionText(getPredictedMenses(), t)
@@ -55,7 +59,7 @@ const Home = ({ navigate, setDate }) => {
</AppText> </AppText>
</View> </View>
)} )}
{phase && ( {isFertilityTrackingEnabled && phase && (
<View style={styles.line}> <View style={styles.line}>
<AppText style={styles.whiteSubtitle}> <AppText style={styles.whiteSubtitle}>
{formatWithOrdinalSuffix(phase)} {formatWithOrdinalSuffix(phase)}
+6
View File
@@ -22,6 +22,8 @@ import {
painTrackingCategoryObservable, painTrackingCategoryObservable,
sexTrackingCategoryObservable, sexTrackingCategoryObservable,
temperatureTrackingCategoryObservable, temperatureTrackingCategoryObservable,
mucusTrackingCategoryObservable,
cervixTrackingCategoryObservable,
} from '../../local-storage' } from '../../local-storage'
import { makeColumnInfo } from '../helpers/chart' import { makeColumnInfo } from '../helpers/chart'
@@ -72,6 +74,10 @@ const CycleChart = ({ navigate, setDate }) => {
const symptomRowEnabledSymptoms = symptomRowSymptoms.filter((symptom) => { const symptomRowEnabledSymptoms = symptomRowSymptoms.filter((symptom) => {
if (symptom === 'sex') { if (symptom === 'sex') {
return sexTrackingCategoryObservable.value ? symptom : null return sexTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'mucus') {
return mucusTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'cervix') {
return cervixTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'desire') { } else if (symptom === 'desire') {
return desireTrackingCategoryObservable.value ? symptom : null return desireTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'pain') { } else if (symptom === 'pain') {
+7 -2
View File
@@ -1,10 +1,10 @@
import React from 'react' import React from 'react'
import { StyleSheet, Switch, View } from 'react-native' import { Platform, StyleSheet, Switch, View } from 'react-native'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import AppText from './app-text' import AppText from './app-text'
import { Colors, Containers } from '../../styles' import { Colors, Containers, Spacing } from '../../styles'
const AppSwitch = ({ onToggle, text, value, disabled }) => { const AppSwitch = ({ onToggle, text, value, disabled }) => {
const trackColor = { true: Colors.turquoiseDark } const trackColor = { true: Colors.turquoiseDark }
@@ -34,9 +34,14 @@ AppSwitch.propTypes = {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { container: {
...Containers.rowContainer, ...Containers.rowContainer,
marginTop: Spacing.tiny,
}, },
switch: { switch: {
flex: 1, flex: 1,
transform:
Platform.OS === 'ios'
? [{ scaleX: 0.8 }, { scaleY: 0.8 }]
: [{ scaleX: 1 }, { scaleY: 1 }],
}, },
textContainer: { textContainer: {
flex: 4, flex: 4,
@@ -16,6 +16,8 @@ import {
painTrackingCategoryObservable, painTrackingCategoryObservable,
sexTrackingCategoryObservable, sexTrackingCategoryObservable,
temperatureTrackingCategoryObservable, temperatureTrackingCategoryObservable,
mucusTrackingCategoryObservable,
cervixTrackingCategoryObservable,
} from '../../local-storage' } from '../../local-storage'
import { Spacing } from '../../styles' import { Spacing } from '../../styles'
import { SYMPTOMS } from '../../config' import { SYMPTOMS } from '../../config'
@@ -40,6 +42,10 @@ const CycleDayOverView = ({ date, setDate, isTemperatureEditView }) => {
return temperatureTrackingCategoryObservable.value ? symptom : null return temperatureTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'sex') { } else if (symptom === 'sex') {
return sexTrackingCategoryObservable.value ? symptom : null return sexTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'mucus') {
return mucusTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'cervix') {
return cervixTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'desire') { } else if (symptom === 'desire') {
return desireTrackingCategoryObservable.value ? symptom : null return desireTrackingCategoryObservable.value ? symptom : null
} else if (symptom === 'pain') { } else if (symptom === 'pain') {
+27 -3
View File
@@ -5,14 +5,29 @@ import { StyleSheet, TouchableOpacity, View } from 'react-native'
import AppText from '../common/app-text' import AppText from '../common/app-text'
import { Colors, Containers } from '../../styles' import { Colors, Containers } from '../../styles'
import labels from '../../i18n/en/settings'
export default function SelectTabGroup({ activeButton, buttons, onSelect }) { export default function SelectTabGroup({ activeButton, buttons, onSelect }) {
const oneTimeTransformIntoNumber =
typeof activeButton === 'boolean' && Number(activeButton)
const isSecondarySymptomSwitch =
buttons[0]['label'] === labels.secondarySymptom.mucus
return ( return (
<View style={styles.container}> <View style={styles.container}>
{buttons.map(({ label, value }, i) => { {buttons.map(({ label, value }, i) => {
const isActive = value === activeButton const isActive =
const boxStyle = [styles.box, isActive && styles.boxActive] value === activeButton || value === oneTimeTransformIntoNumber
const textStyle = [styles.text, isActive && styles.textActive] const boxStyle = [
styles.box,
isActive && styles.boxActive,
isSecondarySymptomSwitch && styles.purpleBox,
isSecondarySymptomSwitch && isActive && styles.activePurpleBox,
]
const textStyle = [
styles.text,
isSecondarySymptomSwitch && styles.purpleText,
isActive && styles.textActive,
]
return ( return (
<TouchableOpacity <TouchableOpacity
@@ -50,4 +65,13 @@ const styles = StyleSheet.create({
textActive: { textActive: {
color: 'white', color: 'white',
}, },
purpleBox: {
borderColor: Colors.purple,
},
activePurpleBox: {
backgroundColor: Colors.purple,
},
purpleText: {
color: Colors.purple,
},
}) })
+7 -2
View File
@@ -1,6 +1,10 @@
import { LocalDate } from '@js-joda/core' import { LocalDate } from '@js-joda/core'
import { scaleObservable, unitObservable } from '../../local-storage' import {
fertilityTrackingObservable,
scaleObservable,
unitObservable,
} from '../../local-storage'
import { getCycleStatusForDay } from '../../lib/sympto-adapter' import { getCycleStatusForDay } from '../../lib/sympto-adapter'
import { getCycleDay, getAmountOfCycleDays } from '../../db' import { getCycleDay, getAmountOfCycleDays } from '../../db'
@@ -270,7 +274,8 @@ export function nfpLines() {
if (dateString < cycle.startDate) updateCurrentCycle(dateString) if (dateString < cycle.startDate) updateCurrentCycle(dateString)
if (cycle.noMoreCycles) return ret if (cycle.noMoreCycles) return ret
const tempShift = cycle.status.temperatureShift const tempShift =
fertilityTrackingObservable.value && cycle.status.temperatureShift
if (tempShift) { if (tempShift) {
if (tempShift.firstHighMeasurementDay.date === dateString) { if (tempShift.firstHighMeasurementDay.date === dateString) {
+142 -36
View File
@@ -1,4 +1,4 @@
import React, { useState } from 'react' import React, { useEffect, useState } from 'react'
import { Alert, Pressable } from 'react-native' import { Alert, Pressable } from 'react-native'
import AppPage from '../../common/app-page' import AppPage from '../../common/app-page'
@@ -6,32 +6,38 @@ import AppSwitch from '../../common/app-switch'
import AppText from '../../common/app-text' import AppText from '../../common/app-text'
import TemperatureSlider from './temperature-slider' import TemperatureSlider from './temperature-slider'
import Segment from '../../common/segment' import Segment from '../../common/segment'
import SelectTabGroup from '../../cycle-day/select-tab-group'
import { import {
desireTrackingCategoryObservable, desireTrackingCategoryObservable,
fertilityTrackingObservable,
moodTrackingCategoryObservable, moodTrackingCategoryObservable,
noteTrackingCategoryObservable, noteTrackingCategoryObservable,
painTrackingCategoryObservable, painTrackingCategoryObservable,
sexTrackingCategoryObservable, sexTrackingCategoryObservable,
temperatureTrackingCategoryObservable, temperatureTrackingCategoryObservable,
mucusTrackingCategoryObservable,
cervixTrackingCategoryObservable,
saveDesireTrackingCategory, saveDesireTrackingCategory,
saveFertilityTrackingEnabled,
saveMoodTrackingCategory, saveMoodTrackingCategory,
saveNoteTrackingCategory, saveNoteTrackingCategory,
savePainTrackingCategory, savePainTrackingCategory,
saveMucusTrackingCategory,
saveCervixTrackingCategory,
savePeriodPrediction, savePeriodPrediction,
saveSexTrackingCategory, saveSexTrackingCategory,
saveTemperatureTrackingCategory, saveTemperatureTrackingCategory,
saveUseCervix, saveUseCervixAsSecondarySymptom,
periodPredictionObservable, periodPredictionObservable,
useCervixObservable, useCervixAsSecondarySymptomObservable,
} from '../../../local-storage' } from '../../../local-storage'
import labels from '../../../i18n/en/settings' import labels from '../../../i18n/en/settings'
import { SYMPTOMS } from '../../../config' import { SYMPTOMS } from '../../../config'
const Settings = () => { const Settings = () => {
const [shouldUseCervix, setShouldUseCervix] = useState( const [useCervixAsSecondarySymptom, setUseCervixAsSecondarySymptom] =
useCervixObservable.value useState(useCervixAsSecondarySymptomObservable.value)
)
const [isPeriodPredictionEnabled, setPeriodPrediction] = useState( const [isPeriodPredictionEnabled, setPeriodPrediction] = useState(
periodPredictionObservable.value periodPredictionObservable.value
@@ -40,6 +46,14 @@ const Settings = () => {
const [isTemperatureTrackingCategoryEnabled, setTemperatureTrackingCategory] = const [isTemperatureTrackingCategoryEnabled, setTemperatureTrackingCategory] =
useState(temperatureTrackingCategoryObservable.value) useState(temperatureTrackingCategoryObservable.value)
const [isMucusTrackingCategoryEnabled, setMucusTrackingCategory] = useState(
mucusTrackingCategoryObservable.value
)
const [isCervixTrackingCategoryEnabled, setCervixTrackingCategory] = useState(
cervixTrackingCategoryObservable.value
)
const [isSexTrackingCategoryEnabled, setSexTrackingCategory] = useState( const [isSexTrackingCategoryEnabled, setSexTrackingCategory] = useState(
sexTrackingCategoryObservable.value sexTrackingCategoryObservable.value
) )
@@ -60,19 +74,32 @@ const Settings = () => {
noteTrackingCategoryObservable.value noteTrackingCategoryObservable.value
) )
const [isEnabled, setIsEnabled] = useState(false) const [isFertilityTrackingEnabled, setFertilityTrackingEnabled] = useState(
const toggleSwitch = () => setIsEnabled((previousState) => !previousState) fertilityTrackingObservable.value
)
const fertilityTrackingToggle = (value) => {
setFertilityTrackingEnabled(value)
saveFertilityTrackingEnabled(value)
}
const temperatureTrackingCategoryToggle = (value) => { const temperatureTrackingCategoryToggle = (value) => {
setTemperatureTrackingCategory(value) setTemperatureTrackingCategory(value)
saveTemperatureTrackingCategory(value) saveTemperatureTrackingCategory(value)
if (!value) {
setFertilityTrackingEnabled(false)
saveFertilityTrackingEnabled(false)
}
}
const mucusTrackingCategoryToggle = (value) => {
manageSecondarySymptom(cervixTrackingCategoryObservable.value, value)
}
const cervixTrackingCategoryToggle = (value) => {
manageSecondarySymptom(value, mucusTrackingCategoryObservable.value)
} }
const sexTrackingCategoryToggle = (value) => { const sexTrackingCategoryToggle = (value) => {
setSexTrackingCategory(value) setSexTrackingCategory(value)
saveSexTrackingCategory(value) saveSexTrackingCategory(value)
} }
const desireTrackingCategoryToggle = (value) => { const desireTrackingCategoryToggle = (value) => {
setDesireTrackingCategory(value) setDesireTrackingCategory(value)
saveDesireTrackingCategory(value) saveDesireTrackingCategory(value)
@@ -89,30 +116,83 @@ const Settings = () => {
setNoteTrackingCategory(value) setNoteTrackingCategory(value)
saveNoteTrackingCategory(value) saveNoteTrackingCategory(value)
} }
const onPeriodPredictionToggle = (value) => { const onPeriodPredictionToggle = (value) => {
setPeriodPrediction(value) setPeriodPrediction(value)
savePeriodPrediction(value) savePeriodPrediction(value)
} }
const fertilityTrackingText = isFertilityTrackingEnabled
? labels.fertilityTracking.on
: labels.fertilityTracking.off
const periodPredictionText = isPeriodPredictionEnabled const periodPredictionText = isPeriodPredictionEnabled
? labels.periodPrediction.on ? labels.periodPrediction.on
: labels.periodPrediction.off : labels.periodPrediction.off
const onCervixToggle = (value) => { const secondarySymptomButtons = [
setShouldUseCervix(value) {
saveUseCervix(value) label: labels.secondarySymptom.mucus,
value: 0,
},
{
label: labels.secondarySymptom.cervix,
value: 1,
},
]
const onSelectTab = (value) => {
if (isMucusTrackingCategoryEnabled && isCervixTrackingCategoryEnabled) {
setUseCervixAsSecondarySymptom(value)
saveUseCervixAsSecondarySymptom(value)
} else {
secondarySymptomDisabledPrompt()
}
} }
const cervixText = shouldUseCervix // is needed so secondary symptom is set correct on load
? labels.useCervix.cervixModeOn useEffect(() => {
: labels.useCervix.cervixModeOff manageSecondarySymptom(
cervixTrackingCategoryObservable.value,
mucusTrackingCategoryObservable.value
)
}, [])
const manageSecondarySymptom = (cervix, mucus) => {
if (!cervix && mucus) {
setUseCervixAsSecondarySymptom(0)
saveUseCervixAsSecondarySymptom(0)
} else if (cervix && !mucus) {
setUseCervixAsSecondarySymptom(1)
saveUseCervixAsSecondarySymptom(1)
} else if (!cervix && !mucus) {
setFertilityTrackingEnabled(false)
saveFertilityTrackingEnabled(false)
}
setMucusTrackingCategory(mucus)
saveMucusTrackingCategory(mucus)
setCervixTrackingCategory(cervix)
saveCervixTrackingCategory(cervix)
}
const secondarySymptomDisabledPrompt = () => {
if (!isMucusTrackingCategoryEnabled == isCervixTrackingCategoryEnabled) {
Alert.alert(
labels.secondarySymptom.disabled.title,
labels.secondarySymptom.disabled.noSecondaryEnabled
)
}
}
const cervixText = useCervixAsSecondarySymptom
? labels.secondarySymptom.cervixModeOn
: labels.secondarySymptom.cervixModeOff
const sliderDisabledPrompt = () => { const sliderDisabledPrompt = () => {
if (!isTemperatureTrackingCategoryEnabled) { if (!isTemperatureTrackingCategoryEnabled) {
Alert.alert(labels.disabled.title, labels.disabled.message) Alert.alert(labels.disabled.title, labels.disabled.message)
} }
} }
return ( return (
<AppPage title={'Customization'}> <AppPage title={'Customization'}>
<Segment title={'Tracking categories'}> <Segment title={'Tracking categories'}>
@@ -121,6 +201,20 @@ const Settings = () => {
text={SYMPTOMS[1]} text={SYMPTOMS[1]}
value={isTemperatureTrackingCategoryEnabled} value={isTemperatureTrackingCategoryEnabled}
/> />
<AppSwitch
onToggle={(enabled) => {
mucusTrackingCategoryToggle(enabled)
}}
text={SYMPTOMS[2]}
value={isMucusTrackingCategoryEnabled}
/>
<AppSwitch
onToggle={(enabled) => {
cervixTrackingCategoryToggle(enabled)
}}
text={SYMPTOMS[3]}
value={isCervixTrackingCategoryEnabled}
/>
<AppSwitch <AppSwitch
onToggle={sexTrackingCategoryToggle} onToggle={sexTrackingCategoryToggle}
text={SYMPTOMS[4]} text={SYMPTOMS[4]}
@@ -147,14 +241,24 @@ const Settings = () => {
value={isNoteTrackingCategoryEnabled} value={isNoteTrackingCategoryEnabled}
/> />
</Segment> </Segment>
<Pressable onPress={sliderDisabledPrompt}>
<Segment title={'Fertility feature'}> <Segment title={labels.fertilityTracking.title}>
<AppSwitch {isTemperatureTrackingCategoryEnabled &&
onToggle={toggleSwitch} (isMucusTrackingCategoryEnabled ||
text={'If turned on ...'} isCervixTrackingCategoryEnabled) ? (
value={isEnabled} <>
/> <AppText>{labels.fertilityTracking.message}</AppText>
</Segment> <AppSwitch
onToggle={fertilityTrackingToggle}
text={fertilityTrackingText}
value={isFertilityTrackingEnabled}
/>
</>
) : (
<AppText>{labels.disabled.message}</AppText>
)}
</Segment>
</Pressable>
<Pressable onPress={sliderDisabledPrompt}> <Pressable onPress={sliderDisabledPrompt}>
<Segment title={labels.tempScale.segmentTitle}> <Segment title={labels.tempScale.segmentTitle}>
@@ -170,17 +274,19 @@ const Settings = () => {
</Segment> </Segment>
</Pressable> </Pressable>
<Pressable onPress={sliderDisabledPrompt}> <Pressable onPress={secondarySymptomDisabledPrompt}>
<Segment title={labels.useCervix.title}> <Segment title={labels.secondarySymptom.title}>
{isTemperatureTrackingCategoryEnabled && ( {!isFertilityTrackingEnabled ? (
<AppSwitch <AppText>{labels.secondarySymptom.disabled.message}</AppText>
onToggle={onCervixToggle} ) : (
text={cervixText} <>
value={shouldUseCervix} <AppText>{cervixText}</AppText>
/> <SelectTabGroup
)} activeButton={useCervixAsSecondarySymptom}
{!isTemperatureTrackingCategoryEnabled && ( buttons={secondarySymptomButtons}
<AppText>{labels.disabled.message}</AppText> onSelect={(value) => onSelectTab(value)}
/>
</>
)} )}
</Segment> </Segment>
</Pressable> </Pressable>
+1 -1
View File
@@ -4,7 +4,7 @@ import { scale, verticalScale } from 'react-native-size-matters'
export const SYMPTOMS = [ export const SYMPTOMS = [
'bleeding', 'bleeding',
'temperature', 'temperature',
'mucus', 'cervical mucus',
'cervix', 'cervix',
'sex', 'sex',
'desire', 'desire',
+19 -3
View File
@@ -41,7 +41,7 @@ export default {
disabled: { disabled: {
title: 'This feature is turned off', title: 'This feature is turned off',
message: message:
'Please first enable the temperature tracking category in the customization settings.', 'To use the temperature scale please first enable the temperature tracking category above.',
}, },
tempReminder: { tempReminder: {
title: 'Temperature reminder', title: 'Temperature reminder',
@@ -66,16 +66,32 @@ export default {
'To use the period reminder please first enable period predictions in the customization settings.', 'To use the period reminder please first enable period predictions in the customization settings.',
}, },
}, },
useCervix: { fertilityTracking: {
title: 'Fertility phases calculation',
message:
'If you enter menstrual bleeding, temperature and cervical mucus or cervix data according to the sympto-thermal rules, drip will calculate cycle phases with the provided data.',
on: 'If you switch this off, drip will not show fertility related information.',
off: 'If you switch this on, drip will show fertility related information.',
},
secondarySymptom: {
title: 'Secondary symptom', title: 'Secondary symptom',
cervixModeOn: cervixModeOn:
'Cervix values are being used for symptothermal fertility detection. You can switch here to use cervical mucus values for symptothermal fertility detection', 'Cervix values are being used for symptothermal fertility detection. You can switch here to use cervical mucus values for symptothermal fertility detection',
cervixModeOff: cervixModeOff:
'By default, cervical mucus values are being used for symptothermal fertility detection. You can switch here to use cervix values for symptothermal fertility detection', 'By default, cervical mucus values are being used for symptothermal fertility detection. You can switch here to use cervix values for symptothermal fertility detection',
disabled: {
title: 'Disabled',
message:
'To set a secondary symptom please first enable the temperature, cervical mucus or cervix tracking category as well as the fertility feature above.',
noSecondaryEnabled:
'To switch the secondary symptom both cervical mucus and cervix need to be enabled above.',
},
mucus: 'cervical mucus',
cervix: 'cervix',
}, },
periodPrediction: { periodPrediction: {
title: 'Period predictions', title: 'Period predictions',
on: 'drip predicts your 3 next menstrual bleedings based on the statistics of your previously tracked cycles, min 3 complete cycles.', on: 'drip predicts your 3 next menstrual bleedings based on statistics if you previously tracked at least 3 complete cycles.',
off: 'There are no predictions for menstrual cycles displayed. If turned on the calendar and the home screen will display period predictions.', off: 'There are no predictions for menstrual cycles displayed. If turned on the calendar and the home screen will display period predictions.',
}, },
passwordSettings: { passwordSettings: {
+1 -1
View File
@@ -19,7 +19,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.2401.17</string> <string>1.2402.23</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
+12 -2
View File
@@ -1,9 +1,15 @@
import getFertilityStatus from 'sympto' import getFertilityStatus from 'sympto'
import cycleModule from './cycle' import cycleModule from './cycle'
import { useCervixObservable } from '../local-storage' import { fertilityTrackingObservable, useCervixAsSecondarySymptomObservable } from '../local-storage'
import { fertilityStatus as labels } from '../i18n/en/labels' import { fertilityStatus as labels } from '../i18n/en/labels'
const isFertilityTrackingEnabled = fertilityTrackingObservable.value
export function getFertilityStatusForDay(dateString) { export function getFertilityStatusForDay(dateString) {
if (!isFertilityTrackingEnabled) {
return
}
const status = getCycleStatusForDay(dateString) const status = getCycleStatusForDay(dateString)
if (!status) return { if (!status) return {
status: labels.fertile, status: labels.fertile,
@@ -34,6 +40,10 @@ export function getFertilityStatusForDay(dateString) {
} }
export function getCycleStatusForDay(dateString, opts = {}) { export function getCycleStatusForDay(dateString, opts = {}) {
if (!isFertilityTrackingEnabled) {
return
}
const { const {
getCycleForDay, getCycleForDay,
getCyclesBefore, getCyclesBefore,
@@ -57,7 +67,7 @@ export function getCycleStatusForDay(dateString, opts = {}) {
} }
} }
cycleInfo.secondarySymptom = useCervixObservable.value ? 'cervix' : 'mucus' cycleInfo.secondarySymptom = useCervixAsSecondarySymptomObservable.value ? 'cervix' : 'mucus'
return getFertilityStatus(cycleInfo) return getFertilityStatus(cycleInfo)
} }
+39 -7
View File
@@ -59,12 +59,19 @@ export async function savePeriodPrediction(bool) {
} }
} }
export const useCervixObservable = Observable() export const useCervixAsSecondarySymptomObservable = Observable()
setObvWithInitValue('useCervix', useCervixObservable, false) setObvWithInitValue(
'useCervixAsSecondarySymptom',
useCervixAsSecondarySymptomObservable,
0
)
export async function saveUseCervix(bool) { export async function saveUseCervixAsSecondarySymptom(value) {
await AsyncStorage.setItem('useCervix', JSON.stringify(bool)) await AsyncStorage.setItem(
useCervixObservable.set(bool) 'useCervixAsSecondarySymptom',
JSON.stringify(value)
)
useCervixAsSecondarySymptomObservable.set(value)
} }
export const hasEncryptionObservable = Observable() export const hasEncryptionObservable = Observable()
@@ -100,13 +107,30 @@ export async function saveTemperatureTrackingCategory(bool) {
temperatureTrackingCategoryObservable.set(bool) temperatureTrackingCategoryObservable.set(bool)
if (!temperatureTrackingCategoryObservable.value) { if (!temperatureTrackingCategoryObservable.value) {
const result = await AsyncStorage.getItem('tempReminder') // if temperature tracking is turned off, the temperature reminder gets disabled
if (JSON.parse(result).enabled) { const tempReminderResult = await AsyncStorage.getItem('tempReminder')
if (tempReminderResult && JSON.parse(tempReminderResult).enabled) {
tempReminderObservable.set(false) tempReminderObservable.set(false)
} }
} }
} }
export const mucusTrackingCategoryObservable = Observable()
setObvWithInitValue('mucus', mucusTrackingCategoryObservable, true)
export async function saveMucusTrackingCategory(bool) {
await AsyncStorage.setItem('mucus', JSON.stringify(bool))
mucusTrackingCategoryObservable.set(bool)
}
export const cervixTrackingCategoryObservable = Observable()
setObvWithInitValue('cervix', cervixTrackingCategoryObservable, true)
export async function saveCervixTrackingCategory(bool) {
await AsyncStorage.setItem('cervix', JSON.stringify(bool))
cervixTrackingCategoryObservable.set(bool)
}
export const sexTrackingCategoryObservable = Observable() export const sexTrackingCategoryObservable = Observable()
setObvWithInitValue('sex', sexTrackingCategoryObservable, true) setObvWithInitValue('sex', sexTrackingCategoryObservable, true)
@@ -147,6 +171,14 @@ export async function saveNoteTrackingCategory(bool) {
noteTrackingCategoryObservable.set(bool) noteTrackingCategoryObservable.set(bool)
} }
export const fertilityTrackingObservable = Observable()
setObvWithInitValue('fertilityTracking', fertilityTrackingObservable, true)
export async function saveFertilityTrackingEnabled(bool) {
await AsyncStorage.setItem('fertilityTracking', JSON.stringify(bool))
fertilityTrackingObservable.set(bool)
}
async function setObvWithInitValue(key, obv, defaultValue) { async function setObvWithInitValue(key, obv, defaultValue) {
const result = await AsyncStorage.getItem(key) const result = await AsyncStorage.getItem(key)
let value let value
+2 -3
View File
@@ -1,14 +1,13 @@
{ {
"name": "drip.", "name": "drip.",
"version": "1.2402.15", "version": "1.2402.23",
"contributors": [ "contributors": [
"Julia Friesel <julia.friesel@gmail.com>", "Julia Friesel <julia.friesel@gmail.com>",
"Marie Kochsiek", "Marie Kochsiek",
"Tina Baumann", "Tina Baumann",
"Sofiya Tepikin", "Sofiya Tepikin",
"Mariya Zadnepryanets", "Mariya Zadnepryanets",
"Lisa Hillebrand", "Lisa Hillebrand"
"Martha Dörfler"
], ],
"scripts": { "scripts": {
"start": "react-native start", "start": "react-native start",