Files
PiliPlus/lib/pages/search_panel/controller.dart
bggRGjQaUbCoE b4c1568869 tweak
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-08-07 13:49:12 +08:00

98 lines
2.6 KiB
Dart

import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/models/common/search/article_search_type.dart';
import 'package:PiliPlus/models/common/search/user_search_type.dart';
import 'package:PiliPlus/models/common/search/video_search_type.dart';
import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/models/search/result.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/search_result/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class SearchPanelController<R extends SearchNumData<T>, T>
extends CommonListController<R, T> {
SearchPanelController({
required this.keyword,
required this.searchType,
required this.tag,
});
final String tag;
final String keyword;
final SearchType searchType;
// sort
// common
String order = '';
// video
VideoDurationType? videoDurationType; // int duration
VideoZoneType? videoZoneType; // int? tids;
int? pubBegin;
int? pubEnd;
// user
Rx<UserOrderType>? userOrderType;
Rx<UserType>? userType;
// article
Rx<ArticleZoneType>? articleZoneType; // int? categoryId;
SearchResultController? searchResultController;
void onSortSearch({
bool getBack = true,
String? label,
}) {
if (getBack) Get.back();
SmartDialog.dismiss();
if (label != null) {
SmartDialog.showToast("$label」的筛选结果");
}
SmartDialog.showLoading(msg: 'loading');
onReload().whenComplete(SmartDialog.dismiss);
}
@override
void onInit() {
super.onInit();
try {
searchResultController = Get.find<SearchResultController>(tag: tag)
..toTopIndex.listen((index) {
if (index == searchType.index) {
scrollController.animToTop();
}
});
} catch (_) {}
queryData();
}
@override
List<T>? getDataList(R response) {
searchResultController?.count[searchType.index] = response.numResults ?? 0;
return response.list;
}
@override
Future<LoadingState<R>> customGetData() => SearchHttp.searchByType<R>(
searchType: searchType,
keyword: keyword,
page: page,
order: order,
duration: videoDurationType?.index,
tids: videoZoneType?.tids,
orderSort: userOrderType?.value.orderSort,
userType: userType?.value.index,
categoryId: articleZoneType?.value.categoryId,
pubBegin: pubBegin,
pubEnd: pubEnd,
);
@override
Future<void> onReload() {
scrollController.jumpToTop();
return super.onReload();
}
}