From 55785fe9e38e04b128e004bdf1cab10db1cf7d1e Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Sat, 27 Jun 2026 23:53:59 +0200 Subject: [PATCH] revert to three separate charts per metric --- src/components/WeightChart.tsx | 165 +++++++++++++-------------------- 1 file changed, 67 insertions(+), 98 deletions(-) diff --git a/src/components/WeightChart.tsx b/src/components/WeightChart.tsx index f2f743d..7ea663f 100644 --- a/src/components/WeightChart.tsx +++ b/src/components/WeightChart.tsx @@ -11,11 +11,50 @@ const COLORS = { muscleMass: '#2196F3', } -function normalize(values: number[]): number[] { - const min = Math.min(...values) - const max = Math.max(...values) - if (max === min) return values.map(() => 50) - return values.map(v => ((v - min) / (max - min)) * 100) +function SingleChart({ + title, + data, + labels, + color, + unit, +}: { + title: string + data: number[] + labels: string[] + color: string + unit: string +}) { + return ( + + {title} + color, strokeWidth: 2 }] }} + width={Dimensions.get('window').width - 32} + height={180} + yAxisSuffix={unit} + chartConfig={{ + backgroundColor: '#ffffff', + backgroundGradientFrom: '#ffffff', + backgroundGradientTo: '#ffffff', + decimalPlaces: 1, + color: (opacity = 1) => `rgba(${hexToRgb(color)}, ${opacity})`, + labelColor: () => '#666', + propsForDots: { r: '3' }, + }} + bezier + style={styles.chart} + withInnerLines={false} + fromZero={false} + /> + + ) +} + +function hexToRgb(hex: string): string { + const r = parseInt(hex.slice(1, 3), 16) + const g = parseInt(hex.slice(3, 5), 16) + const b = parseInt(hex.slice(5, 7), 16) + return `${r}, ${g}, ${b}` } export default function WeightChart({ measurements }: Props) { @@ -31,8 +70,6 @@ export default function WeightChart({ measurements }: Props) { cutoff.setDate(cutoff.getDate() - 30) const filtered = sorted.filter(m => new Date(m.measuredAt) >= cutoff) const dataPoints = filtered.length >= 2 ? filtered : sorted - const latest = dataPoints[dataPoints.length - 1] - const previous = dataPoints.length > 1 ? dataPoints[dataPoints.length - 2] : null const labels = dataPoints.map(m => { const d = new Date(m.measuredAt) @@ -42,96 +79,33 @@ export default function WeightChart({ measurements }: Props) { const labelStep = labels.length > 8 ? Math.ceil(labels.length / 8) : 1 const sparseLabels = labels.map((l, i) => (i % labelStep === 0 ? l : '')) - const weightData = dataPoints.map(m => m.weight) - const fatData = dataPoints.map(m => m.fatMass) - const muscleData = dataPoints.map(m => m.muscleMass) - return ( Voortgang (30 dagen) - COLORS.weight, strokeWidth: 2 }, - { data: normalize(fatData), color: () => COLORS.fatMass, strokeWidth: 2 }, - { data: normalize(muscleData), color: () => COLORS.muscleMass, strokeWidth: 2 }, - ], - }} - width={Dimensions.get('window').width - 32} - height={220} - chartConfig={{ - backgroundColor: '#ffffff', - backgroundGradientFrom: '#ffffff', - backgroundGradientTo: '#ffffff', - decimalPlaces: 0, - color: (opacity = 1) => `rgba(0, 0, 0, ${opacity})`, - labelColor: () => 'transparent', - propsForDots: { r: '3' }, - propsForLabels: { fontSize: 9 }, - }} - bezier - style={styles.chart} - withInnerLines={false} - fromZero={false} + + m.weight)} + labels={sparseLabels} + color={COLORS.weight} + unit=" kg" /> - - - - - - - ) -} + m.fatMass)} + labels={sparseLabels} + color={COLORS.fatMass} + unit=" kg" + /> -function MetricInfo({ - color, - label, - value, - prev, - unit, -}: { - color: string - label: string - value: number - prev?: number - unit: string -}) { - const diff = prev !== undefined ? value - prev : 0 - const sign = diff > 0 ? '+' : '' - return ( - - - - {label} - - - {value.toFixed(1)} {unit} - {prev !== undefined && ( - - {' '}{sign}{diff.toFixed(1)} - - )} - + m.muscleMass)} + labels={sparseLabels} + color={COLORS.muscleMass} + unit=" kg" + /> ) } @@ -139,12 +113,7 @@ function MetricInfo({ const styles = StyleSheet.create({ container: { marginHorizontal: 16, marginBottom: 16 }, title: { fontSize: 18, fontWeight: '700', marginBottom: 8 }, + chartBlock: { marginBottom: 12 }, + chartTitle: { fontSize: 13, fontWeight: '600', color: '#555', marginBottom: 4, marginLeft: 4 }, chart: { borderRadius: 12 }, - legend: { flexDirection: 'row', justifyContent: 'space-around', marginTop: 8, gap: 8 }, - metricItem: { alignItems: 'center', flex: 1 }, - metricRow: { flexDirection: 'row', alignItems: 'center', gap: 4, marginBottom: 2 }, - dot: { width: 8, height: 8, borderRadius: 4 }, - metricLabel: { fontSize: 11, color: '#888' }, - metricValue: { fontSize: 13, fontWeight: '600', color: '#333' }, - metricDiff: { fontSize: 11, color: '#999' }, })