ente/lib/ui/home/memories/memory_cover_widget.dart
2023-05-04 13:15:08 +05:30

123 lines
3.6 KiB
Dart

import "package:flutter/material.dart";
import "package:photos/generated/l10n.dart";
import "package:photos/models/memory.dart";
import "package:photos/theme/ente_theme.dart";
import "package:photos/ui/home/memories/full_screen_memory.dart";
import "package:photos/ui/viewer/file/thumbnail_widget.dart";
import "package:photos/utils/navigation_util.dart";
class MemoryCovertWidget extends StatefulWidget {
const MemoryCovertWidget({
Key? key,
required this.memories,
}) : super(key: key);
final List<Memory> memories;
@override
State<MemoryCovertWidget> createState() => _MemoryCovertWidgetState();
}
class _MemoryCovertWidgetState extends State<MemoryCovertWidget> {
@override
Widget build(BuildContext context) {
final index = _getNextMemoryIndex();
final title = _getTitle(widget.memories[index]);
return GestureDetector(
onTap: () async {
await routeToPage(
context,
FullScreenMemory(title, widget.memories, index),
forceCustomPageRoute: true,
);
setState(() {});
},
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
_buildMemoryItem(context, index),
const Padding(padding: EdgeInsets.all(4)),
Hero(
tag: title,
child: Material(
type: MaterialType.transparency,
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 84),
child: Text(
title,
style: getEnteTextTheme(context).mini,
textAlign: TextAlign.center,
),
),
),
),
],
),
),
],
),
);
}
Container _buildMemoryItem(BuildContext context, int index) {
final colorScheme = getEnteColorScheme(context);
final memory = widget.memories[index];
final isSeen = memory.isSeen();
return Container(
decoration: BoxDecoration(
border: Border.all(
color: isSeen ? colorScheme.strokeFaint : colorScheme.primary500,
width: 2,
),
borderRadius: BorderRadius.circular(40),
),
child: ClipOval(
child: SizedBox(
width: 56,
height: 56,
child: Hero(
tag: "memories" + memory.file.tag,
child: ThumbnailWidget(
memory.file,
shouldShowSyncStatus: false,
key: Key("memories" + memory.file.tag),
),
),
),
),
);
}
// Returns either the first unseen memory or the memory that succeeds the
// last seen memory
int _getNextMemoryIndex() {
int lastSeenIndex = 0;
int lastSeenTimestamp = 0;
for (var index = 0; index < widget.memories.length; index++) {
final memory = widget.memories[index];
if (!memory.isSeen()) {
return index;
} else {
if (memory.seenTime() > lastSeenTimestamp) {
lastSeenIndex = index;
lastSeenTimestamp = memory.seenTime();
}
}
}
if (lastSeenIndex == widget.memories.length - 1) {
return 0;
}
return lastSeenIndex + 1;
}
String _getTitle(Memory memory) {
final present = DateTime.now();
final then = DateTime.fromMicrosecondsSinceEpoch(memory.file.creationTime!);
final diffInYears = present.year - then.year;
return S.of(context).yearsAgo(diffInYears);
}
}