Skip to content
Snippets Groups Projects
Commit 50930c7c authored by Julia Friesel's avatar Julia Friesel
Browse files

Merge branch '201-reduce-symptom-row-space' into 'master'

Resolve "reduce symptom row space"

Closes #201

See merge request bloodyhealth/drip!79
parents a954d5a4 bb003c97
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,10 @@ export default class CycleChart extends Component { ...@@ -21,7 +21,10 @@ export default class CycleChart extends Component {
{...item} {...item}
index={index} index={index}
navigate={this.props.navigate} navigate={this.props.navigate}
symptomHeight={this.symptomHeight}
columnHeight={this.columnHeight}
chartHeight={this.state.chartHeight} chartHeight={this.state.chartHeight}
symptomRowSymptoms={this.symptomRowSymptoms}
/> />
) )
} }
...@@ -33,7 +36,34 @@ export default class CycleChart extends Component { ...@@ -33,7 +36,34 @@ export default class CycleChart extends Component {
const height = nativeEvent.layout.height const height = nativeEvent.layout.height
this.setState({ chartHeight: height }) this.setState({ chartHeight: height })
this.reCalculateChartInfo = () => { this.reCalculateChartInfo = () => {
this.setState({ columns: this.makeColumnInfo(nfpLines()) }) // how many symptoms need to be displayed on the chart's upper symptom row?
this.symptomRowSymptoms = [
'bleeding',
'mucus',
'cervix',
'sex',
'desire',
'pain',
'note'
].filter((symptomName) => {
return this.cycleDaysSortedByDate.some(cycleDay => {
return cycleDay[symptomName]
})
})
this.xAxisHeight = this.state.chartHeight * config.xAxisHeightPercentage
const remainingHeight = this.state.chartHeight - this.xAxisHeight
this.symptomHeight = config.symptomHeightPercentage * remainingHeight
this.symptomRowHeight = this.symptomRowSymptoms.length * this.symptomHeight
this.columnHeight = remainingHeight - this.symptomRowHeight
const chartSymptoms = [...this.symptomRowSymptoms]
if (this.cycleDaysSortedByDate.some(day => day.temperature)) {
chartSymptoms.push('temperature')
}
const columnData = this.makeColumnInfo(nfpLines(), chartSymptoms)
this.setState({ columns: columnData })
} }
this.cycleDaysSortedByDate.addListener(this.reCalculateChartInfo) this.cycleDaysSortedByDate.addListener(this.reCalculateChartInfo)
...@@ -45,7 +75,7 @@ export default class CycleChart extends Component { ...@@ -45,7 +75,7 @@ export default class CycleChart extends Component {
this.removeObvListener() this.removeObvListener()
} }
makeColumnInfo(getFhmAndLtlInfo) { makeColumnInfo(getFhmAndLtlInfo, chartSymptoms) {
let amountOfCycleDays = getAmountOfCycleDays() let amountOfCycleDays = getAmountOfCycleDays()
// if there's not much data yet, we want to show at least 30 days on the chart // if there's not much data yet, we want to show at least 30 days on the chart
if (amountOfCycleDays < 30) { if (amountOfCycleDays < 30) {
...@@ -63,21 +93,11 @@ export default class CycleChart extends Component { ...@@ -63,21 +93,11 @@ export default class CycleChart extends Component {
).toString() ).toString()
}) })
const chartSymptoms = [
'bleeding',
'temperature',
'mucus',
'cervix',
'sex',
'desire',
'pain',
'note'
].filter((symptomName) => {
return this.cycleDaysSortedByDate.some(cycleDay => cycleDay[symptomName])
})
const columns = xAxisDates.map(dateString => { const columns = xAxisDates.map(dateString => {
const column = { dateString }
const cycleDay = getCycleDay(dateString) const cycleDay = getCycleDay(dateString)
if (!cycleDay) return column
const symptoms = chartSymptoms.reduce((acc, symptom) => { const symptoms = chartSymptoms.reduce((acc, symptom) => {
if (symptom === 'bleeding' || if (symptom === 'bleeding' ||
symptom === 'temperature' || symptom === 'temperature' ||
...@@ -85,28 +105,29 @@ export default class CycleChart extends Component { ...@@ -85,28 +105,29 @@ export default class CycleChart extends Component {
symptom === 'desire' || symptom === 'desire' ||
symptom === 'note' symptom === 'note'
) { ) {
acc[symptom] = cycleDay && cycleDay[symptom] && cycleDay[symptom].value acc[symptom] = cycleDay[symptom] && cycleDay[symptom].value
} else if (symptom === 'cervix') { } else if (symptom === 'cervix') {
acc[symptom] = cycleDay && cycleDay['cervix'] && (cycleDay['cervix'].opening + cycleDay['cervix'].firmness) acc.cervix = cycleDay.cervix &&
(cycleDay.cervix.opening + cycleDay.cervix.firmness)
} else if (symptom === 'sex') { } else if (symptom === 'sex') {
// solo = 1 + partner = 2 // solo = 1 + partner = 2
acc[symptom] = cycleDay && cycleDay['sex'] && (cycleDay['sex'].solo + cycleDay['sex'].partner) acc.sex = cycleDay.sex && (cycleDay.sex.solo + cycleDay.sex.partner)
} else if (symptom === 'pain') { } else if (symptom === 'pain') {
// is any pain documented? // is any pain documented?
acc[symptom] = cycleDay && cycleDay['pain'] && Object.values(cycleDay['pain']).some(x => x === true) acc.pain = cycleDay.pain &&
Object.values(cycleDay.pain).some(x => x === true)
} }
acc[`${symptom}Exclude`] = cycleDay && cycleDay[symptom] && cycleDay[symptom].exclude acc[`${symptom}Exclude`] = cycleDay[symptom] && cycleDay[symptom].exclude
return acc return acc
}, {}) }, {})
const temp = symptoms.temperature const temp = symptoms.temperature
const columnHeight = this.state.chartHeight * config.columnHeightPercentage if (temp) {
return { column.y = normalizeToScale(temp, this.columnHeight)
dateString,
y: temp ? normalizeToScale(temp, columnHeight) : null,
...symptoms,
...getFhmAndLtlInfo(dateString, temp, columnHeight)
} }
const fhmAndLtl = getFhmAndLtlInfo(dateString, temp, this.columnHeight)
return Object.assign(column, symptoms, fhmAndLtl)
}) })
return columns.map((col, i) => { return columns.map((col, i) => {
...@@ -116,12 +137,6 @@ export default class CycleChart extends Component { ...@@ -116,12 +137,6 @@ export default class CycleChart extends Component {
} }
render() { render() {
let columnHeight
let symptomRowHeight
if (this.state.chartHeight) {
columnHeight = this.state.chartHeight * config.columnHeightPercentage
symptomRowHeight = this.state.chartHeight * config.symptomRowHeightPercentage
}
return ( return (
<View <View
onLayout={this.onLayout} onLayout={this.onLayout}
...@@ -136,14 +151,16 @@ export default class CycleChart extends Component { ...@@ -136,14 +151,16 @@ export default class CycleChart extends Component {
{this.state.chartHeight && this.state.chartLoaded && {this.state.chartHeight && this.state.chartLoaded &&
<View <View
style={[styles.yAxis, { style={[styles.yAxis, {
height: columnHeight, height: this.columnHeight,
marginTop: symptomRowHeight marginTop: this.symptomRowHeight
}]} }]}
> >
{makeYAxisLabels(columnHeight)} {makeYAxisLabels(this.columnHeight)}
</View>} </View>}
{this.state.chartHeight && this.state.chartLoaded && makeHorizontalGrid(columnHeight, symptomRowHeight)} {this.state.chartHeight && this.state.chartLoaded &&
makeHorizontalGrid(this.columnHeight, this.symptomRowHeight)
}
{this.state.chartHeight && {this.state.chartHeight &&
<FlatList <FlatList
......
...@@ -37,12 +37,13 @@ export default class DayColumn extends Component { ...@@ -37,12 +37,13 @@ export default class DayColumn extends Component {
rightTemperatureExclude, rightTemperatureExclude,
leftY, leftY,
leftTemperatureExclude, leftTemperatureExclude,
chartHeight columnHeight,
symptomHeight,
chartHeight,
symptomRowSymptoms,
xAxisHeight
} = this.props } = this.props
const columnHeight = chartHeight * config.columnHeightPercentage
const xAxisHeight = chartHeight * config.xAxisHeightPercentage
const symptomHeight = chartHeight * config.symptomRowHeightPercentage
const columnElements = [] const columnElements = []
...@@ -108,77 +109,102 @@ export default class DayColumn extends Component { ...@@ -108,77 +109,102 @@ export default class DayColumn extends Component {
</G> </G>
) )
const symptomIconViews = {
bleeding: (
<SymptomIconView
value={this.props.bleeding}
symptomHeight={symptomHeight}
key='bleeding'
>
<Icon
name='drop'
size={12}
color={styles.bleedingIconShades[this.props.bleeding]}
/>
</SymptomIconView>
),
mucus: (
<SymptomIconView
value={this.props.mucus}
symptomHeight={symptomHeight}
key='mucus'
>
<View
{...styles.mucusIcon}
backgroundColor={styles.mucusIconShades[this.props.mucus]}
/>
</SymptomIconView>
),
cervix: (
<SymptomIconView
value={this.props.cervix}
symptomHeight={symptomHeight}
key='cervix'
>
<View
{...styles.mucusIcon}
// cervix is sum of openess and firmness - fertile only when closed and hard (=0)
backgroundColor={this.props.cervix > 0 ? 'blue' : 'green'}
/>
</SymptomIconView>
),
sex: (
<SymptomIconView
value={this.props.sex}
symptomHeight={symptomHeight}
key='sex'
>
<View
{...styles.mucusIcon}
backgroundColor='orange'
/>
</SymptomIconView>
),
desire: (
<SymptomIconView
value={this.props.desire}
symptomHeight={symptomHeight}
key='desire'
>
<View
{...styles.mucusIcon}
backgroundColor='red'
/>
</SymptomIconView>
),
pain: (
<SymptomIconView
value={this.props.pain}
symptomHeight={symptomHeight}
key='pain'
>
<View
{...styles.mucusIcon}
backgroundColor='blue'
/>
</SymptomIconView>
),
note: (
<SymptomIconView
value={this.props.note}
symptomHeight={symptomHeight}
key='note'
>
<View
{...styles.mucusIcon}
backgroundColor='green'
/>
</SymptomIconView>
)
}
return ( return (
<TouchableOpacity <TouchableOpacity
onPress={() => this.passDateToDayView(dateString)} onPress={() => this.passDateToDayView(dateString)}
activeOpacity={1} activeOpacity={1}
> >
<View height={symptomHeight}> <View>
<View style={styles.symptomRow}> {symptomRowSymptoms.map(symptomName => symptomIconViews[symptomName])}
{typeof this.props.bleeding === 'number' &&
<Icon
name='drop'
size={12}
color={styles.bleedingIconShades[this.props.bleeding]}
key='bleeding'
/>
}
</View>
<View style={styles.symptomRow}>
{typeof this.props.mucus === 'number' &&
<View
{...styles.mucusIcon}
backgroundColor={styles.mucusIconShades[this.props.mucus]}
key='mucus'
/>
}
</View>
<View style={styles.symptomRow}>
{typeof this.props.cervix === 'number' &&
<View
{...styles.mucusIcon}
// cervix is sum of openess and firmness - fertile only when closed and hard (=0)
backgroundColor={this.props.cervix > 0 ? 'blue' : 'green'}
key='cervix'
/>
}
</View>
<View style={styles.symptomRow}>
{typeof this.props.sex === 'number' &&
<View
{...styles.mucusIcon}
backgroundColor='orange'
key='sex'
/>
}
</View>
<View style={styles.symptomRow}>
{typeof this.props.desire === 'number' &&
<View
{...styles.mucusIcon}
backgroundColor='red'
key='desire'
/>
}
</View>
<View style={styles.symptomRow}>
{this.props.pain &&
<View
{...styles.mucusIcon}
backgroundColor='blue'
key='pain'
/>
}
</View>
<View style={styles.symptomRow}>
{this.props.note &&
<View
{...styles.mucusIcon}
backgroundColor='green'
key='note'
/>
}
</View>
</View> </View>
<Svg width={config.columnWidth} height={columnHeight}> <Svg width={config.columnWidth} height={columnHeight}>
...@@ -193,3 +219,16 @@ export default class DayColumn extends Component { ...@@ -193,3 +219,16 @@ export default class DayColumn extends Component {
) )
} }
} }
function SymptomIconView(props) {
const style = [styles.symptomRow, {height: props.symptomHeight}]
return (
<View style={style}>
{(typeof props.value === 'number' || props.value === true || typeof props.value === 'string') &&
props.children
}
</View>
)
}
...@@ -95,8 +95,6 @@ const styles = { ...@@ -95,8 +95,6 @@ const styles = {
symptomRow: { symptomRow: {
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
width: '100%',
flex: 1
} }
} }
......
const config = { const config = {
columnWidth: 25, columnWidth: 25,
columnHeightPercentage: 0.62,
xAxisHeightPercentage: 0.08, xAxisHeightPercentage: 0.08,
symptomRowHeightPercentage: 0.30, symptomHeightPercentage: 0.05,
temperatureScale: { temperatureScale: {
defaultLow: 35, defaultLow: 35,
defaultHigh: 38, defaultHigh: 38,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment