/** * CommCoach Dashboard View * * Shows KPIs, streak, active contexts, and quick-start coaching entry. */ import React, { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { useCommcoachDashboard } from '../../../hooks/useCommcoachDashboard'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import styles from './CommcoachDashboardView.module.css'; import { useLanguage } from '../../../providers/language/LanguageContext'; export const CommcoachDashboardView: React.FC = () => { const { t } = useLanguage(); const navigate = useNavigate(); const { mandateId, instanceId } = useCurrentInstance(); const { dashboard, loading, error } = useCommcoachDashboard(); const handleContextClick = (contextId: string) => { if (mandateId && instanceId) { navigate(`/mandates/${mandateId}/commcoach/${instanceId}/coaching?context=${contextId}`); } }; const _handleNewTopic = useCallback(() => { if (mandateId && instanceId) { navigate(`/mandates/${mandateId}/commcoach/${instanceId}/coaching?newContext=true`); } }, [mandateId, instanceId, navigate]); const _categoryLabel = useCallback( (category: string) => { const labels: Record = { leadership: t('Führung'), conflict: t('Konflikt'), negotiation: t('Verhandlung'), presentation: t('Präsentation'), feedback: t('Feedback'), delegation: t('Delegation'), changeManagement: t('Change Management'), custom: t('Individuell'), }; return labels[category] || category; }, [t], ); if (loading && !dashboard) { return
{t('Dashboard wird geladen…')}
; } if (error) { return
{error}
; } if (!dashboard) { return
{t('Keine Daten verfügbar')}
; } return (
{/* KPI Cards */}
{dashboard.streakDays}
{t('Tage in Folge')}
{t('Rekord:')} {dashboard.longestStreak}
{dashboard.totalSessions}
{t('Sessions')}
{dashboard.totalMinutes} {t('Min. gesamt')}
{dashboard.averageScore != null ? Math.round(dashboard.averageScore) : '--'}
{t('Kompetenz-Score')}
{t('Durchschnitt')}
{dashboard.goalProgress != null ? `${dashboard.goalProgress}%` : '--'}
{t('Zielfortschritt')}
{t('{count} offene Aufgaben', { count: dashboard.openTasks })}
{/* Active Contexts */}

{t('Aktive Coaching-Themen')}

{dashboard.contexts.length === 0 ? (

{t('Noch keine Coaching-Themen angelegt.')}

{t('Klicken Sie auf "Neues Thema" um zu starten.')}

) : (
{dashboard.contexts.map(ctx => (
handleContextClick(ctx.id)} role="button" tabIndex={0} onKeyDown={e => e.key === 'Enter' && handleContextClick(ctx.id)} >
{ctx.title}
{_categoryLabel(ctx.category)} {ctx.sessionCount} {t('Sessions')} {ctx.goalProgress != null && ( {t('Ziele: {pct}%', { pct: ctx.goalProgress })} )}
{ctx.lastSessionAt && (
{t('Letzte Session:')} {_formatDate(ctx.lastSessionAt)}
)}
))}
)}
{/* Level + Badges */} {(dashboard.level || (dashboard.badges && dashboard.badges.length > 0)) && (

{dashboard.level ? t('Level {num}: {label}', { num: dashboard.level.number, label: dashboard.level.label, }) : t('Auszeichnungen')}

{dashboard.badges && dashboard.badges.length > 0 && (
{dashboard.badges.map(b => (
{_badgeIcon(b.icon)}
{b.label || b.badgeKey}
))}
)}
)} {/* Quick Start */}

{t('Tipp des Tages')}

{t( 'Konsistenz schlägt Intensität. Auch 10 Minuten tägliches Coaching-Gespräch bringt messbare Fortschritte in deiner Kommunikationskompetenz.', )}

); }; function _badgeIcon(icon?: string): string { const icons: Record = { star: '\u2605', fire: '\u{1F525}', trophy: '\u{1F3C6}', medal: '\u{1F3C5}', layers: '\u{1F4DA}', theater: '\u{1F3AD}', compass: '\u{1F9ED}', 'check-circle': '\u2714', }; return icons[icon || 'star'] || '\u2605'; } function _formatDate(isoStr: string): string { try { const d = new Date(isoStr); return d.toLocaleDateString('de-CH', { day: '2-digit', month: '2-digit', year: 'numeric' }); } catch { return isoStr; } } export default CommcoachDashboardView;