diff --git a/lib/ui/viewer/search_tab/albums_section.dart b/lib/ui/viewer/search_tab/albums_section.dart index 7cfffe454..db80e04c0 100644 --- a/lib/ui/viewer/search_tab/albums_section.dart +++ b/lib/ui/viewer/search_tab/albums_section.dart @@ -1,6 +1,10 @@ +import "dart:async"; + import "package:dotted_border/dotted_border.dart"; import "package:figma_squircle/figma_squircle.dart"; import "package:flutter/material.dart"; +import "package:photos/core/constants.dart"; +import "package:photos/events/event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/search/album_search_result.dart"; import "package:photos/models/search/recent_searches.dart"; @@ -15,13 +19,54 @@ import "package:photos/ui/viewer/search_tab/search_tab.dart"; import "package:photos/ui/viewer/search_tab/section_header.dart"; import "package:photos/utils/navigation_util.dart"; -class AlbumsSection extends StatelessWidget { +class AlbumsSection extends StatefulWidget { final List albumSearchResults; const AlbumsSection(this.albumSearchResults, {super.key}); + @override + State createState() => _AlbumsSectionState(); +} + +class _AlbumsSectionState extends State { + late List _albumSearchResults; + final streamSubscriptions = []; + + @override + void initState() { + super.initState(); + _albumSearchResults = widget.albumSearchResults; + + final streamsToListenTo = SectionType.album.sectionUpdateEvents(); + for (Stream stream in streamsToListenTo) { + streamSubscriptions.add( + stream.listen((event) async { + _albumSearchResults = (await SectionType.album.getData( + context, + limit: kSearchSectionLimit, + )) as List; + setState(() {}); + }), + ); + } + } + + @override + void dispose() { + for (var subscriptions in streamSubscriptions) { + subscriptions.cancel(); + } + super.dispose(); + } + + @override + void didUpdateWidget(covariant AlbumsSection oldWidget) { + super.didUpdateWidget(oldWidget); + _albumSearchResults = widget.albumSearchResults; + } + @override Widget build(BuildContext context) { - if (albumSearchResults.isEmpty) { + if (_albumSearchResults.isEmpty) { final textTheme = getEnteTextTheme(context); return Padding( padding: const EdgeInsets.only(left: 12, right: 8), @@ -53,7 +98,7 @@ class AlbumsSection extends StatelessWidget { ); } else { final recommendations = [ - ...albumSearchResults.map( + ..._albumSearchResults.map( (albumSearchResult) => AlbumRecommendation(albumSearchResult), ), const AlbumCTA(), @@ -65,7 +110,8 @@ class AlbumsSection extends StatelessWidget { children: [ SectionHeader( SectionType.album, - hasMore: (albumSearchResults.length > SearchTab.hasMoreThreshold), + hasMore: + (_albumSearchResults.length >= SearchTab.hasMoreThreshold), ), const SizedBox(height: 2), SizedBox(