import { useState, useEffect } from 'react' import { useAuth } from '../context/AuthContext' const API_URL = '/api' function ProgressPage({ onBack }) { const { user } = useAuth() const [measurements, setMeasurements] = useState([]) const [strength, setStrength] = useState([]) const [loading, setLoading] = useState(true) const [activeTab, setActiveTab] = useState('weight') useEffect(() => { fetchData() }, []) const fetchData = async () => { try { const [measurementsRes, strengthRes] = await Promise.all([ fetch(`${API_URL}/user/measurements/${user?.id || 1}`), fetch(`${API_URL}/user/strength/${user?.id || 1}`) ]) const measurementsData = await measurementsRes.json() const strengthData = await strengthRes.json() // Sort by date ascending for charts setMeasurements([...measurementsData].reverse()) setStrength([...strengthData].reverse()) setLoading(false) } catch (err) { console.error('Failed to fetch progress:', err) setLoading(false) } } if (loading) { return (

Laddar progress...

) } return (

Min progress

{/* Tab Navigation */}
{/* Weight Chart */} {activeTab === 'weight' && (

Viktutveckling

{measurements.length > 0 ? ( <> ) : ( )}
)} {/* Body Fat Chart */} {activeTab === 'bodyfat' && (

Kroppsfett

{measurements.filter(m => m.body_fat_pct).length > 0 ? ( <> m.body_fat_pct)} valueKey="body_fat_pct" unit="%" color="#10b981" /> m.body_fat_pct)} valueKey="body_fat_pct" unit="%" label="Kroppsfett" /> ) : ( )}
)} {/* Strength Charts */} {activeTab === 'strength' && (

Styrkerekord (1RM)

{strength.length > 0 ? (

🏋️ Bänkpress

s.bench_1rm)} valueKey="bench_1rm" unit="kg" color="#f59e0b" /> s.bench_1rm)} valueKey="bench_1rm" unit="kg" label="Bänkpress" />

🦵 Knäböj

s.squat_1rm)} valueKey="squat_1rm" unit="kg" color="#8b5cf6" /> s.squat_1rm)} valueKey="squat_1rm" unit="kg" label="Knäböj" />

💀 Marklyft

s.deadlift_1rm)} valueKey="deadlift_1rm" unit="kg" color="#ef4444" /> s.deadlift_1rm)} valueKey="deadlift_1rm" unit="kg" label="Marklyft" />
) : ( )}
)}
) } // Simple SVG Line Chart Component function SimpleLineChart({ data, valueKey, unit, color }) { if (!data || data.length === 0) return null const values = data.map(d => d[valueKey]).filter(v => v != null) if (values.length === 0) return null const min = Math.min(...values) * 0.95 const max = Math.max(...values) * 1.05 const range = max - min || 1 const width = 320 const height = 160 const padding = { top: 20, right: 20, bottom: 30, left: 50 } const chartWidth = width - padding.left - padding.right const chartHeight = height - padding.top - padding.bottom // Generate points const points = data.map((d, i) => { const x = padding.left + (i / Math.max(data.length - 1, 1)) * chartWidth const y = padding.top + chartHeight - ((d[valueKey] - min) / range) * chartHeight return { x, y, value: d[valueKey], date: d.created_at } }).filter(p => p.value != null) const pathD = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ') // Y-axis labels const yLabels = [min, (min + max) / 2, max].map(v => v.toFixed(1)) return (
{/* Grid lines */} {[0, 0.5, 1].map((ratio, i) => ( ))} {/* Y-axis labels */} {yLabels.map((label, i) => ( {label} ))} {/* Line */} {/* Points */} {points.map((p, i) => ( ))}
{formatDate(data[0]?.created_at)} {formatDate(data[data.length - 1]?.created_at)}
) } // Progress Statistics Component function ProgressStats({ data, valueKey, unit, label }) { if (!data || data.length === 0) return null const values = data.map(d => d[valueKey]).filter(v => v != null) if (values.length === 0) return null const current = values[values.length - 1] const first = values[0] const change = current - first const changePercent = ((change / first) * 100).toFixed(1) const trend = change > 0 ? '↑' : change < 0 ? '↓' : '→' const trendClass = change > 0 ? 'up' : change < 0 ? 'down' : 'neutral' return (
Nuvarande {current} {unit}
Första {first} {unit}
Förändring {trend} {Math.abs(change).toFixed(1)} {unit} ({changePercent}%)
) } function EmptyState({ message }) { return (
📊

{message}

Logga mätningar för att se din progress

) } function formatDate(dateStr) { if (!dateStr) return '-' const date = new Date(dateStr) return date.toLocaleDateString('sv-SE', { month: 'short', day: 'numeric' }) } export default ProgressPage