diff --git a/frontend/src/components/RestDaysWidget.jsx b/frontend/src/components/RestDaysWidget.jsx new file mode 100644 index 0000000..d04ff90 --- /dev/null +++ b/frontend/src/components/RestDaysWidget.jsx @@ -0,0 +1,120 @@ +import { useState, useEffect } from 'react' +import { useNavigate } from 'react-router-dom' +import { api } from '../utils/api' +import dayjs from 'dayjs' +import 'dayjs/locale/de' +dayjs.locale('de') + +const FOCUS_ICONS = { + muscle_recovery: '๐Ÿ’ช', + cardio_recovery: '๐Ÿƒ', + mental_rest: '๐Ÿง˜', + deload: '๐Ÿ“‰', + injury: '๐Ÿฉน', +} + +const FOCUS_LABELS = { + muscle_recovery: 'Muskelregeneration', + cardio_recovery: 'Cardio-Erholung', + mental_rest: 'Mentale Erholung', + deload: 'Deload', + injury: 'Verletzungspause', +} + +const FOCUS_COLORS = { + muscle_recovery: '#D85A30', + cardio_recovery: '#378ADD', + mental_rest: '#7B68EE', + deload: '#E67E22', + injury: '#E74C3C', +} + +export default function RestDaysWidget() { + const [todayRestDays, setTodayRestDays] = useState([]) + const [loading, setLoading] = useState(true) + const nav = useNavigate() + + useEffect(() => { + loadTodayRestDays() + }, []) + + const loadTodayRestDays = async () => { + try { + const today = dayjs().format('YYYY-MM-DD') + const allRestDays = await api.listRestDays(7) // Last 7 days + const todayOnly = allRestDays.filter(d => d.date === today) + setTodayRestDays(todayOnly) + } catch (err) { + console.error('Failed to load rest days:', err) + } finally { + setLoading(false) + } + } + + if (loading) { + return ( +
+
๐Ÿ›Œ Ruhetage
+
+ Lรคdt... +
+
+ ) + } + + return ( +
+
๐Ÿ›Œ Ruhetage
+ + {todayRestDays.length === 0 ? ( +
+ Heute kein Ruhetag geplant +
+ ) : ( +
+ {todayRestDays.map(day => { + const focus = day.rest_config?.focus || 'mental_rest' + const icon = FOCUS_ICONS[focus] || '๐Ÿ“…' + const label = FOCUS_LABELS[focus] || focus + const color = FOCUS_COLORS[focus] || '#888' + + return ( +
+
{icon}
+
+
+ {label} +
+ {day.note && ( +
+ {day.note} +
+ )} +
+
+ ) + })} +
+ )} + + +
+ ) +} diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx index 7c86135..35462f5 100644 --- a/frontend/src/pages/Dashboard.jsx +++ b/frontend/src/pages/Dashboard.jsx @@ -12,6 +12,7 @@ import TrialBanner from '../components/TrialBanner' import EmailVerificationBanner from '../components/EmailVerificationBanner' import TrainingTypeDistribution from '../components/TrainingTypeDistribution' import SleepWidget from '../components/SleepWidget' +import RestDaysWidget from '../components/RestDaysWidget' import { getInterpretation, getStatusColor, getStatusBg } from '../utils/interpret' import Markdown from '../utils/Markdown' import dayjs from 'dayjs' @@ -477,6 +478,11 @@ export default function Dashboard() { + {/* Rest Days Widget */} +
+ +
+ {/* Training Type Distribution */} {activities.length > 0 && (
diff --git a/frontend/src/pages/RestDaysPage.jsx b/frontend/src/pages/RestDaysPage.jsx index d8ad303..4f793f2 100644 --- a/frontend/src/pages/RestDaysPage.jsx +++ b/frontend/src/pages/RestDaysPage.jsx @@ -356,9 +356,14 @@ export default function RestDaysPage() { const isEditing = editing?.id === day.id const focus = day.rest_config?.focus || 'mental_rest' const preset = PRESETS.find(p => p.id === focus) + const isToday = day.date === dayjs().format('YYYY-MM-DD') return ( -
+
{isEditing ? (
@@ -399,8 +404,22 @@ export default function RestDaysPage() { alignItems: 'center', marginBottom: 8, }}> -
- {dayjs(day.date).format('DD. MMMM YYYY')} +
+
+ {dayjs(day.date).format('DD. MMMM YYYY')} +
+ {isToday && ( + + HEUTE + + )}