From a9a24fe6e0c5d5b189ed7bea46cc4bc6c74e82c4 Mon Sep 17 00:00:00 2001 From: thallars Date: Sun, 30 Jun 2024 11:59:06 +0300 Subject: [PATCH 01/11] added statistics screen with bar and line charts --- lib/bar_graph/bar_data.dart | 16 +++++ lib/bar_graph/individual_bar.dart | 11 ++++ lib/bar_graph/sleep_amount_bar.dart | 91 +++++++++++++++++++++++++++++ lib/line_graph/line_data.dart | 16 +++++ lib/line_graph/line_point.dart | 9 +++ lib/line_graph/rating_line.dart | 69 ++++++++++++++++++++++ lib/statistics_screen.dart | 52 +++++++++++++++++ pubspec.yaml | 1 + 8 files changed, 265 insertions(+) create mode 100644 lib/bar_graph/bar_data.dart create mode 100644 lib/bar_graph/individual_bar.dart create mode 100644 lib/bar_graph/sleep_amount_bar.dart create mode 100644 lib/line_graph/line_data.dart create mode 100644 lib/line_graph/line_point.dart create mode 100644 lib/line_graph/rating_line.dart create mode 100644 lib/statistics_screen.dart diff --git a/lib/bar_graph/bar_data.dart b/lib/bar_graph/bar_data.dart new file mode 100644 index 0000000..3231511 --- /dev/null +++ b/lib/bar_graph/bar_data.dart @@ -0,0 +1,16 @@ +import 'individual_bar.dart'; + +// TODO +class BarData { + final List amounts; + List barData = []; + + BarData({required this.amounts}); + + void initBarData() { + barData = List.generate( + amounts.length, + (index) => IndividualBar(day: Day.values[index%7], amount: amounts[index]), + ); + } +} \ No newline at end of file diff --git a/lib/bar_graph/individual_bar.dart b/lib/bar_graph/individual_bar.dart new file mode 100644 index 0000000..e408ff3 --- /dev/null +++ b/lib/bar_graph/individual_bar.dart @@ -0,0 +1,11 @@ +enum Day { sun, mon, tue, wed, thu, fri, sat } + +class IndividualBar { + final Day day; + final double amount; + + IndividualBar({ + required this.day, + required this.amount + }); +} \ No newline at end of file diff --git a/lib/bar_graph/sleep_amount_bar.dart b/lib/bar_graph/sleep_amount_bar.dart new file mode 100644 index 0000000..1e73ab3 --- /dev/null +++ b/lib/bar_graph/sleep_amount_bar.dart @@ -0,0 +1,91 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +import 'bar_data.dart'; + +class SleepAmountBar extends StatelessWidget { + final List weeklySummary; + + const SleepAmountBar({ + super.key, + required this.weeklySummary, + }); + + @override + Widget build(BuildContext context) { + // initialize bar data + BarData sleepAmountBarData = BarData(amounts: weeklySummary); + sleepAmountBarData.initBarData(); + + return BarChart( + BarChartData( + maxY: 20, + minY: 0, + gridData: const FlGridData(show: false), + borderData: FlBorderData(show: false), + // bar chart titles + titlesData: const FlTitlesData( + show: true, + topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 40, + getTitlesWidget: getBottomTitles, + ), + ), + ), + barGroups: sleepAmountBarData.barData.map((data) { + return BarChartGroupData( + x: data.day.index, + barRods: [ + BarChartRodData( + // bar chart rogs style + toY: data.amount, + color: Colors.indigo, + width: 25, + borderRadius: BorderRadius.circular(5), + // bar chart rogs background + backDrawRodData: BackgroundBarChartRodData( + show: true, + toY: 20, + color: Colors.indigo.withOpacity(0.2), + ), + ), + ], + ); + }).toList(), + // bubble with amount of sleep hours in each day + // appears when you touch the bar + // read more here: https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#BarTouchTooltipData + barTouchData: BarTouchData( + touchTooltipData: BarTouchTooltipData( + tooltipRoundedRadius: 15, + getTooltipColor: (_) => Colors.white, + ), + ), + ), + ); + } +} + +Widget getBottomTitles(double value, TitleMeta meta) { + // bar chart titles style + const style = TextStyle( + color: Colors.indigo, + fontWeight: FontWeight.bold, + fontSize: 14, + ); + + final days = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; + final text = value >= 0 && value < days.length + ? Text(days[value.toInt()], style: style) + : const Text(''); + + return SideTitleWidget( + axisSide: meta.axisSide, + child: text, + ); +} \ No newline at end of file diff --git a/lib/line_graph/line_data.dart b/lib/line_graph/line_data.dart new file mode 100644 index 0000000..fe63a5c --- /dev/null +++ b/lib/line_graph/line_data.dart @@ -0,0 +1,16 @@ +import 'line_point.dart'; + +//TODO +class LineData { + final List ratings; + List lineData = []; + + LineData({required this.ratings}); + + void initLineData() { + lineData = List.generate( + ratings.length, + (index) => LinePoint(date: index.toDouble(), rating: ratings[index]), + ); + } +} \ No newline at end of file diff --git a/lib/line_graph/line_point.dart b/lib/line_graph/line_point.dart new file mode 100644 index 0000000..2849bac --- /dev/null +++ b/lib/line_graph/line_point.dart @@ -0,0 +1,9 @@ +class LinePoint { + final double date; + final int rating; + + LinePoint({ + required this.date, + required this.rating, + }); +} \ No newline at end of file diff --git a/lib/line_graph/rating_line.dart b/lib/line_graph/rating_line.dart new file mode 100644 index 0000000..f8c4f66 --- /dev/null +++ b/lib/line_graph/rating_line.dart @@ -0,0 +1,69 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +import 'line_data.dart'; + +class RatingLine extends StatelessWidget { + final List weeklyRatings; + + const RatingLine({ + super.key, + required this.weeklyRatings + }); + + @override + Widget build(BuildContext context) { + // initialize line data + LineData ratingLineData = LineData(ratings: weeklyRatings); + ratingLineData.initLineData(); + + return LineChart( + LineChartData( + maxY: 5, + minY: -5, + gridData: const FlGridData( + show: false, + drawHorizontalLine: false, + ), + borderData: FlBorderData(show: false), + // line titles + titlesData: const FlTitlesData( + show: true, + topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + // TODO: smart bottom titles + bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), + ), + lineBarsData: [ + LineChartBarData( + spots: ratingLineData.lineData.map( + (rating) => FlSpot(rating.date, rating.rating.toDouble()), + ).toList(), + // line style + // read more here: https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#LineChartBarData + isCurved: true, + gradient: const LinearGradient( + colors: [ + Colors.indigoAccent, + Colors.indigo, + ], + ), + barWidth: 4, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), // hide points on line + ), + ], + // bubble with rating of each session in the week + // appears when you touch the line + // read more here: https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#LineTouchTooltipData + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipRoundedRadius: 15, + getTooltipColor: (_) => Colors.white, + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/statistics_screen.dart b/lib/statistics_screen.dart new file mode 100644 index 0000000..010b099 --- /dev/null +++ b/lib/statistics_screen.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import 'bar_graph/sleep_amount_bar.dart'; +import 'line_graph/rating_line.dart'; + +class StatisticsScreen extends StatefulWidget { + const StatisticsScreen({super.key}); + + @override + State createState() => _StatisticsScreenState(); +} + +class _StatisticsScreenState extends State { + int selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Put week dates here'), + actions: [ + IconButton( + onPressed: () {}, + icon: const Icon(Icons.chevron_left), + ), + IconButton( + onPressed: () {}, + icon: const Icon(Icons.chevron_right), + ), + ], + ), + body: Center( + child: Column( + // add here some nice aligment pls + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: MediaQuery.sizeOf(context).height * 0.3, + child: const SleepAmountBar(weeklySummary: [5, 8, 9, 7, 6, 8, 10]), + ), + SizedBox(height: MediaQuery.sizeOf(context).height * 0.1), + SizedBox( + height: MediaQuery.sizeOf(context).height * 0.3, + width: MediaQuery.sizeOf(context).width * 0.85, + child: const RatingLine(weeklyRatings: [3, 0, 2, -1, -5, 4, 2, 5, 0, 1]), + ), + ], + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 4aff381..a67868c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 + fl_chart: ^0.68.0 hive_flutter: ^1.1.0 flutter_riverpod: ^2.5.1 collection: ^1.18.0 From 4e1779dee6f513276168f52b4986e9e27fff3fbc Mon Sep 17 00:00:00 2001 From: thallars Date: Sun, 30 Jun 2024 22:26:49 +0300 Subject: [PATCH 02/11] statisctics screen now uses session history provider to display stored sessions statistics --- lib/bar_graph/bar_data.dart | 4 +- lib/bar_graph/individual_bar.dart | 6 +-- lib/bar_graph/sleep_amount_bar.dart | 2 +- lib/line_graph/line_data.dart | 1 - lib/statistics_screen.dart | 67 +++++++++++++++++++++++++---- pubspec.yaml | 1 + 6 files changed, 64 insertions(+), 17 deletions(-) diff --git a/lib/bar_graph/bar_data.dart b/lib/bar_graph/bar_data.dart index 3231511..be7b531 100644 --- a/lib/bar_graph/bar_data.dart +++ b/lib/bar_graph/bar_data.dart @@ -1,6 +1,6 @@ +import 'package:shleappy/data/session.dart'; import 'individual_bar.dart'; -// TODO class BarData { final List amounts; List barData = []; @@ -10,7 +10,7 @@ class BarData { void initBarData() { barData = List.generate( amounts.length, - (index) => IndividualBar(day: Day.values[index%7], amount: amounts[index]), + (index) => IndividualBar(day: index, amount: amounts[index]), ); } } \ No newline at end of file diff --git a/lib/bar_graph/individual_bar.dart b/lib/bar_graph/individual_bar.dart index e408ff3..b65909b 100644 --- a/lib/bar_graph/individual_bar.dart +++ b/lib/bar_graph/individual_bar.dart @@ -1,8 +1,6 @@ -enum Day { sun, mon, tue, wed, thu, fri, sat } - class IndividualBar { - final Day day; - final double amount; + int day; + double amount; IndividualBar({ required this.day, diff --git a/lib/bar_graph/sleep_amount_bar.dart b/lib/bar_graph/sleep_amount_bar.dart index 1e73ab3..77007d3 100644 --- a/lib/bar_graph/sleep_amount_bar.dart +++ b/lib/bar_graph/sleep_amount_bar.dart @@ -39,7 +39,7 @@ class SleepAmountBar extends StatelessWidget { ), barGroups: sleepAmountBarData.barData.map((data) { return BarChartGroupData( - x: data.day.index, + x: data.day/* .index */, barRods: [ BarChartRodData( // bar chart rogs style diff --git a/lib/line_graph/line_data.dart b/lib/line_graph/line_data.dart index fe63a5c..21ea529 100644 --- a/lib/line_graph/line_data.dart +++ b/lib/line_graph/line_data.dart @@ -1,6 +1,5 @@ import 'line_point.dart'; -//TODO class LineData { final List ratings; List lineData = []; diff --git a/lib/statistics_screen.dart b/lib/statistics_screen.dart index 010b099..1cbe646 100644 --- a/lib/statistics_screen.dart +++ b/lib/statistics_screen.dart @@ -1,30 +1,78 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:intl/intl.dart'; import 'bar_graph/sleep_amount_bar.dart'; import 'line_graph/rating_line.dart'; +import 'data/session.dart'; +import 'data/history.dart'; -class StatisticsScreen extends StatefulWidget { +class StatisticsScreen extends ConsumerStatefulWidget { const StatisticsScreen({super.key}); @override - State createState() => _StatisticsScreenState(); + ConsumerState createState() => _StatisticsScreenState(); } -class _StatisticsScreenState extends State { - int selectedIndex = 0; +class _StatisticsScreenState extends ConsumerState { + DateTime _currentStartOfWeek = _getStartOfWeek(DateTime.now()); + + static DateTime _getStartOfWeek(DateTime date) { + int daysToSubtract = date.weekday % 7; + return DateTime(date.year, date.month, date.day - daysToSubtract); + } + + void _goToPreviousWeek() { + setState(() { + _currentStartOfWeek = _currentStartOfWeek.subtract(const Duration(days: 7)); + }); + } + + void _goToNextWeek() { + setState(() { + _currentStartOfWeek = _currentStartOfWeek.add(const Duration(days: 7)); + }); + } + + List getAmounts(List sessions) { + List result = List.filled(7, 0); + for (var session in sessions) { + if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6)))) continue; + int day = session.ended.weekday % 7; + result[day] += session.durationInMins / 60; + } + return result; + } + + List getRatings(List sessions) { + List result = []; + for (var session in sessions) { + if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6)))) continue; + result.add(session.quality.index); + } + return result; + } @override Widget build(BuildContext context) { + final endOfWeek = _currentStartOfWeek.add(const Duration(days: 6)); + final sleepSessions = ref.watch(SleepSessionHistoryNotifier.provider).intervalInDays(_currentStartOfWeek, endOfWeek); + // sessions to test + /* final sleepSessions = [ + SleepSession(started: DateTime(2024, 7, 6, 21), ended: DateTime(2024, 7, 7, 7), quality: SleepQuality.none), + SleepSession(started: DateTime(2024, 6, 30, 10), ended: DateTime(2024, 6, 30, 12), quality: SleepQuality.none), + ]; */ + return Scaffold( appBar: AppBar( - title: const Text('Put week dates here'), + title: Text('${DateFormat.MMMd().format(_currentStartOfWeek)} - ${DateFormat.MMMd().format(endOfWeek)}'), actions: [ IconButton( - onPressed: () {}, + onPressed: _goToPreviousWeek, icon: const Icon(Icons.chevron_left), ), IconButton( - onPressed: () {}, + onPressed: _goToNextWeek, icon: const Icon(Icons.chevron_right), ), ], @@ -36,13 +84,14 @@ class _StatisticsScreenState extends State { children: [ SizedBox( height: MediaQuery.sizeOf(context).height * 0.3, - child: const SleepAmountBar(weeklySummary: [5, 8, 9, 7, 6, 8, 10]), + width: MediaQuery.sizeOf(context).width * 0.9, + child: SleepAmountBar(weeklySummary: getAmounts(sleepSessions)), ), SizedBox(height: MediaQuery.sizeOf(context).height * 0.1), SizedBox( height: MediaQuery.sizeOf(context).height * 0.3, width: MediaQuery.sizeOf(context).width * 0.85, - child: const RatingLine(weeklyRatings: [3, 0, 2, -1, -5, 4, 2, 5, 0, 1]), + child: RatingLine(weeklyRatings: getRatings(sleepSessions)), ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index a67868c..846a449 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: hive_flutter: ^1.1.0 flutter_riverpod: ^2.5.1 collection: ^1.18.0 + intl: ^0.19.0 dev_dependencies: flutter_test: From 565cef42cb11c96b5a4cf77e57a993ef2c1f2350 Mon Sep 17 00:00:00 2001 From: thallars Date: Mon, 1 Jul 2024 14:03:16 +0300 Subject: [PATCH 03/11] statisctics screen now use Date to call intervalInDays --- lib/statistics_screen.dart | 9 ++++++--- pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/statistics_screen.dart b/lib/statistics_screen.dart index 1cbe646..1e321ca 100644 --- a/lib/statistics_screen.dart +++ b/lib/statistics_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:date_only_field/date_only_field_with_extensions.dart'; import 'package:intl/intl.dart'; import 'bar_graph/sleep_amount_bar.dart'; @@ -37,7 +38,8 @@ class _StatisticsScreenState extends ConsumerState { List getAmounts(List sessions) { List result = List.filled(7, 0); for (var session in sessions) { - if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6)))) continue; + if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6))) + || session.ended.isBefore(_currentStartOfWeek)) continue; int day = session.ended.weekday % 7; result[day] += session.durationInMins / 60; } @@ -47,7 +49,8 @@ class _StatisticsScreenState extends ConsumerState { List getRatings(List sessions) { List result = []; for (var session in sessions) { - if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6)))) continue; + if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6))) + || session.ended.isBefore(_currentStartOfWeek)) continue; result.add(session.quality.index); } return result; @@ -56,7 +59,7 @@ class _StatisticsScreenState extends ConsumerState { @override Widget build(BuildContext context) { final endOfWeek = _currentStartOfWeek.add(const Duration(days: 6)); - final sleepSessions = ref.watch(SleepSessionHistoryNotifier.provider).intervalInDays(_currentStartOfWeek, endOfWeek); + final sleepSessions = ref.watch(SleepSessionHistoryNotifier.provider).intervalInDays(Date.fromDateTime(_currentStartOfWeek), Date.fromDateTime(endOfWeek)); // sessions to test /* final sleepSessions = [ SleepSession(started: DateTime(2024, 7, 6, 21), ended: DateTime(2024, 7, 7, 7), quality: SleepQuality.none), diff --git a/pubspec.yaml b/pubspec.yaml index 513f79d..9097be1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,7 +39,7 @@ dependencies: hive_flutter: ^1.1.0 flutter_riverpod: ^2.5.1 date_only_field: ^0.0.14 - intl: ^0.19.0 + intl: ^0.18.1 dev_dependencies: flutter_test: From 7ffa7a4aaa9778b758f27bf7fb68e0a7b0ee7a74 Mon Sep 17 00:00:00 2001 From: thallars Date: Mon, 1 Jul 2024 22:14:07 +0300 Subject: [PATCH 04/11] session's quality now considered as int --- lib/line_graph/rating_line.dart | 2 +- lib/statistics_screen.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/line_graph/rating_line.dart b/lib/line_graph/rating_line.dart index f8c4f66..25dd9b7 100644 --- a/lib/line_graph/rating_line.dart +++ b/lib/line_graph/rating_line.dart @@ -20,7 +20,7 @@ class RatingLine extends StatelessWidget { return LineChart( LineChartData( maxY: 5, - minY: -5, + minY: 0, gridData: const FlGridData( show: false, drawHorizontalLine: false, diff --git a/lib/statistics_screen.dart b/lib/statistics_screen.dart index 1e321ca..995ab89 100644 --- a/lib/statistics_screen.dart +++ b/lib/statistics_screen.dart @@ -51,7 +51,7 @@ class _StatisticsScreenState extends ConsumerState { for (var session in sessions) { if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6))) || session.ended.isBefore(_currentStartOfWeek)) continue; - result.add(session.quality.index); + result.add(session.quality); } return result; } From 5db8143bc8c1804115f1ba27e4c038669ea92148 Mon Sep 17 00:00:00 2001 From: Demetrius Date: Tue, 2 Jul 2024 08:28:48 +0300 Subject: [PATCH 05/11] feat: hidden button to create fake entries --- lib/screens/calendar_screen.dart | 30 +-- lib/screens/dialogs/dialog_windows.dart | 245 +++++++++++++++++------- lib/screens/home_screen.dart | 12 ++ pubspec.lock | 40 ++++ pubspec.yaml | 1 + 5 files changed, 250 insertions(+), 78 deletions(-) diff --git a/lib/screens/calendar_screen.dart b/lib/screens/calendar_screen.dart index cbfdef1..5edeedb 100644 --- a/lib/screens/calendar_screen.dart +++ b/lib/screens/calendar_screen.dart @@ -16,19 +16,21 @@ class CalendarScreen extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final chosenProvider = sleepWeekWidget.chosenProvider; final SleepSession? chosen = ref.watch(chosenProvider); - return Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - flex: 3, - child: sleepWeekWidget, - ), - Expanded( - flex: 5, - child: _sessionInfoWithBorder(chosen, context, ref), - ), - ], + return SafeArea( + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + flex: 3, + child: sleepWeekWidget, + ), + Expanded( + flex: 5, + child: _sessionInfoWithBorder(chosen, context, ref), + ), + ], + ), ), ); } @@ -116,7 +118,7 @@ class CalendarScreen extends ConsumerWidget { ), Align( alignment: Alignment.bottomRight, - child: Visibility.maintain( + child: Visibility( visible: chosen != null, child: Padding( padding: const EdgeInsets.all(16), diff --git a/lib/screens/dialogs/dialog_windows.dart b/lib/screens/dialogs/dialog_windows.dart index afd6a6e..1608aa3 100644 --- a/lib/screens/dialogs/dialog_windows.dart +++ b/lib/screens/dialogs/dialog_windows.dart @@ -1,9 +1,10 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' hide DatePickerTheme; import 'package:shleappy/data/history.dart'; import 'package:shleappy/data/session.dart'; import 'package:shleappy/screens/dialogs/mood_selection.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shleappy/screens/home_screen.dart'; +import 'package:omni_datetime_picker/omni_datetime_picker.dart' as dtp; final ratingProvider = StateProvider((ref) => 1); @@ -11,61 +12,175 @@ class DialogWindows { static void showFeedbackDialog(BuildContext context, WidgetRef ref) { final TextEditingController controller = TextEditingController(); showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - content: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox( - height: 35, - ), - Text("How did you sleep?", - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.w200, - color: Theme.of(context).focusColor)), - const SizedBox( - height: 35, - ), - RatingStars( - leftCaption: "Terrible", - rightCaption: "Great", - ), - const SizedBox( - height: 25, - ), - Text("Leave additional comments", - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.w100, - color: Theme.of(context).shadowColor)), - const SizedBox( - height: 5, - ), - SizedBox( - width: 250, - child: TextField( - controller: controller, - style: TextStyle(color: Theme.of(context).focusColor), - decoration: InputDecoration( - border: OutlineInputBorder( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + content: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("How did you sleep?", + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.w200, + color: Theme.of(context).focusColor)), + const SizedBox( + height: 35, + ), + RatingStars( + leftCaption: "Terrible", + rightCaption: "Great", + ), + const SizedBox( + height: 25, + ), + Text("Leave additional comments", + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w100, + color: Theme.of(context).shadowColor)), + const SizedBox( + height: 5, + ), + SizedBox( + width: 250, + child: TextField( + controller: controller, + style: TextStyle(color: Theme.of(context).focusColor), + decoration: InputDecoration( + border: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).shadowColor, + ), + ), + ), + ), + ), + const SizedBox( + height: 25, + ), + SizedBox( + height: 60, + width: 170, + child: OutlinedButton( + onPressed: () { + String text = controller.text; + ref + .read(SleepSessionHistoryNotifier.provider.notifier) + .putItem(SleepSession( + started: ref.read(startSleepTimeProvider), + ended: ref.read(endSleepTimeProvider), + quality: ref.read(ratingProvider), + comment: text)); + + ref.read(ratingProvider.notifier).state = 1; + Navigator.of(context).pop(); + }, + child: Text( + "Proceed", + style: TextStyle(color: Theme.of(context).focusColor), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); + } + + //TODO dev only!! + static void showEditorDialog(BuildContext context, WidgetRef ref) { + final TextEditingController controller = TextEditingController(); + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + content: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + child: const Text("Start time"), + onPressed: () { + dtp + .showOmniDateTimePicker( + context: context, + initialDate: DateTime.now(), + ) + .then((value) { + ref.read(startSleepTimeProvider.notifier).state = + value!; + }); + }, + ), + TextButton( + child: const Text("End time"), + onPressed: () { + dtp + .showOmniDateTimePicker( + context: context, + initialDate: DateTime.now(), + ) + .then((value) { + ref.read(endSleepTimeProvider.notifier).state = value!; + }); + }, + ), + Text("How did you sleep?", + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.w200, + color: Theme.of(context).focusColor)), + const SizedBox( + height: 35, + ), + RatingStars( + leftCaption: "Terrible", + rightCaption: "Great", + ), + const SizedBox( + height: 25, + ), + Text("Leave additional comments", + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w100, + color: Theme.of(context).shadowColor)), + const SizedBox( + height: 5, + ), + SizedBox( + width: 250, + child: TextField( + controller: controller, + style: TextStyle(color: Theme.of(context).focusColor), + decoration: InputDecoration( + border: OutlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).shadowColor, - )), + color: Theme.of(context).shadowColor, + ), + ), + ), ), ), - ), - const SizedBox( - height: 25, - ), - SizedBox( - height: 60, - width: 170, - child: OutlinedButton( + const SizedBox( + height: 25, + ), + SizedBox( + height: 60, + width: 170, + child: OutlinedButton( onPressed: () { String text = controller.text; ref @@ -79,16 +194,18 @@ class DialogWindows { ref.read(ratingProvider.notifier).state = 1; Navigator.of(context).pop(); }, - child: Text("Proceed", - style: - TextStyle(color: Theme.of(context).focusColor))), - ), - const SizedBox( - height: 35, - ), - ], - )), - ); - }); + child: Text( + "Proceed", + style: TextStyle(color: Theme.of(context).focusColor), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); } } diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 65d87a7..914ef38 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -17,6 +17,18 @@ class HomeScreen extends ConsumerWidget { PreferredSizeWidget _homeAppBar(BuildContext context) { return AppBar( backgroundColor: Theme.of(context).splashColor, + // TODO dev only!! + leading: Visibility.maintain( + visible: false, + child: Consumer( + builder: (context, ref, widget) => IconButton( + icon: const Icon(Icons.add), + onPressed: () { + DialogWindows.showEditorDialog(context, ref); + }, + ), + ), + ), actions: [ Padding( padding: const EdgeInsets.all(8.0), diff --git a/pubspec.lock b/pubspec.lock index ec11a90..27f7c96 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -46,6 +46,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" boolean_selector: dependency: transitive description: @@ -219,6 +227,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: transitive + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" flutter_lints: dependency: "direct dev" description: @@ -368,6 +384,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + omni_datetime_picker: + dependency: "direct dev" + description: + name: omni_datetime_picker + sha256: "554eb966e84f8d196cf6e189384141db46a79a192d1a360277ead98e5d6036bd" + url: "https://pub.dev" + source: hosted + version: "2.0.2" package_config: dependency: transitive description: @@ -448,6 +480,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pub_semver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 550b92d..9730465 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,6 +46,7 @@ dev_dependencies: custom_lint: riverpod_lint: ^2.3.12 flutter_lints: ^3.0.0 + omni_datetime_picker: ^2.0.2 dependency_overrides: analyzer: '>=6.5.0 <7.0.0' # Adjust the version range as needed From 65c15a6774e5ef74f8e89360f7118cf9397efa75 Mon Sep 17 00:00:00 2001 From: Demetrius Date: Tue, 2 Jul 2024 09:11:19 +0300 Subject: [PATCH 06/11] fix: statistics screen --- lib/screens/statistics_screen.dart | 132 ++++++++++++++++------------- lib/statistics_screen.dart | 104 ----------------------- 2 files changed, 71 insertions(+), 165 deletions(-) delete mode 100644 lib/statistics_screen.dart diff --git a/lib/screens/statistics_screen.dart b/lib/screens/statistics_screen.dart index 93d3504..b66775d 100644 --- a/lib/screens/statistics_screen.dart +++ b/lib/screens/statistics_screen.dart @@ -1,96 +1,106 @@ import 'package:flutter/material.dart'; - +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:date_only_field/date_only_field_with_extensions.dart'; +import 'package:intl/intl.dart'; import 'package:shleappy/bar_graph/sleep_amount_bar.dart'; +import 'package:shleappy/data/history.dart'; +import 'package:shleappy/data/session.dart'; import 'package:shleappy/line_graph/rating_line.dart'; -class StatisticsScreen extends StatefulWidget { +class StatisticsScreen extends ConsumerStatefulWidget { const StatisticsScreen({super.key}); @override - State createState() => _StatisticsScreenState(); + ConsumerState createState() => _StatisticsScreenState(); } -class _StatisticsScreenState extends State { - int selectedIndex = 0; +class _StatisticsScreenState extends ConsumerState { + DateTime _currentStartOfWeek = _getStartOfWeek(DateTime.now()); + + static DateTime _getStartOfWeek(DateTime date) { + int daysToSubtract = date.weekday % 7; + return DateTime(date.year, date.month, date.day - daysToSubtract); + } + + void _goToPreviousWeek() { + setState(() { + _currentStartOfWeek = + _currentStartOfWeek.subtract(const Duration(days: 7)); + }); + } + + void _goToNextWeek() { + setState(() { + _currentStartOfWeek = _currentStartOfWeek.add(const Duration(days: 7)); + }); + } + + List getAmounts(List sessions) { + List result = List.filled(7, 0); + for (var session in sessions) { + if (session.ended + .isAfter(_currentStartOfWeek.add(const Duration(days: 6))) || + session.ended.isBefore(_currentStartOfWeek)) continue; + int day = session.ended.weekday % 7; + result[day] += session.durationInMins / 60; + } + return result; + } + + List getRatings(List sessions) { + List result = []; + for (var session in sessions) { + if (session.ended + .isAfter(_currentStartOfWeek.add(const Duration(days: 6))) || + session.ended.isBefore(_currentStartOfWeek)) continue; + result.add(session.quality); + } + return result; + } @override Widget build(BuildContext context) { - double screenWidth = MediaQuery.of(context).size.width; - double screenHeight = MediaQuery.of(context).size.height; + final endOfWeek = _currentStartOfWeek.add(const Duration(days: 6)); + final sleepSessions = ref + .watch(SleepSessionHistoryNotifier.provider) + .intervalInDays(Date.fromDateTime(_currentStartOfWeek), + Date.fromDateTime(endOfWeek)); + // sessions to test + /* final sleepSessions = [ + SleepSession(started: DateTime(2024, 7, 6, 21), ended: DateTime(2024, 7, 7, 7), quality: SleepQuality.none), + SleepSession(started: DateTime(2024, 6, 30, 10), ended: DateTime(2024, 6, 30, 12), quality: SleepQuality.none), + ]; */ return Scaffold( appBar: AppBar( title: Text( - 'Put week dates here', - style: TextStyle(color: Theme.of(context).focusColor), - ), // TODO put weeks dates - + '${DateFormat.MMMd().format(_currentStartOfWeek)} - ${DateFormat.MMMd().format(endOfWeek)}'), actions: [ IconButton( - onPressed: () {}, + onPressed: _goToPreviousWeek, icon: const Icon(Icons.chevron_left), ), - IconButton( - onPressed: () {}, + onPressed: _goToNextWeek, icon: const Icon(Icons.chevron_right), ), ], - backgroundColor: Theme.of(context).scaffoldBackgroundColor, ), - body: Center( child: Column( + // add here some nice aligment pls mainAxisAlignment: MainAxisAlignment.center, children: [ - SizedBox(height: MediaQuery.sizeOf(context).height * 0.01), - - Text( - 'Sleep Hours per Day', - style: TextStyle( - fontSize: 28, - fontWeight: FontWeight.w800, - fontFamily: 'CupertinoSystemDisplay', - color: Theme.of(context).focusColor), - ), - - SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), - SizedBox( height: MediaQuery.sizeOf(context).height * 0.3, - child: - const SleepAmountBar(weeklySummary: [5, 8, 9, 7, 6, 8, 10]), + width: MediaQuery.sizeOf(context).width * 0.9, + child: SleepAmountBar(weeklySummary: getAmounts(sleepSessions)), ), - - SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), - - Text( - 'Sleep Rating', - style: TextStyle( - fontSize: 28, - fontWeight: FontWeight.w800, - fontFamily: 'CupertinoSystemDisplay', - color: Theme.of(context).focusColor), - ), - - SizedBox(height: MediaQuery.sizeOf(context).height * 0.02), - - Container( - height: screenHeight * 0.3, - width: screenWidth * 0.85, - decoration: BoxDecoration( - border: - Border.all(color: Theme.of(context).disabledColor.withOpacity(0.2), width: 4), - borderRadius: BorderRadius.circular(12.0), - ), - - padding: EdgeInsets.only( - left: screenWidth * 0.03, - right: screenWidth * 0.03, - top: screenHeight * 0.03, - bottom: screenHeight * 0.03), - child: const RatingLine( - weeklyRatings: [3, 0, 2, -1, -5, 4, 2, 5, 0, 1]), + SizedBox(height: MediaQuery.sizeOf(context).height * 0.1), + SizedBox( + height: MediaQuery.sizeOf(context).height * 0.3, + width: MediaQuery.sizeOf(context).width * 0.85, + child: RatingLine(weeklyRatings: getRatings(sleepSessions)), ), ], ), diff --git a/lib/statistics_screen.dart b/lib/statistics_screen.dart deleted file mode 100644 index 995ab89..0000000 --- a/lib/statistics_screen.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:date_only_field/date_only_field_with_extensions.dart'; -import 'package:intl/intl.dart'; - -import 'bar_graph/sleep_amount_bar.dart'; -import 'line_graph/rating_line.dart'; -import 'data/session.dart'; -import 'data/history.dart'; - -class StatisticsScreen extends ConsumerStatefulWidget { - const StatisticsScreen({super.key}); - - @override - ConsumerState createState() => _StatisticsScreenState(); -} - -class _StatisticsScreenState extends ConsumerState { - DateTime _currentStartOfWeek = _getStartOfWeek(DateTime.now()); - - static DateTime _getStartOfWeek(DateTime date) { - int daysToSubtract = date.weekday % 7; - return DateTime(date.year, date.month, date.day - daysToSubtract); - } - - void _goToPreviousWeek() { - setState(() { - _currentStartOfWeek = _currentStartOfWeek.subtract(const Duration(days: 7)); - }); - } - - void _goToNextWeek() { - setState(() { - _currentStartOfWeek = _currentStartOfWeek.add(const Duration(days: 7)); - }); - } - - List getAmounts(List sessions) { - List result = List.filled(7, 0); - for (var session in sessions) { - if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6))) - || session.ended.isBefore(_currentStartOfWeek)) continue; - int day = session.ended.weekday % 7; - result[day] += session.durationInMins / 60; - } - return result; - } - - List getRatings(List sessions) { - List result = []; - for (var session in sessions) { - if (session.ended.isAfter(_currentStartOfWeek.add(const Duration(days: 6))) - || session.ended.isBefore(_currentStartOfWeek)) continue; - result.add(session.quality); - } - return result; - } - - @override - Widget build(BuildContext context) { - final endOfWeek = _currentStartOfWeek.add(const Duration(days: 6)); - final sleepSessions = ref.watch(SleepSessionHistoryNotifier.provider).intervalInDays(Date.fromDateTime(_currentStartOfWeek), Date.fromDateTime(endOfWeek)); - // sessions to test - /* final sleepSessions = [ - SleepSession(started: DateTime(2024, 7, 6, 21), ended: DateTime(2024, 7, 7, 7), quality: SleepQuality.none), - SleepSession(started: DateTime(2024, 6, 30, 10), ended: DateTime(2024, 6, 30, 12), quality: SleepQuality.none), - ]; */ - - return Scaffold( - appBar: AppBar( - title: Text('${DateFormat.MMMd().format(_currentStartOfWeek)} - ${DateFormat.MMMd().format(endOfWeek)}'), - actions: [ - IconButton( - onPressed: _goToPreviousWeek, - icon: const Icon(Icons.chevron_left), - ), - IconButton( - onPressed: _goToNextWeek, - icon: const Icon(Icons.chevron_right), - ), - ], - ), - body: Center( - child: Column( - // add here some nice aligment pls - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - height: MediaQuery.sizeOf(context).height * 0.3, - width: MediaQuery.sizeOf(context).width * 0.9, - child: SleepAmountBar(weeklySummary: getAmounts(sleepSessions)), - ), - SizedBox(height: MediaQuery.sizeOf(context).height * 0.1), - SizedBox( - height: MediaQuery.sizeOf(context).height * 0.3, - width: MediaQuery.sizeOf(context).width * 0.85, - child: RatingLine(weeklyRatings: getRatings(sleepSessions)), - ), - ], - ), - ), - ); - } -} From 9a3462d6bf6e12a282ef9ba2a8142860e6b39130 Mon Sep 17 00:00:00 2001 From: thallars Date: Tue, 2 Jul 2024 09:24:42 +0300 Subject: [PATCH 07/11] add heading to statistics screen --- lib/screens/statistics_screen.dart | 48 ++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/lib/screens/statistics_screen.dart b/lib/screens/statistics_screen.dart index b66775d..475148b 100644 --- a/lib/screens/statistics_screen.dart +++ b/lib/screens/statistics_screen.dart @@ -88,19 +88,55 @@ class _StatisticsScreenState extends ConsumerState { ), body: Center( child: Column( - // add here some nice aligment pls mainAxisAlignment: MainAxisAlignment.center, children: [ + SizedBox(height: MediaQuery.sizeOf(context).height * 0.01), + + Text( + 'Sleep Hours per Day', + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.w800, + fontFamily: 'CupertinoSystemDisplay', + color: Theme.of(context).focusColor), + ), + + SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), + SizedBox( height: MediaQuery.sizeOf(context).height * 0.3, width: MediaQuery.sizeOf(context).width * 0.9, child: SleepAmountBar(weeklySummary: getAmounts(sleepSessions)), ), - SizedBox(height: MediaQuery.sizeOf(context).height * 0.1), - SizedBox( - height: MediaQuery.sizeOf(context).height * 0.3, - width: MediaQuery.sizeOf(context).width * 0.85, - child: RatingLine(weeklyRatings: getRatings(sleepSessions)), + SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), + + Text( + 'Sleep Rating', + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.w800, + fontFamily: 'CupertinoSystemDisplay', + color: Theme.of(context).focusColor), + ), + + SizedBox(height: MediaQuery.sizeOf(context).height * 0.02), + + Container( + height: screenHeight * 0.3, + width: screenWidth * 0.85, + decoration: BoxDecoration( + border: + Border.all(color: Theme.of(context).disabledColor.withOpacity(0.2), width: 4), + borderRadius: BorderRadius.circular(12.0), + ), + + padding: EdgeInsets.only( + left: screenWidth * 0.03, + right: screenWidth * 0.03, + top: screenHeight * 0.03, + bottom: screenHeight * 0.03), + child: const RatingLine( + weeklyRatings: getRatings(sleepSessions)), ), ], ), From 4b37b6d3897403a0609d895a32b6111a58dfcb3e Mon Sep 17 00:00:00 2001 From: Demetrius Date: Tue, 2 Jul 2024 09:45:33 +0300 Subject: [PATCH 08/11] fix(calendar): end edge entries were not displaying --- lib/ui/week_list.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/week_list.dart b/lib/ui/week_list.dart index 85f3e84..fd99c6f 100644 --- a/lib/ui/week_list.dart +++ b/lib/ui/week_list.dart @@ -189,7 +189,7 @@ class _WeekGrid extends ConsumerWidget { flex = 0; } ++flex; - if (c.pisSameAs(iter.current.endDate)) { + if (c.pisSameAs(iter.current.endDate) || c.pisSameAs(week.end)) { widgets.add(Flexible( fit: FlexFit.tight, flex: flex, From d65699ac1a9957e8c978b7fd1572670be3a0c988 Mon Sep 17 00:00:00 2001 From: thallars Date: Tue, 2 Jul 2024 10:02:14 +0300 Subject: [PATCH 09/11] fix missed vars --- lib/screens/statistics_screen.dart | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/screens/statistics_screen.dart b/lib/screens/statistics_screen.dart index 475148b..ce0da85 100644 --- a/lib/screens/statistics_screen.dart +++ b/lib/screens/statistics_screen.dart @@ -6,7 +6,6 @@ import 'package:shleappy/bar_graph/sleep_amount_bar.dart'; import 'package:shleappy/data/history.dart'; import 'package:shleappy/data/session.dart'; import 'package:shleappy/line_graph/rating_line.dart'; - class StatisticsScreen extends ConsumerStatefulWidget { const StatisticsScreen({super.key}); @@ -53,13 +52,15 @@ class _StatisticsScreenState extends ConsumerState { if (session.ended .isAfter(_currentStartOfWeek.add(const Duration(days: 6))) || session.ended.isBefore(_currentStartOfWeek)) continue; - result.add(session.quality); + result.add(session.quality.index); } return result; } @override Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; final endOfWeek = _currentStartOfWeek.add(const Duration(days: 6)); final sleepSessions = ref .watch(SleepSessionHistoryNotifier.provider) @@ -90,7 +91,7 @@ class _StatisticsScreenState extends ConsumerState { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - SizedBox(height: MediaQuery.sizeOf(context).height * 0.01), + SizedBox(height: screenHeight * 0.01), Text( 'Sleep Hours per Day', @@ -101,14 +102,14 @@ class _StatisticsScreenState extends ConsumerState { color: Theme.of(context).focusColor), ), - SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), + SizedBox(height: screenHeight * 0.03), SizedBox( - height: MediaQuery.sizeOf(context).height * 0.3, - width: MediaQuery.sizeOf(context).width * 0.9, + height: screenHeight * 0.3, + width: screenWidth * 0.9, child: SleepAmountBar(weeklySummary: getAmounts(sleepSessions)), ), - SizedBox(height: MediaQuery.sizeOf(context).height * 0.03), + SizedBox(height: screenHeight * 0.03), Text( 'Sleep Rating', @@ -119,7 +120,7 @@ class _StatisticsScreenState extends ConsumerState { color: Theme.of(context).focusColor), ), - SizedBox(height: MediaQuery.sizeOf(context).height * 0.02), + SizedBox(height: screenHeight * 0.02), Container( height: screenHeight * 0.3, @@ -135,7 +136,7 @@ class _StatisticsScreenState extends ConsumerState { right: screenWidth * 0.03, top: screenHeight * 0.03, bottom: screenHeight * 0.03), - child: const RatingLine( + child: RatingLine( weeklyRatings: getRatings(sleepSessions)), ), ], From 6bc8d1e71641e9e3bdad79ef3ffbd327da62b4fa Mon Sep 17 00:00:00 2001 From: Demetrius Date: Tue, 2 Jul 2024 09:48:38 +0300 Subject: [PATCH 10/11] chore: new version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index e214bd1..d6f1792 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.0.1 +version: 1.0.0 environment: sdk: '>=3.4.1 <4.0.0' From 65d08078eefa994ae5df101fb80c2ceed256da33 Mon Sep 17 00:00:00 2001 From: thallars Date: Tue, 2 Jul 2024 10:04:30 +0300 Subject: [PATCH 11/11] Update statistics_screen.dart --- lib/screens/statistics_screen.dart | 2 +- pubspec.lock | 2 +- pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/screens/statistics_screen.dart b/lib/screens/statistics_screen.dart index ce0da85..ab8b7a7 100644 --- a/lib/screens/statistics_screen.dart +++ b/lib/screens/statistics_screen.dart @@ -52,7 +52,7 @@ class _StatisticsScreenState extends ConsumerState { if (session.ended .isAfter(_currentStartOfWeek.add(const Duration(days: 6))) || session.ended.isBefore(_currentStartOfWeek)) continue; - result.add(session.quality.index); + result.add(session.quality); } return result; } diff --git a/pubspec.lock b/pubspec.lock index 27f7c96..5683a82 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -393,7 +393,7 @@ packages: source: hosted version: "1.0.0" omni_datetime_picker: - dependency: "direct dev" + dependency: "direct main" description: name: omni_datetime_picker sha256: "554eb966e84f8d196cf6e189384141db46a79a192d1a360277ead98e5d6036bd" diff --git a/pubspec.yaml b/pubspec.yaml index d6f1792..b7e36ac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: collection: ^1.18.0 table_calendar: ^3.0.9 intl: ^0.18.1 + omni_datetime_picker: ^2.0.2 dev_dependencies: flutter_test: @@ -46,7 +47,6 @@ dev_dependencies: custom_lint: riverpod_lint: ^2.3.12 flutter_lints: ^3.0.0 - omni_datetime_picker: ^2.0.2 dependency_overrides: analyzer: '>=6.5.0 <7.0.0' # Adjust the version range as needed