import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import '../services/flux_service.dart'; class JournalScreen extends StatelessWidget { const JournalScreen({super.key}); @override Widget build(BuildContext context) { final flux = context.watch(); return Scaffold( backgroundColor: const Color(0xFFFFFBF0), appBar: AppBar( title: Text( "Journal", style: GoogleFonts.nunito(fontWeight: FontWeight.bold), ), ), body: ListView( padding: const EdgeInsets.all(24), children: [ Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( color: const Color(0xFF8D6E63).withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 5), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Weekly Flow", style: GoogleFonts.nunito( fontSize: 18, fontWeight: FontWeight.bold, color: const Color(0xFF5D4037), ), ), const SizedBox(height: 20), AspectRatio( aspectRatio: 1.6, child: BarChart( BarChartData( gridData: const FlGridData(show: false), titlesData: FlTitlesData( leftTitles: const AxisTitles( sideTitles: SideTitles(showTitles: false), ), rightTitles: const AxisTitles( sideTitles: SideTitles(showTitles: false), ), topTitles: const AxisTitles( sideTitles: SideTitles(showTitles: false), ), bottomTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, getTitlesWidget: (val, meta) => Padding( padding: const EdgeInsets.only(top: 8), child: Text( [ 'M', 'T', 'W', 'T', 'F', 'S', 'S', ][val.toInt() % 7], style: GoogleFonts.quicksand( color: const Color(0xFFA1887F), fontWeight: FontWeight.bold, ), ), ), ), ), ), borderData: FlBorderData(show: false), barGroups: flux.weeklyLogs.asMap().entries.map((e) { return BarChartGroupData( x: e.key, barRods: [ BarChartRodData( toY: e.value, color: e.value >= flux.dailyGoal ? const Color(0xFFAED581) : const Color(0xFFFFCC80), width: 14, borderRadius: BorderRadius.circular(6), backDrawRodData: BackgroundBarChartRodData( show: true, toY: 2500, color: const Color(0xFFF5F5F5), ), ), ], ); }).toList(), ), ), ), ], ), ), const SizedBox(height: 24), Text( "Today's Mix", style: GoogleFonts.nunito( fontSize: 18, fontWeight: FontWeight.bold, color: const Color(0xFF5D4037), ), ), const SizedBox(height: 12), ...flux.breakdown.entries.where((e) => e.value > 0).map((e) { return Container( margin: const EdgeInsets.only(bottom: 12), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), ), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: e.key.pastelColor.withOpacity(0.2), shape: BoxShape.circle, ), child: Icon(e.key.icon, color: e.key.pastelColor, size: 20), ), const SizedBox(width: 16), Text( e.key.label, style: GoogleFonts.quicksand( fontSize: 16, fontWeight: FontWeight.bold, color: const Color(0xFF5D4037), ), ), const Spacer(), Text( "${e.value.toInt()} ml", style: GoogleFonts.nunito( fontSize: 16, fontWeight: FontWeight.bold, color: const Color(0xFF8D6E63), ), ), ], ), ); }), if (flux.intake == 0) Center( child: Padding( padding: const EdgeInsets.all(20.0), child: Text( "No entries yet. Time for a cozy drink?", style: GoogleFonts.quicksand(color: const Color(0xFFA1887F)), ), ), ), ], ), ); } }