Files
PiliPlus/lib/pages/search_panel/controller.dart
bggRGjQaUbCoE 7b3d132802 opt: search ctr
related #137

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-01-10 17:41:49 +08:00

114 lines
3.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/pages/common/common_controller.dart';
import 'package:PiliPlus/pages/search_result/controller.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
class SearchPanelController extends CommonController {
SearchPanelController({
this.keyword,
required this.searchType,
required this.tag,
});
String? keyword;
SearchType searchType;
// 结果排序方式 搜索类型为视频、专栏及相簿时
RxString order = ''.obs;
// 视频时长筛选 仅用于搜索视频
RxInt duration = 0.obs;
int? tids;
int? orderSort;
int? userType;
int? categoryId;
String tag;
int? pubBegin;
int? pubEnd;
@override
void onInit() {
super.onInit();
queryData();
}
@override
bool customHandleResponse(Success response) {
try {
Get.find<SearchResultController>(tag: tag).count[searchType.index] =
response.response.numResults;
} catch (_) {}
if (response.response.list != null) {
isEnd = response.response.list.isEmpty;
if (currentPage != 1 && loadingState.value is Success) {
response.response.list
?.insertAll(0, (loadingState.value as Success).response);
}
loadingState.value = LoadingState.success(response.response.list);
if (currentPage == 1) {
onPushDetail(response.response.list);
}
} else {
isEnd = true;
if (currentPage == 1) {
loadingState.value = LoadingState.success([]);
}
}
return true;
}
void onPushDetail(resultList) async {
// 匹配输入内容如果是AV、BV号且有结果 直接跳转详情页
Map matchRes = IdUtils.matchAvorBv(input: keyword);
List matchKeys = matchRes.keys.toList();
String? bvid;
try {
bvid = resultList.first.bvid;
} catch (_) {
bvid = null;
}
// keyword 可能输入纯数字
int? aid;
try {
aid = resultList.first.aid;
} catch (_) {
aid = null;
}
if (matchKeys.isNotEmpty && searchType == SearchType.video ||
aid.toString() == keyword) {
int cid = await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (matchKeys.isNotEmpty &&
matchKeys.first == 'BV' &&
matchRes[matchKeys.first] == bvid ||
matchKeys.isNotEmpty &&
matchKeys.first == 'AV' &&
matchRes[matchKeys.first] == aid ||
aid.toString() == keyword) {
Get.toNamed(
'/video?bvid=$bvid&cid=$cid',
arguments: {
'videoItem': resultList.first,
'heroTag': Utils.makeHeroTag(bvid),
},
);
}
}
}
@override
Future<LoadingState> customGetData() => SearchHttp.searchByType(
searchType: searchType,
keyword: keyword!,
page: currentPage,
order: order.value,
duration: searchType.name != 'video' ? null : duration.value,
tids: tids,
orderSort: orderSort,
userType: userType,
categoryId: categoryId,
pubBegin: pubBegin,
pubEnd: pubEnd,
);
}