import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { Moon, Plus } from 'lucide-react' import { api } from '../utils/api' /** * SleepWidget - Dashboard widget for sleep tracking (v9d Phase 2b) * * Shows: * - Last night's sleep (if exists) * - 7-day average * - Quick action button to add entry or view details */ export default function SleepWidget() { const nav = useNavigate() const [loading, setLoading] = useState(true) const [lastNight, setLastNight] = useState(null) const [stats, setStats] = useState(null) useEffect(() => { load() }, []) const load = () => { Promise.all([ api.listSleep(1), // Get last entry api.getSleepStats(7).catch(() => null) // Stats optional ]).then(([sleepData, statsData]) => { setLastNight(sleepData[0] || null) setStats(statsData) setLoading(false) }).catch(err => { console.error('Failed to load sleep widget:', err) setLoading(false) }) } const formatDuration = (minutes) => { const h = Math.floor(minutes / 60) const m = minutes % 60 return `${h}h ${m}min` } const renderStars = (quality) => { if (!quality) return '—' return '★'.repeat(quality) + '☆'.repeat(5 - quality) } if (loading) { return (
Schlaf
) } return (
Schlaf
{lastNight ? (
Letzte Nacht:
{lastNight.duration_formatted} {lastNight.quality && `· ${renderStars(lastNight.quality)}`}
{new Date(lastNight.date).toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit' })}
{stats && stats.total_nights > 0 && (
Ø 7 Tage:
{formatDuration(Math.round(stats.avg_duration_minutes))} {stats.avg_quality && ` · ${stats.avg_quality.toFixed(1)}/5`}
)}
) : (
Noch keine Einträge erfasst
)}
) }