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 (
)
}
return (
{/* 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 (
{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