import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/models/common/member/contribute_type.dart'; import 'package:PiliPlus/models/member/info.dart'; import 'package:PiliPlus/models_new/space/space_archive/data.dart'; import 'package:PiliPlus/models_new/space/space_archive/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:get/get.dart'; class HorizontalMemberPageController extends CommonListController { HorizontalMemberPageController({this.mid, required this.currAid}); dynamic mid; final Rx> userState = LoadingState.loading().obs; final RxMap userStat = {}.obs; @override void onInit() { super.onInit(); getUserInfo(); queryData(); } Future getUserInfo() async { final res = await MemberHttp.memberInfo(mid: mid); userState.value = res; if (res.isSuccess) { getMemberStat(); getMemberView(); } } Future getMemberStat() async { final res = await MemberHttp.memberStat(mid: mid); if (res case Success(:final response)) { userStat.addAll(response); } } Future getMemberView() async { if (!Accounts.main.isLogin) { return; } final res = await MemberHttp.memberView(mid: mid); if (res case Success(:final response)) { userStat.addAll(response); } } @override bool customHandleResponse(bool isRefresh, Success response) { SpaceArchiveData data = response.response; count.value = data.count ?? -1; if (isRefresh) { if (isLoadPrevious) { hasPrev = data.hasPrev ?? false; } else { hasNext = data.hasNext ?? false; } } if (isLoadPrevious) { if (loadingState.value case Success(:final response)) { (data.item ??= []).addAll(response!); } } else if (!isRefresh) { if (loadingState.value case Success(:final response)) { (data.item ??= []).insertAll(0, response!); } } firstAid = data.item?.firstOrNull?.param; lastAid = data.item?.lastOrNull?.param; loadingState.value = Success(data.item); isLoadPrevious = false; page++; return true; } String? currAid; String? firstAid; String? lastAid; RxString order = 'pubdate'.obs; RxInt count = (-1).obs; bool isLoadPrevious = false; bool hasPrev = true; bool hasNext = true; @override Future> customGetData() => MemberHttp.spaceArchive( type: ContributeType.video, mid: mid, aid: page == 1 ? currAid : isLoadPrevious ? firstAid : lastAid, order: order.value, sort: page != 1 && isLoadPrevious ? 'asc' : null, pn: null, next: null, seasonId: null, seriesId: null, includeCursor: page == 1 ? true : null, ); @override Future onRefresh() { if (!hasPrev) { return Future.syncValue(null); } isLoadPrevious = true; return queryData(); } @override Future onReload() { firstAid = null; lastAid = null; hasNext = true; hasPrev = true; isEnd = false; page = 1; scrollController.jumpToTop(); return super.onReload(); } void queryBySort() { if (isLoading) return; order.value = order.value == 'pubdate' ? 'click' : 'pubdate'; onReload(); } }