49 lines
1.3 KiB
Dart
49 lines
1.3 KiB
Dart
import '../models/closed_tab_item.dart';
|
|
|
|
class ClosedTabItemDayGroup {
|
|
final DateTime day;
|
|
final List<ClosedTabItem> items;
|
|
|
|
const ClosedTabItemDayGroup({required this.day, required this.items});
|
|
|
|
int get itemCount => items.fold(
|
|
0,
|
|
(total, item) => total + (item.isRemoved ? 0 : item.quantity),
|
|
);
|
|
}
|
|
|
|
List<ClosedTabItemDayGroup> groupClosedTabItemsByDay(
|
|
Iterable<ClosedTabItem> items, {
|
|
required DateTime fallbackDate,
|
|
}) {
|
|
final groups = <DateTime, List<ClosedTabItem>>{};
|
|
|
|
for (final item in items) {
|
|
final localPurchasedAt = (item.purchasedAt ?? fallbackDate).toLocal();
|
|
final day = DateTime(
|
|
localPurchasedAt.year,
|
|
localPurchasedAt.month,
|
|
localPurchasedAt.day,
|
|
);
|
|
groups.putIfAbsent(day, () => []).add(item);
|
|
}
|
|
|
|
for (final group in groups.values) {
|
|
group.sort((a, b) {
|
|
final aTime = (a.purchasedAt ?? fallbackDate).toLocal();
|
|
final bTime = (b.purchasedAt ?? fallbackDate).toLocal();
|
|
final byTime = bTime.compareTo(aTime);
|
|
if (byTime != 0) return byTime;
|
|
|
|
return b.id.compareTo(a.id);
|
|
});
|
|
}
|
|
|
|
final sortedGroups = groups.entries.toList()
|
|
..sort((a, b) => b.key.compareTo(a.key));
|
|
|
|
return sortedGroups
|
|
.map((entry) => ClosedTabItemDayGroup(day: entry.key, items: entry.value))
|
|
.toList();
|
|
}
|