import 'dart:async'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/device_files_db.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/backup_folders_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/device_collection.dart'; import 'package:photos/ui/collections/device_folder_icon_widget.dart'; import 'package:photos/ui/common/loading_widget.dart'; import 'package:photos/ui/viewer/gallery/empty_state.dart'; class DeviceFoldersGridViewWidget extends StatefulWidget { const DeviceFoldersGridViewWidget({ Key? key, }) : super(key: key); @override State createState() => _DeviceFoldersGridViewWidgetState(); } class _DeviceFoldersGridViewWidgetState extends State { StreamSubscription? _backupFoldersUpdatedEvent; StreamSubscription? _localFilesSubscription; String _loadReason = "init"; @override void initState() { _backupFoldersUpdatedEvent = Bus.instance.on().listen((event) { _loadReason = event.reason; if (mounted) { setState(() {}); } }); _localFilesSubscription = Bus.instance.on().listen((event) { _loadReason = event.reason; setState(() {}); }); super.initState(); } @override Widget build(BuildContext context) { debugPrint("${(DeviceFoldersGridViewWidget).toString()} - $_loadReason"); final logger = Logger((_DeviceFoldersGridViewWidgetState).toString()); return Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: SizedBox( height: 170, child: Align( alignment: Alignment.centerLeft, child: FutureBuilder>( future: FilesDB.instance .getDeviceCollections(includeCoverThumbnail: true), builder: (context, snapshot) { if (snapshot.hasData) { return snapshot.data!.isEmpty ? const Padding( padding: EdgeInsets.all(22), child: EmptyState(), ) : ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, padding: const EdgeInsets.fromLTRB(6, 0, 6, 0), physics: const ScrollPhysics(), // to disable GridView's scrolling itemBuilder: (context, index) { final deviceCollection = snapshot.data![index]; return DeviceFolderIcon(deviceCollection); }, itemCount: snapshot.data!.length, ); } else if (snapshot.hasError) { logger.severe("failed to load device gallery", snapshot.error); return Text(S.of(context).failedToLoadAlbums); } else { return const EnteLoadingWidget(); } }, ), ), ), ); } @override void dispose() { _backupFoldersUpdatedEvent?.cancel(); _localFilesSubscription?.cancel(); super.dispose(); } }