import 'package:flutter/material.dart'; import 'package:photos/models/memory.dart'; import 'package:photos/services/memories_service.dart'; import "package:photos/ui/home/memories/memory_cover_widget.dart"; class MemoriesWidget extends StatelessWidget { const MemoriesWidget({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return FutureBuilder>( future: MemoriesService.instance.getMemories(), builder: (context, snapshot) { if (snapshot.hasError || !snapshot.hasData || snapshot.data!.isEmpty) { return const SizedBox.shrink(); } else { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildMemories(snapshot.data!), const Divider(), ], ); } }, ); } Widget _buildMemories(List memories) { final collatedMemories = _collateMemories(memories); final List memoryWidgets = []; for (final memories in collatedMemories) { memoryWidgets.add(MemoryCovertWidget(memories: memories)); } return SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: memoryWidgets, ), ); } List> _collateMemories(List memories) { final List yearlyMemories = []; final List> collatedMemories = []; for (int index = 0; index < memories.length; index++) { if (index > 0 && !_areMemoriesFromSameYear(memories[index - 1], memories[index])) { final List collatedYearlyMemories = []; collatedYearlyMemories.addAll(yearlyMemories); collatedMemories.add(collatedYearlyMemories); yearlyMemories.clear(); } yearlyMemories.add(memories[index]); } if (yearlyMemories.isNotEmpty) { collatedMemories.add(yearlyMemories); } return collatedMemories.reversed.toList(); } bool _areMemoriesFromSameYear(Memory first, Memory second) { final firstDate = DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!); final secondDate = DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!); return firstDate.year == secondDate.year; } }