2023-08-24 15:35:28 +00:00
|
|
|
import "dart:async";
|
|
|
|
|
2023-05-03 11:16:38 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2023-08-24 15:35:28 +00:00
|
|
|
import "package:photos/core/event_bus.dart";
|
|
|
|
import "package:photos/events/memories_setting_changed.dart";
|
2023-05-03 11:16:38 +00:00
|
|
|
import 'package:photos/models/memory.dart';
|
|
|
|
import 'package:photos/services/memories_service.dart';
|
|
|
|
import "package:photos/ui/home/memories/memory_cover_widget.dart";
|
|
|
|
|
2023-08-24 15:35:28 +00:00
|
|
|
class MemoriesWidget extends StatefulWidget {
|
2023-05-03 11:16:38 +00:00
|
|
|
const MemoriesWidget({Key? key}) : super(key: key);
|
|
|
|
|
2023-08-24 15:35:28 +00:00
|
|
|
@override
|
|
|
|
State<MemoriesWidget> createState() => _MemoriesWidgetState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _MemoriesWidgetState extends State<MemoriesWidget> {
|
|
|
|
late StreamSubscription<MemoriesSettingChanged> _subscription;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
_subscription = Bus.instance.on<MemoriesSettingChanged>().listen((event) {
|
|
|
|
if (mounted) {
|
|
|
|
setState(() {});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
_subscription.cancel();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
2023-05-03 11:16:38 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-08-24 15:35:28 +00:00
|
|
|
if (!MemoriesService.instance.showMemories) {
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
}
|
2023-05-03 11:16:38 +00:00
|
|
|
return FutureBuilder<List<Memory>>(
|
|
|
|
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<Memory> memories) {
|
|
|
|
final collatedMemories = _collateMemories(memories);
|
|
|
|
final List<Widget> memoryWidgets = [];
|
|
|
|
for (final memories in collatedMemories) {
|
|
|
|
memoryWidgets.add(MemoryCovertWidget(memories: memories));
|
|
|
|
}
|
|
|
|
return SingleChildScrollView(
|
|
|
|
scrollDirection: Axis.horizontal,
|
2023-05-04 07:45:08 +00:00
|
|
|
child: Row(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: memoryWidgets,
|
|
|
|
),
|
2023-05-03 11:16:38 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<List<Memory>> _collateMemories(List<Memory> memories) {
|
|
|
|
final List<Memory> yearlyMemories = [];
|
|
|
|
final List<List<Memory>> collatedMemories = [];
|
|
|
|
for (int index = 0; index < memories.length; index++) {
|
|
|
|
if (index > 0 &&
|
|
|
|
!_areMemoriesFromSameYear(memories[index - 1], memories[index])) {
|
|
|
|
final List<Memory> 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 =
|
2023-11-18 11:08:41 +00:00
|
|
|
DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!);
|
2023-05-03 11:16:38 +00:00
|
|
|
final secondDate =
|
2023-11-18 11:08:41 +00:00
|
|
|
DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!);
|
2023-05-03 11:16:38 +00:00
|
|
|
return firstDate.year == secondDate.year;
|
|
|
|
}
|
|
|
|
}
|