first exploration of place of feature and how to access data

This commit is contained in:
tina
2024-10-15 14:47:42 +02:00
parent d492a27797
commit fd6f39fbc4
4 changed files with 138 additions and 1 deletions
+81
View File
@@ -0,0 +1,81 @@
import React from 'react'
import { FlatList, StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types'
// import { useTranslation } from 'react-i18next'
import AppModal from '../common/app-modal'
import AppText from '../common/app-text'
import symOccModule from '../../lib/sympto-occurance'
import { Spacing, Typography, Colors } from '../../styles'
// const { t } = useTranslation(null, { keyPrefix: 'stats' })
const SymptomOccurance = ({ onClose }) => {
const data = symOccModule().getCycleStartsOfLastYear()
if (!data || data.length === 0) return false
console.log('cycle starts:', data)
return (
<AppModal onClose={onClose}>
<View>
<FlatList
data={data}
ListHeaderComponent={FlatListHeader}
contentContainerStyle={styles.container}
/>
</View>
</AppModal>
)
}
SymptomOccurance.propTypes = {
onClose: PropTypes.func,
}
const FlatListHeader = () => (
<View style={styles.row}>
<View style={styles.accentCell}>
<AppText style={styles.header}>
{'When did you experience headaches in the last year?'}
</AppText>
</View>
</View>
)
const styles = StyleSheet.create({
divider: {
height: 1,
width: '100%',
backgroundColor: Colors.grey,
},
header: {
...Typography.accentOrange,
paddingVertical: Spacing.small,
},
headerDivider: {
borderBottomColor: Colors.purple,
borderBottomWidth: 2,
},
row: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingVertical: Spacing.tiny,
backgroundColor: 'white',
},
cell: {
flex: 2,
justifyContent: 'center',
},
accentCell: {
flex: 3,
justifyContent: 'center',
},
container: {
minHeight: '40%',
minWidth: '95%',
paddingHorizontal: Spacing.base,
},
})
export default SymptomOccurance
+11
View File
@@ -8,6 +8,7 @@ import Button from '../common/button'
import Footnote from '../common/Footnote' import Footnote from '../common/Footnote'
import StatsOverview from './StatsOverview' import StatsOverview from './StatsOverview'
import PeriodDetailsModal from './PeriodDetailsModal' import PeriodDetailsModal from './PeriodDetailsModal'
import SymptomOccurance from './SymptomOccurance'
import cycleModule from '../../lib/cycle' import cycleModule from '../../lib/cycle'
import { getCycleLengthStats as getCycleInfo } from '../../lib/cycle-length' import { getCycleLengthStats as getCycleInfo } from '../../lib/cycle-length'
@@ -19,6 +20,8 @@ const image = require('../../assets/cycle-icon.png')
const Stats = () => { const Stats = () => {
const [isStatsVisible, setIsStatsVisible] = useState(false) const [isStatsVisible, setIsStatsVisible] = useState(false)
const [isSymptomOccuranceVisible, setIsSymptomOccuranceVisible] =
useState(false)
const { t } = useTranslation(null, { keyPrefix: 'stats' }) const { t } = useTranslation(null, { keyPrefix: 'stats' })
@@ -83,6 +86,14 @@ const Stats = () => {
{isStatsVisible && ( {isStatsVisible && (
<PeriodDetailsModal onClose={() => setIsStatsVisible(false)} /> <PeriodDetailsModal onClose={() => setIsStatsVisible(false)} />
)} )}
<Button isCTA onPress={() => setIsSymptomOccuranceVisible(true)}>
{t('showSymptomOccurance')}
</Button>
{isSymptomOccuranceVisible && (
<SymptomOccurance
onClose={() => setIsSymptomOccuranceVisible(false)}
/>
)}
<Footnote>{t('footnote')}</Footnote> <Footnote>{t('footnote')}</Footnote>
</> </>
)} )}
+2 -1
View File
@@ -156,7 +156,8 @@
"cycleLength": "Cycle length", "cycleLength": "Cycle length",
"bleedingDays": "Bleeding" "bleedingDays": "Bleeding"
}, },
"footnote": "Based on the standard deviation of all your tracked periods drip. calculates a range for the starting day of the upcoming 3 periods. The range will be 3 days if your standard deviation is smaller than 1.5 and 5 days if the value is bigger.\n\nThe standard deviation tells you how much the length of your periods vary, 0 means all your periods are exactly the same length and the bigger the value the more the period length varies." "footnote": "Based on the standard deviation of all your tracked periods drip. calculates a range for the starting day of the upcoming 3 periods. The range will be 3 days if your standard deviation is smaller than 1.5 and 5 days if the value is bigger.\n\nThe standard deviation tells you how much the length of your periods vary, 0 means all your periods are exactly the same length and the bigger the value the more the period length varies.",
"showSymptomOccurance": "Show details on headaches"
}, },
"plurals": { "plurals": {
"day": "{{count}} day", "day": "{{count}} day",
+44
View File
@@ -0,0 +1,44 @@
import * as joda from '@js-joda/core'
const LocalDate = joda.LocalDate
// const DAYS = joda.ChronoUnit.DAYS
export default function config(opts) {
let cycleStartsSortedByDate
if (!opts) {
// we only want to require (and run) the db module
// when not running the tests
cycleStartsSortedByDate = require('../db').getCycleStartsSortedByDate()
// maxCycleLength = 45
} else {
cycleStartsSortedByDate = opts.cycleStartsSortedByDate || []
// maxCycleLength = opts.maxCycleLength || 99
}
function getCycleStartsOfLastYear() {
const today = LocalDate.parse(new Date().toISOString().slice(0, 10))
const firstRelevantCycleStart = today.minusYears(1)
const relevantCycles = cycleStartsSortedByDate.filter(({ date }) =>
LocalDate.parse(date).isAfter(firstRelevantCycleStart)
)
return relevantCycles.map(({ date }) => date)
}
function getTodayDate() {
return new Date().toISOString().slice(0, 10)
}
const getStats = () =>
cycleStartsSortedByDate.map((day, i) => {
const today = getTodayDate()
return {
date: today,
k: i,
}
})
return {
getCycleStartsOfLastYear,
getStats,
}
}