mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
178 lines
4.8 KiB
Dart
178 lines
4.8 KiB
Dart
import 'package:PiliPlus/http/loading_state.dart';
|
|
import 'package:PiliPlus/models/dynamics/result.dart';
|
|
import 'package:PiliPlus/models/member/archive.dart';
|
|
import 'package:PiliPlus/utils/extension.dart';
|
|
import 'package:PiliPlus/utils/utils.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:PiliPlus/http/member.dart';
|
|
|
|
class MemberSearchController extends GetxController
|
|
with GetSingleTickerProviderStateMixin {
|
|
final scrollController = ScrollController();
|
|
late final tabController = TabController(vsync: this, length: 2);
|
|
final textEditingController = TextEditingController();
|
|
final searchFocusNode = FocusNode();
|
|
|
|
RxBool hasData = false.obs;
|
|
|
|
late int mid;
|
|
RxString uname = ''.obs;
|
|
|
|
int archivePn = 1;
|
|
RxInt archiveCount = (-1).obs;
|
|
bool isEndArchive = false;
|
|
Rx<LoadingState> archiveState = LoadingState.loading().obs;
|
|
|
|
String offset = '';
|
|
int dynamicPn = 1;
|
|
RxInt dynamicCount = (-1).obs;
|
|
bool isEndDynamic = false;
|
|
Rx<LoadingState> dynamicState = LoadingState.loading().obs;
|
|
|
|
dynamic wwebid;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
mid = int.parse(Get.parameters['mid']!);
|
|
uname.value = Get.parameters['uname']!;
|
|
Utils.getWwebid(mid).then((res) {
|
|
wwebid = res;
|
|
});
|
|
}
|
|
|
|
// 清空搜索
|
|
void onClear() {
|
|
if (textEditingController.value.text.isNotEmpty) {
|
|
textEditingController.clear();
|
|
hasData.value = false;
|
|
searchFocusNode.requestFocus();
|
|
} else {
|
|
Get.back();
|
|
}
|
|
}
|
|
|
|
// 提交搜索内容
|
|
void submit() {
|
|
if (textEditingController.text.isNotEmpty) {
|
|
hasData.value = true;
|
|
|
|
dynamicCount.value = -1;
|
|
dynamicState.value = LoadingState.loading();
|
|
refreshArchive();
|
|
|
|
archiveCount.value = -1;
|
|
archiveState.value = LoadingState.loading();
|
|
refreshDynamic();
|
|
}
|
|
}
|
|
|
|
Future refreshDynamic() async {
|
|
offset = '';
|
|
dynamicPn = 1;
|
|
isEndDynamic = false;
|
|
await searchDynamic();
|
|
}
|
|
|
|
Future refreshArchive() async {
|
|
archivePn = 1;
|
|
isEndArchive = false;
|
|
await searchArchives();
|
|
}
|
|
|
|
Future searchDynamic([bool isRefresh = true]) async {
|
|
if (isRefresh.not && isEndDynamic) return;
|
|
dynamic res = await MemberHttp.memberDynamicSearch(
|
|
mid: mid,
|
|
pn: dynamicPn,
|
|
offset: offset,
|
|
keyword: textEditingController.text,
|
|
);
|
|
if (res['status']) {
|
|
DynamicsDataModel data = res['data'];
|
|
List<DynamicItemModel>? items = data.items;
|
|
dynamicCount.value = data.total ?? 0;
|
|
offset = data.offset ?? '';
|
|
|
|
if (data.hasMore == false || items.isNullOrEmpty) {
|
|
isEndDynamic = true;
|
|
if (isRefresh) {
|
|
dynamicState.value = LoadingState.success(items);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (isRefresh) {
|
|
if (items!.length >= dynamicCount.value) {
|
|
isEndDynamic = true;
|
|
}
|
|
dynamicState.value = LoadingState.success(items);
|
|
} else if (dynamicState.value is Success) {
|
|
List<DynamicItemModel> currentList =
|
|
(dynamicState.value as Success).response;
|
|
currentList.addAll(items!);
|
|
if (currentList.length >= dynamicCount.value) {
|
|
isEndDynamic = true;
|
|
}
|
|
dynamicState.refresh();
|
|
}
|
|
dynamicPn++;
|
|
} else if (isRefresh) {
|
|
dynamicState.value = LoadingState.error(res['msg']);
|
|
}
|
|
}
|
|
|
|
// 搜索视频
|
|
Future searchArchives([bool isRefresh = true]) async {
|
|
if (isRefresh.not && isEndArchive) return;
|
|
dynamic res = await MemberHttp.memberArchive(
|
|
mid: mid,
|
|
pn: archivePn,
|
|
keyword: textEditingController.text,
|
|
order: 'pubdate',
|
|
wwebid: wwebid,
|
|
);
|
|
if (res['status']) {
|
|
MemberArchiveDataModel data = res['data'];
|
|
List<VListItemModel>? vlist = data.list?.vlist;
|
|
archiveCount.value = data.page?['count'] ?? 0;
|
|
|
|
if (vlist.isNullOrEmpty) {
|
|
isEndArchive = true;
|
|
if (isRefresh) {
|
|
archiveState.value = LoadingState.success(vlist);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (isRefresh) {
|
|
if (vlist!.length >= archiveCount.value) {
|
|
isEndArchive = true;
|
|
}
|
|
archiveState.value = LoadingState.success(vlist);
|
|
} else if (dynamicState.value is Success) {
|
|
List<VListItemModel> currentList =
|
|
(dynamicState.value as Success).response;
|
|
currentList.addAll(vlist!);
|
|
if (currentList.length >= archiveCount.value) {
|
|
isEndDynamic = true;
|
|
}
|
|
archiveState.refresh();
|
|
}
|
|
archivePn++;
|
|
} else if (isRefresh) {
|
|
archiveState.value = LoadingState.error(res['msg']);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
textEditingController.dispose();
|
|
searchFocusNode.dispose();
|
|
scrollController.dispose();
|
|
tabController.dispose();
|
|
super.onClose();
|
|
}
|
|
}
|