diff --git a/lib/foundation/comic_source/comic_source.dart b/lib/foundation/comic_source/comic_source.dart index 7eed7e4..a0d3cc7 100644 --- a/lib/foundation/comic_source/comic_source.dart +++ b/lib/foundation/comic_source/comic_source.dart @@ -417,7 +417,7 @@ class SearchOptions { const SearchOptions(this.options, this.label, this.type, this.defaultVal); - String get defaultValue => defaultVal ?? options.keys.first; + String get defaultValue => defaultVal ?? options.keys.firstOrNull ?? ""; } typedef CategoryComicsLoader = Future>> Function( diff --git a/lib/pages/aggregated_search_page.dart b/lib/pages/aggregated_search_page.dart index 48fc849..a84c471 100644 --- a/lib/pages/aggregated_search_page.dart +++ b/lib/pages/aggregated_search_page.dart @@ -58,7 +58,11 @@ class _AggregatedSearchPageState extends State { delegate: SliverChildBuilderDelegate( (context, index) { final source = sources[index]; - return _SliverSearchResult(source: source, keyword: _keyword); + return _SliverSearchResult( + key: ValueKey(source.key), + source: source, + keyword: _keyword, + ); }, childCount: sources.length, ), @@ -68,7 +72,11 @@ class _AggregatedSearchPageState extends State { } class _SliverSearchResult extends StatefulWidget { - const _SliverSearchResult({required this.source, required this.keyword}); + const _SliverSearchResult({ + required this.source, + required this.keyword, + super.key, + }); final ComicSource source; @@ -90,6 +98,8 @@ class _SliverSearchResultState extends State<_SliverSearchResult> List? comics; + String? error; + void load() async { final data = widget.source.searchPageData!; var options = @@ -101,6 +111,11 @@ class _SliverSearchResultState extends State<_SliverSearchResult> comics = res.data; isLoading = false; }); + } else { + setState(() { + error = res.errorMessage ?? "Unknown error".tl; + isLoading = false; + }); } } else if (data.loadNext != null) { var res = await data.loadNext!(widget.keyword, null, options); @@ -109,6 +124,11 @@ class _SliverSearchResultState extends State<_SliverSearchResult> comics = res.data; isLoading = false; }); + } else { + setState(() { + error = res.errorMessage ?? "Unknown error".tl; + isLoading = false; + }); } } } @@ -139,6 +159,9 @@ class _SliverSearchResultState extends State<_SliverSearchResult> @override Widget build(BuildContext context) { + if (error != null && error!.startsWith("CloudflareException")) { + error = "Cloudflare verification required".tl; + } super.build(context); return InkWell( onTap: () { @@ -181,7 +204,7 @@ class _SliverSearchResultState extends State<_SliverSearchResult> }), ), ) - else if (comics == null || comics!.isEmpty) + else if (error != null || comics == null || comics!.isEmpty) SizedBox( height: _kComicHeight, child: Column( @@ -190,7 +213,13 @@ class _SliverSearchResultState extends State<_SliverSearchResult> children: [ const Icon(Icons.error_outline), const SizedBox(width: 8), - Text("No search results found".tl), + Expanded( + child: Text( + error ?? "No search results found".tl, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ) ], ), const Spacer(),