ente/lib/ui/collections/album/horizontal_list.dart

109 lines
3.6 KiB
Dart
Raw Normal View History

import "dart:async";
import "package:flutter/cupertino.dart";
import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/events/collection_updated_event.dart";
2023-04-06 04:03:32 +00:00
import "package:photos/generated/l10n.dart";
import "package:photos/models/collection_items.dart";
import "package:photos/theme/ente_theme.dart";
2023-06-06 16:43:32 +00:00
import "package:photos/ui/collections/album/row_item.dart";
import "package:photos/ui/common/loading_widget.dart";
2023-06-06 14:43:41 +00:00
class AlbumHorizontalList extends StatefulWidget {
2023-02-23 07:36:21 +00:00
final Future<List<CollectionWithThumbnail>> Function() collectionsFuture;
2023-02-23 01:22:08 +00:00
2023-06-06 14:43:41 +00:00
const AlbumHorizontalList(
2023-02-23 07:36:21 +00:00
this.collectionsFuture, {
Key? key,
}) : super(key: key);
@override
2023-06-06 14:43:41 +00:00
State<AlbumHorizontalList> createState() => _AlbumHorizontalListState();
}
2023-06-06 14:43:41 +00:00
class _AlbumHorizontalListState extends State<AlbumHorizontalList> {
late StreamSubscription<CollectionUpdatedEvent>
_collectionUpdatesSubscription;
late Logger _logger;
@override
void initState() {
_collectionUpdatesSubscription =
Bus.instance.on<CollectionUpdatedEvent>().listen((event) {
setState(() {});
});
2023-06-06 14:43:41 +00:00
_logger = Logger((_AlbumHorizontalListState).toString());
super.initState();
}
@override
void dispose() {
_collectionUpdatesSubscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
2023-02-23 01:22:08 +00:00
debugPrint('$runtimeType widget build');
2023-04-20 10:20:49 +00:00
return FutureBuilder<List<CollectionWithThumbnail>>(
future: widget.collectionsFuture(),
builder: (context, snapshot) {
if (snapshot.hasError) {
_logger.severe("failed to fetch albums", snapshot.error);
return Text(S.of(context).somethingWentWrong);
} else if (snapshot.hasData) {
if (snapshot.data!.isEmpty) {
return const SizedBox.shrink();
}
final collectionsWithThumbnail =
snapshot.data as List<CollectionWithThumbnail>;
return Padding(
padding: const EdgeInsets.only(bottom: 24, top: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Text(
S.of(context).albums,
style: getEnteTextTheme(context).large,
2023-02-23 01:30:16 +00:00
),
),
2023-04-20 10:20:49 +00:00
Align(
alignment: Alignment.centerLeft,
child: SizedBox(
height: 147, //139 + 8 (calculated from figma design)
child: ListView.separated(
separatorBuilder: (context, index) =>
const SizedBox(width: 4),
scrollDirection: Axis.horizontal,
itemCount: collectionsWithThumbnail.length,
padding: const EdgeInsets.symmetric(horizontal: 8),
itemBuilder: (context, index) {
final item = collectionsWithThumbnail[index];
2023-06-06 16:43:32 +00:00
return AlbumRowItemWidget(
2023-04-20 10:20:49 +00:00
item,
120,
shouldRender: true,
showFileCount: false,
);
},
),
),
),
],
),
);
} else {
return const Padding(
padding: EdgeInsets.only(bottom: 24, top: 8),
child: EnteLoadingWidget(),
);
}
},
);
}
}