Skip to content

Commit

Permalink
fixed statistics counts and calendar last date
Browse files Browse the repository at this point in the history
  • Loading branch information
prijindal committed May 1, 2024
1 parent 6bf3a67 commit 8d6b262
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 19 deletions.
8 changes: 4 additions & 4 deletions lib/components/calendars.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ class _CalendarsSubPageState extends State<CalendarsSubPage> {
CalendarFormat _calendarformat = CalendarFormat.month;

List<DateTime> _firstAndLast() {
final entries = (widget.entries ?? [])
final entries = List<HabbitEntry>.from(widget.entries ?? [])
..sort((a, b) {
return a.creationTime.difference(b.creationTime).inSeconds;
});
return [
entries.firstOrNull?.creationTime ??
entries.firstOrNull?.creationTime.toLocal() ??
(DateTime.now().subtract(const Duration(days: 1))),
entries.lastOrNull?.creationTime ??
entries.lastOrNull?.creationTime.toLocal() ??
(DateTime.now().add(const Duration(days: 1))),
];
}
Expand Down Expand Up @@ -111,7 +111,7 @@ class _CalendarsSubPageState extends State<CalendarsSubPage> {
itemCount: entries.isNotEmpty ? entries.length : 1,
itemBuilder: (BuildContext context, int index) {
if (entries.isEmpty) {
return const Text("No Entry");
return const ListTile(title: Text("No Entry"));
}
final entry = entries[index];
return AnimationConfiguration.staggeredList(
Expand Down
32 changes: 27 additions & 5 deletions lib/components/statistics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class StatisticsSubPage extends StatefulWidget {
}

class _StatisticsSubPageState extends State<StatisticsSubPage> {
StatsIntervals statsIntervals = StatsIntervals.all;
StatsIntervals statsIntervals = StatsIntervals.oneWeek;

@override
void initState() {
Expand Down Expand Up @@ -116,6 +116,26 @@ class _StatisticsSubPageState extends State<StatisticsSubPage> {
}
}

DateTime? _getStartDate() {
DateTime? startDate = getEntries().firstOrNull?.creationTime;
switch (statsIntervals) {
case StatsIntervals.oneYear:
startDate = DateTime.now().subtract(const Duration(days: 365));
break;
case StatsIntervals.threeMonths:
startDate = DateTime.now().subtract(const Duration(days: 90));
break;
case StatsIntervals.oneMonth:
startDate = DateTime.now().subtract(const Duration(days: 30));
break;
case StatsIntervals.oneWeek:
startDate = DateTime.now().subtract(const Duration(days: 7));
default:
break;
}
return startDate;
}

List<Widget> _buildStats() {
final habbit = widget.habbit;
final list = <ListTile>[];
Expand All @@ -124,11 +144,12 @@ class _StatisticsSubPageState extends State<StatisticsSubPage> {
}
final config = HabbitConfig.getConfig(habbit.config);
for (var element in config.statistics) {
final endDate = getEntries().lastOrNull?.creationTime;
list.add(
ListTile(
title: Text(element.name),
subtitle: Text(
element.transform(getEntries()),
element.transform(getEntries(), _getStartDate(), endDate),
),
),
);
Expand Down Expand Up @@ -211,9 +232,10 @@ class _StatisticsSubPageState extends State<StatisticsSubPage> {
);
break;
case HabbitChart.dayCountsChart:
final countsData = countPerDaysData(getEntries())
..sort((a, b) =>
a.date.millisecondsSinceEpoch - b.date.millisecondsSinceEpoch);
final countsData = countPerDaysData(
getEntries(),
)..sort((a, b) =>
a.date.millisecondsSinceEpoch - b.date.millisecondsSinceEpoch);
final chartsData = countsData
.map(
(e) => BarChartGroupData(
Expand Down
4 changes: 2 additions & 2 deletions lib/helpers/stats.dart
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ List<DateTime> getDaysInBetween(DateTime startDate, DateTime endDate) {
}

List<CountsDayData> countPerDaysData(List<HabbitEntry>? entries,
[bool includeEmptyDates = true]) {
[bool includeEmptyDates = true, DateTime? startDate]) {
final counts = <DateTime, int>{};
if (entries == null) {
return [];
Expand All @@ -113,7 +113,7 @@ List<CountsDayData> countPerDaysData(List<HabbitEntry>? entries,
}
if (includeEmptyDates && entries.isNotEmpty) {
final daysInBetween = getDaysInBetween(
entries.last.creationTime.toLocal(),
startDate?.toLocal() ?? entries.last.creationTime.toLocal(),
entries.first.creationTime.toLocal(),
);
for (var day in daysInBetween) {
Expand Down
20 changes: 12 additions & 8 deletions lib/models/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ enum ExtraCounter {

class HabbitStatistic {
String name;
String Function(List<HabbitEntry> entries) transform;
String Function(
List<HabbitEntry> entries, DateTime? startDate, DateTime? endDate)
transform;

HabbitStatistic({
required this.name,
Expand All @@ -128,18 +130,18 @@ class HabbitStatistic {

static final total = HabbitStatistic(
name: "Total entries",
transform: (entries) => entries.length.toString(),
transform: (entries, startDate, endDate) => entries.length.toString(),
);

static final currentStreak = HabbitStatistic(
name: "Current streak",
transform: (entries) =>
transform: (entries, startDate, endDate) =>
stats.durationToStreak(stats.currentStreak(entries)),
);

static final shortestStreak = HabbitStatistic(
name: "Shortest streak",
transform: (entries) {
transform: (entries, startDate, endDate) {
if (entries.isNotEmpty && stats.allDurationsData(entries).isNotEmpty) {
final shortest = stats.allDurationsData(entries).first.duration;
return stats.durationToStreak(shortest);
Expand All @@ -150,13 +152,13 @@ class HabbitStatistic {

static final longestStreak = HabbitStatistic(
name: "Longest streak",
transform: (entries) =>
transform: (entries, startDate, endDate) =>
stats.durationToStreak(stats.longestStreak(entries)),
);

static final averageDuration = HabbitStatistic(
name: "Average Duration",
transform: (entries) {
transform: (entries, startDate, endDate) {
final List<stats.DurationData> durations =
stats.allDurationsData(entries);
Duration totalDuration = const Duration();
Expand All @@ -175,10 +177,12 @@ class HabbitStatistic {

static final averageCounts = HabbitStatistic(
name: "Average counts",
transform: (entries) {
final counts = stats.countPerDaysData(entries);
transform: (entries, startDate, endDate) {
final counts = stats.countPerDaysData(entries, true, startDate);
var sum = 0;
for (var element in counts) {
// print(element.date);
// print(element.count);
sum += element.count;
}
return (sum / counts.length).toStringAsFixed(2);
Expand Down

0 comments on commit 8d6b262

Please sign in to comment.