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 archiveState = LoadingState.loading().obs; String offset = ''; int dynamicPn = 1; RxInt dynamicCount = (-1).obs; bool isEndDynamic = false; Rx 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']; if (data.hasMore == false || data.items.isNullOrEmpty) { isEndDynamic = true; } if (isRefresh) { dynamicCount.value = data.total ?? 0; } offset = data.offset ?? ''; if (isRefresh.not && dynamicState.value is Success) { data.items ??= []; data.items!.insertAll(0, (dynamicState.value as Success).response); } if (!isEndDynamic && (data.items?.length ?? 0) >= dynamicCount.value) { isEndDynamic = true; } dynamicPn++; dynamicState.value = LoadingState.success(data.items); } 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']; if (isRefresh) { archiveCount.value = data.page?['count'] ?? 0; } if (data.list == null || data.list!.vlist.isNullOrEmpty) { isEndArchive = true; } if (isRefresh.not && archiveState.value is Success) { data.list ??= ArchiveListModel(); data.list!.vlist ??= []; data.list!.vlist! .insertAll(0, (archiveState.value as Success).response); } if (!isEndArchive && (data.list?.vlist?.length ?? 0) >= archiveCount.value) { isEndArchive = true; } archivePn++; archiveState.value = LoadingState.success(data.list?.vlist); } else if (isRefresh) { archiveState.value = LoadingState.error(res['msg']); } } @override void onClose() { textEditingController.dispose(); searchFocusNode.dispose(); scrollController.dispose(); tabController.dispose(); super.onClose(); } }