2023-10-16 14:04:31 +00:00
|
|
|
import "package:flutter/material.dart";
|
2023-10-17 00:35:28 +00:00
|
|
|
import "package:photos/models/search/album_search_result.dart";
|
2023-10-16 14:04:31 +00:00
|
|
|
import "package:photos/models/search/search_result.dart";
|
|
|
|
import "package:photos/models/search/search_types.dart";
|
2023-10-17 00:35:28 +00:00
|
|
|
import "package:photos/services/collections_service.dart";
|
2023-10-16 14:04:31 +00:00
|
|
|
import "package:photos/ui/common/loading_widget.dart";
|
|
|
|
import "package:photos/ui/components/title_bar_title_widget.dart";
|
2023-10-17 00:40:20 +00:00
|
|
|
import "package:photos/ui/viewer/gallery/collection_page.dart";
|
2023-10-16 14:04:31 +00:00
|
|
|
import "package:photos/ui/viewer/search/result/search_result_widget.dart";
|
2023-10-17 07:07:46 +00:00
|
|
|
import "package:photos/ui/viewer/search/search_section_cta.dart";
|
2023-10-17 00:40:20 +00:00
|
|
|
import "package:photos/utils/navigation_util.dart";
|
2023-10-16 14:04:31 +00:00
|
|
|
|
|
|
|
class SearchSectionResultPage extends StatefulWidget {
|
|
|
|
final SectionType sectionType;
|
|
|
|
const SearchSectionResultPage({required this.sectionType, super.key});
|
|
|
|
|
|
|
|
@override
|
|
|
|
State<SearchSectionResultPage> createState() =>
|
|
|
|
_SearchSectionResultPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _SearchSectionResultPageState extends State<SearchSectionResultPage> {
|
|
|
|
late final Future<List<SearchResult>> sectionData;
|
2023-10-17 07:07:46 +00:00
|
|
|
late final bool _showCTATile;
|
2023-10-16 14:04:31 +00:00
|
|
|
@override
|
|
|
|
void didChangeDependencies() {
|
|
|
|
super.didChangeDependencies();
|
|
|
|
sectionData = widget.sectionType.getData(limit: null, context: context);
|
2023-10-17 07:07:46 +00:00
|
|
|
_showCTATile = widget.sectionType.isCTAVisible;
|
2023-10-16 14:04:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Scaffold(
|
|
|
|
appBar: AppBar(
|
|
|
|
toolbarHeight: 48,
|
|
|
|
leadingWidth: 48,
|
|
|
|
leading: GestureDetector(
|
|
|
|
onTap: () {
|
|
|
|
Navigator.pop(context);
|
|
|
|
},
|
|
|
|
child: const Icon(
|
|
|
|
Icons.arrow_back_outlined,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
body: FutureBuilder(
|
|
|
|
future: sectionData,
|
|
|
|
builder: (context, snapshot) {
|
|
|
|
if (snapshot.hasData) {
|
|
|
|
final sectionResults = snapshot.data;
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Padding(
|
|
|
|
padding:
|
|
|
|
const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
TitleBarTitleWidget(
|
|
|
|
title: widget.sectionType.sectionTitle(context),
|
|
|
|
),
|
|
|
|
Text(sectionResults!.length.toString()),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(
|
|
|
|
vertical: 20,
|
|
|
|
horizontal: 16,
|
|
|
|
),
|
|
|
|
child: ListView.separated(
|
|
|
|
itemBuilder: (context, index) {
|
2023-10-17 07:07:46 +00:00
|
|
|
if (sectionResults.length == index) {
|
|
|
|
return SearchSectionCTATile(widget.sectionType);
|
|
|
|
}
|
2023-10-17 00:35:28 +00:00
|
|
|
if (sectionResults[index] is AlbumSearchResult) {
|
|
|
|
final albumSectionResult =
|
|
|
|
sectionResults[index] as AlbumSearchResult;
|
|
|
|
return SearchResultWidget(
|
|
|
|
albumSectionResult,
|
|
|
|
resultCount:
|
|
|
|
CollectionsService.instance.getFileCount(
|
|
|
|
albumSectionResult
|
|
|
|
.collectionWithThumbnail.collection,
|
|
|
|
),
|
2023-10-17 00:40:20 +00:00
|
|
|
onResultTap: () => routeToPage(
|
|
|
|
context,
|
|
|
|
CollectionPage(
|
|
|
|
albumSectionResult.collectionWithThumbnail,
|
|
|
|
tagPrefix: albumSectionResult.heroTag(),
|
|
|
|
),
|
|
|
|
),
|
2023-10-17 00:35:28 +00:00
|
|
|
);
|
|
|
|
}
|
2023-10-16 14:04:31 +00:00
|
|
|
return SearchResultWidget(sectionResults[index]);
|
|
|
|
},
|
|
|
|
separatorBuilder: (context, index) {
|
|
|
|
return const SizedBox(height: 10);
|
|
|
|
},
|
2023-10-17 07:07:46 +00:00
|
|
|
itemCount: sectionResults.length + (_showCTATile ? 1 : 0),
|
2023-10-17 00:35:28 +00:00
|
|
|
physics: const BouncingScrollPhysics(),
|
2023-10-16 14:04:31 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return const EnteLoadingWidget();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|