ente/mobile/lib/ui/viewer/file_details/albums_item_widget.dart
2024-03-01 12:25:37 +05:30

110 lines
3.5 KiB
Dart

import "package:flutter/material.dart";
import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/db/files_db.dart";
import "package:photos/events/pause_video_event.dart";
import "package:photos/generated/l10n.dart";
import 'package:photos/models/collection/collection.dart';
import 'package:photos/models/collection/collection_items.dart';
import 'package:photos/models/file/file.dart';
import "package:photos/services/collections_service.dart";
import "package:photos/ui/components/buttons/chip_button_widget.dart";
import "package:photos/ui/components/info_item_widget.dart";
import "package:photos/ui/viewer/gallery/collection_page.dart";
import "package:photos/utils/navigation_util.dart";
class AlbumsItemWidget extends StatelessWidget {
final EnteFile file;
final int currentUserID;
const AlbumsItemWidget(
this.file,
this.currentUserID, {
super.key,
});
@override
Widget build(BuildContext context) {
final fileIsBackedup = file.uploadedFileID == null ? false : true;
late Future<Set<int>> allCollectionIDsOfFile;
//Typing this as Future<Set<T>> as it would be easier to implement showing multiple device folders for a file in the future
final Future<Set<String>> allDeviceFoldersOfFile =
Future.sync(() => {file.deviceFolder ?? ''});
if (fileIsBackedup) {
allCollectionIDsOfFile = FilesDB.instance.getAllCollectionIDsOfFile(
file.uploadedFileID!,
);
}
return InfoItemWidget(
key: const ValueKey("Albums"),
leadingIcon: Icons.folder_outlined,
title: S.of(context).albums,
subtitleSection: fileIsBackedup
? _collectionsListOfFile(
context,
allCollectionIDsOfFile,
currentUserID,
)
: _deviceFoldersListOfFile(allDeviceFoldersOfFile),
hasChipButtons: true,
);
}
Future<List<ChipButtonWidget>> _deviceFoldersListOfFile(
Future<Set<String>> allDeviceFoldersOfFile,
) async {
try {
final chipButtons = <ChipButtonWidget>[];
final List<String> deviceFolders =
(await allDeviceFoldersOfFile).toList();
for (var deviceFolder in deviceFolders) {
chipButtons.add(
ChipButtonWidget(
deviceFolder,
),
);
}
return chipButtons;
} catch (e, s) {
Logger("AlbumsItemWidget").info(e, s);
return [];
}
}
Future<List<ChipButtonWidget>> _collectionsListOfFile(
BuildContext context,
Future<Set<int>> allCollectionIDsOfFile,
int currentUserID,
) async {
try {
final chipButtons = <ChipButtonWidget>[];
final Set<int> collectionIDs = await allCollectionIDsOfFile;
final collections = <Collection>[];
for (var collectionID in collectionIDs) {
final c = CollectionsService.instance.getCollectionByID(collectionID);
collections.add(c!);
chipButtons.add(
ChipButtonWidget(
c.isHidden() ? S.of(context).hidden : c.displayName,
onTap: () {
if (c.isHidden()) {
return;
}
Bus.instance.fire(PauseVideoEvent());
routeToPage(
context,
CollectionPage(
CollectionWithThumbnail(c, null),
),
);
},
),
);
}
return chipButtons;
} catch (e, s) {
Logger("AlbumsItemWidget").info(e, s);
return [];
}
}
}