185 lines
6.6 KiB
Dart
185 lines
6.6 KiB
Dart
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<FluxService>();
|
|
|
|
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)),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|