diff --git a/lib/foundation/comic_source/comic_source.dart b/lib/foundation/comic_source/comic_source.dart index f39a346..544e9a6 100644 --- a/lib/foundation/comic_source/comic_source.dart +++ b/lib/foundation/comic_source/comic_source.dart @@ -384,24 +384,18 @@ enum ExplorePageType { typedef SearchFunction = Future>> Function( String keyword, int page, List searchOption); +typedef SearchNextFunction = Future>> Function( + String keyword, String? next, List searchOption); + class SearchPageData { /// If this is not null, the default value of search options will be first element. final List? searchOptions; - final Widget Function(BuildContext, List initialValues, - void Function(List))? customOptionsBuilder; - - final Widget Function(String keyword, List options)? - overrideSearchResultBuilder; - final SearchFunction? loadPage; - final bool enableLanguageFilter; + final SearchNextFunction? loadNext; - const SearchPageData(this.searchOptions, this.loadPage) - : enableLanguageFilter = false, - customOptionsBuilder = null, - overrideSearchResultBuilder = null; + const SearchPageData(this.searchOptions, this.loadPage, this.loadNext); } class SearchOptions { diff --git a/lib/foundation/comic_source/parser.dart b/lib/foundation/comic_source/parser.dart index 7a800b7..b7e2257 100644 --- a/lib/foundation/comic_source/parser.dart +++ b/lib/foundation/comic_source/parser.dart @@ -185,7 +185,7 @@ class ComicSourceParser { Future> Function(String account, String pwd)? login; - if(_checkExists("account.login")) { + if (_checkExists("account.login")) { login = (account, pwd) async { try { await JsEngine().runCode(""" @@ -536,21 +536,47 @@ class ComicSourceParser { element['default'] == null ? null : jsonEncode(element['default']), )); } - return SearchPageData(options, (keyword, page, searchOption) async { - try { - var res = await JsEngine().runCode(""" + + SearchFunction? loadPage; + + SearchNextFunction? loadNext; + + if (_checkExists('search.load')) { + loadPage = (keyword, page, searchOption) async { + try { + var res = await JsEngine().runCode(""" ComicSource.sources.$_key.search.load( ${jsonEncode(keyword)}, ${jsonEncode(searchOption)}, ${jsonEncode(page)}) """); - return Res( + return Res( + List.generate(res["comics"].length, + (index) => Comic.fromJson(res["comics"][index], _key!)), + subData: res["maxPage"]); + } catch (e, s) { + Log.error("Network", "$e\n$s"); + return Res.error(e.toString()); + } + }; + } else { + loadNext = (keyword, next, searchOption) async { + try { + var res = await JsEngine().runCode(""" + ComicSource.sources.$_key.search.loadNext( + ${jsonEncode(keyword)}, ${jsonEncode(searchOption)}, ${jsonEncode(next)}) + """); + return Res( List.generate(res["comics"].length, (index) => Comic.fromJson(res["comics"][index], _key!)), - subData: res["maxPage"]); - } catch (e, s) { - Log.error("Network", "$e\n$s"); - return Res.error(e.toString()); - } - }); + subData: res["next"], + ); + } catch (e, s) { + Log.error("Network", "$e\n$s"); + return Res.error(e.toString()); + } + }; + } + + return SearchPageData(options, loadPage, loadNext); } LoadComicFunc? _parseLoadComicFunc() { diff --git a/lib/pages/search_result_page.dart b/lib/pages/search_result_page.dart index 178b57d..5d856bb 100644 --- a/lib/pages/search_result_page.dart +++ b/lib/pages/search_result_page.dart @@ -111,6 +111,7 @@ class _SearchResultPageState extends State { @override Widget build(BuildContext context) { + var source = ComicSource.find(sourceKey); return ComicList( key: Key(text + options.toString() + sourceKey), errorLeading: AppSearchBar( @@ -122,9 +123,15 @@ class _SearchResultPageState extends State { onChanged: onChanged, action: buildAction(), ), - loadPage: (i) { - var source = ComicSource.find(sourceKey); - return source!.searchPageData!.loadPage!( + loadPage: source!.searchPageData!.loadPage == null ? null : (i) { + return source.searchPageData!.loadPage!( + text, + i, + options, + ); + }, + loadNext: source.searchPageData!.loadNext == null ? null : (i) { + return source.searchPageData!.loadNext!( text, i, options,