import { View, Text, StyleSheet, ScrollView } from 'react-native'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '@/lib/auth-store'; import { useRapport } from '@/hooks/useRapport'; import { useSaisies } from '@/hooks/useTracker'; import { Colors } from '@/lib/colors'; import { Spacing, Radius, FontSize, FontWeight, MIN_TOUCH } from '@/lib/theme'; import { AppBar, Card, Badge, SectionTitle, EmptyState, Loader } from '@/components/ui'; /** Tailles d'icônes et de pastilles (multiples de l'échelle 4px du DSFR). */ const ICON_LG = 28; const ACTION_ICON = 56; const EMOTION_ICON = 44; const EMOJI_SIZE = 22; export default function DashboardScreen() { const router = useRouter(); const { user } = useAuthStore(); const { data: rapport } = useRapport('month'); const { data: saisies, isLoading } = useSaisies(); const recentSaisies = (saisies || []).slice(0, 3); return ( {/* Actions rapides */} router.push('/(tabs)/journal/new')} padding={Spacing.lg} style={styles.actionPrimary}> Nouvelle saisie router.push('/(tabs)/journal/reports')} padding={Spacing.lg} style={styles.actionCard}> Mes rapports {/* Stats du mois */} {rapport && ( Ce mois-ci {rapport.stats.total_saisies} Saisies {rapport.stats.intensite_moyenne?.toFixed(1) || '—'} Intensité moy. {rapport.stats.emotion_dominante?.icone || '—'} {rapport.stats.emotion_dominante?.nom || 'Aucune'} )} {/* Dernières saisies */} Dernières saisies {recentSaisies.length > 0 && ( router.push('/(tabs)/journal')} accessibilityRole="link" > Tout voir )} {isLoading ? ( ) : recentSaisies.length === 0 ? ( router.push('/(tabs)/journal/new')} /> ) : ( recentSaisies.map((saisie) => ( router.push('/(tabs)/journal')} padding={Spacing.md} style={styles.saisieCard} > {saisie.emotion?.icone || '🔵'} {saisie.emotion?.couleur ? ( ) : ( )} {new Date(saisie.date_saisie).toLocaleDateString('fr-FR')} — Intensité {saisie.intensite}/10 )) )} ); } const styles = StyleSheet.create({ screen: { flex: 1, backgroundColor: Colors.gray[50] }, container: { flex: 1 }, content: { padding: Spacing.lg, paddingBottom: Spacing.xxxl }, actionsRow: { flexDirection: 'row', gap: Spacing.md, marginBottom: Spacing.xl }, actionCard: { flex: 1, alignItems: 'center', gap: Spacing.md }, actionPrimary: { flex: 1, alignItems: 'center', gap: Spacing.md, backgroundColor: Colors.primary, borderColor: Colors.primary, }, actionIcon: { width: ACTION_ICON, height: ACTION_ICON, borderRadius: Radius.sm, justifyContent: 'center', alignItems: 'center' }, actionIconPrimary: { backgroundColor: Colors.primaryDark }, actionIconSecondary: { backgroundColor: Colors.gray[100] }, actionText: { fontSize: FontSize.sm, fontWeight: FontWeight.semibold, color: Colors.black }, actionTextPrimary: { fontSize: FontSize.sm, fontWeight: FontWeight.bold, color: Colors.white }, block: { marginBottom: Spacing.xl }, statsRow: { flexDirection: 'row', alignItems: 'center' }, statCell: { flex: 1, alignItems: 'center', gap: Spacing.xs }, statDivider: { width: 1, alignSelf: 'stretch', backgroundColor: Colors.gray[200], marginVertical: Spacing.xs }, statValue: { fontSize: FontSize.xxl, fontWeight: FontWeight.heavy, color: Colors.primary }, statLabel: { fontSize: FontSize.tiny, color: Colors.gray[500], textAlign: 'center' }, sectionHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }, seeAll: { fontSize: FontSize.sm, fontWeight: FontWeight.semibold, color: Colors.primary, textDecorationLine: 'underline', minHeight: MIN_TOUCH, paddingTop: Spacing.xs, }, saisieCard: { flexDirection: 'row', alignItems: 'center', gap: Spacing.md, marginBottom: Spacing.sm }, emotionIcon: { width: EMOTION_ICON, height: EMOTION_ICON, borderRadius: Radius.sm, justifyContent: 'center', alignItems: 'center' }, emotionEmoji: { fontSize: EMOJI_SIZE }, saisieContent: { flex: 1, gap: Spacing.xs, alignItems: 'flex-start' }, saisieDate: { fontSize: FontSize.xs, color: Colors.gray[500] }, });