import "dart:async"; import 'package:flutter/material.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; import 'package:photos/models/search/search_result.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; class SearchResultPage extends StatefulWidget { final SearchResult searchResult; final bool enableGrouping; final String tagPrefix; static const GalleryType appBarType = GalleryType.searchResults; static const GalleryType overlayType = GalleryType.searchResults; const SearchResultPage( this.searchResult, { this.enableGrouping = true, this.tagPrefix = "", Key? key, }) : super(key: key); @override State createState() => _SearchResultPageState(); } class _SearchResultPageState extends State { final _selectedFiles = SelectedFiles(); late final List files; late final StreamSubscription _filesUpdatedEvent; @override void initState() { super.initState(); files = widget.searchResult.resultFiles(); _filesUpdatedEvent = Bus.instance.on().listen((event) { if (event.type == EventType.deletedFromDevice || event.type == EventType.deletedFromEverywhere || event.type == EventType.deletedFromRemote || event.type == EventType.hide) { for (var updatedFile in event.updatedFiles) { files.remove(updatedFile); } setState(() {}); } }); } @override void dispose() { _filesUpdatedEvent.cancel(); super.dispose(); } @override Widget build(BuildContext context) { final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { final result = files .where( (file) => file.creationTime! >= creationStartTime && file.creationTime! <= creationEndTime, ) .toList(); return Future.value( FileLoadResult( result, result.length < files.length, ), ); }, reloadEvent: Bus.instance.on(), removalEventTypes: const { EventType.deletedFromRemote, EventType.deletedFromEverywhere, EventType.hide, }, tagPrefix: widget.tagPrefix + widget.searchResult.heroTag(), selectedFiles: _selectedFiles, enableFileGrouping: widget.enableGrouping, initialFiles: [widget.searchResult.resultFiles().first], ); return Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(50.0), child: GalleryAppBarWidget( SearchResultPage.appBarType, widget.searchResult.name(), _selectedFiles, ), ), body: Stack( alignment: Alignment.bottomCenter, children: [ gallery, FileSelectionOverlayBar( SearchResultPage.overlayType, _selectedFiles, ), ], ), ); } }