import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:injectable/injectable.dart'; import 'package:location/base/base_controller.dart'; import 'package:location/data/repositories/account_repository.dart'; import 'package:location/data/repositories/member_repository.dart'; import '../../../data/bean/goods_bean.dart'; import '../../../data/bean/member_status_info.dart'; import '../../../data/bean/pay_item_bean.dart'; import '../../../data/consts/web_url.dart'; import '../../../handler/error_handler.dart'; import '../../../helper/member_pay_helper.dart'; import '../../../resource/assets.gen.dart'; import '../../../resource/string.gen.dart'; import '../../../utils/async_util.dart'; import '../../../utils/toast_util.dart'; import '../../browser/browser_view.dart'; @injectable class MemberActivityController extends BaseController { final Rxn _selectedGoods = Rxn(); GoodsBean? get selectedGoods => _selectedGoods.value; MemberStatusInfo? get memberStatusInfo => accountRepository.memberStatusInfo.value; final List funImages = [ Assets.images.imgMemberActivityBanner1.provider(), Assets.images.imgMemberActivityBanner2.provider(), Assets.images.imgMemberActivityBanner3.provider(), Assets.images.imgMemberActivityBanner4.provider(), ]; final RxList goodsList = [].obs; final List payItemList = []; CancelableFuture? _memberDataFuture; final AccountRepository accountRepository; final MemberRepository memberRepository; final MemberPayHelper memberPayHelper; Duration? get activityDuration => memberRepository.activityDuration.value; MemberActivityController( this.accountRepository, this.memberRepository, this.memberPayHelper); @override void onReady() { super.onReady(); refreshMemberData(); memberRepository.startActivityCountdown(); precacheImage( Assets.images.iconMemberSpecialProductsSelect.provider(), Get.context!); precacheImage( Assets.images.iconMemberSpecialProductsNormal.provider(), Get.context!); } void refreshMemberData() { _memberDataFuture?.cancel(); _memberDataFuture = AsyncUtil.retryWithExponentialBackoff(() => _requestMemberData(), 4); _memberDataFuture?.catchError((error) { ErrorHandler.toastError(error); }); } Future _requestMemberData() { return memberRepository .guideItemList(itemListType: Platform.isIOS ? 2 : 0) .then((response) { goodsList.clear(); payItemList.clear(); _selectedGoods.value = null; if (response.payInfoList?.isNotEmpty == true) { payItemList.addAll(response.payInfoList!); } if (response.goodsList?.isNotEmpty == true) { goodsList.addAll(response.goodsList!); _selectedGoods.value = goodsList.first; } if (goodsList.isNotEmpty && payItemList.isNotEmpty) { memberRepository.setLastSelectedMember( goodsList.first, payItemList.first); } }); } void onBack() { Get.back(); } void onBuyClick() { if (payItemList.isEmpty) { ToastUtil.show(StringName.memberActivityNoPayway); return; } memberPayHelper.launchPay(selectedGoods, payItemList.first); } void onGoodsItemClick(GoodsBean goodsInfo) { _selectedGoods.value = goodsInfo; onBuyClick(); } void onPrivacyPolicyClick() { BrowserPage.start(WebUrl.privacyPolicy); } void onTermOfServiceClick() { BrowserPage.start(WebUrl.userAgreement); } void onRenewalAgreementClick() { BrowserPage.start(WebUrl.renewalAgreement); } void onRecoverClick() {} @override void onClose() { super.onClose(); _memberDataFuture?.cancel(); } }