import 'package:get/get.dart'; import 'package:kaer_with_panels/app/common/app_config.dart'; import 'package:kaer_with_panels/app/common/app_run_data.dart'; import 'package:kaer_with_panels/app/services/api_service/kr_api.user.dart'; import 'package:kaer_with_panels/app/utils/kr_common_util.dart'; import 'package:kaer_with_panels/app/localization/app_translations.dart'; import 'package:kaer_with_panels/app/routes/app_pages.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:kaer_with_panels/app/widgets/kr_app_text_style.dart'; import 'package:kaer_with_panels/app/modules/kr_main/controllers/kr_main_controller.dart'; import 'package:easy_refresh/easy_refresh.dart'; /// 邀请进度状态 class KRInviteProgress { final int pending; final int processing; final int success; final int expired; final int registers; final int totalCommission; KRInviteProgress({ this.pending = 0, this.processing = 0, this.success = 0, this.expired = 0, this.registers = 0, this.totalCommission = 0, }); } class KRInviteController extends GetxController { final kr_progress = KRInviteProgress( pending: 0, processing: 0, success: 0, expired: 0, registers: 0, totalCommission: 0, ).obs; final kr_referCode = ''.obs; final kr_isLoading = false.obs; final count = 0.obs; final EasyRefreshController refreshController = EasyRefreshController(); @override void onInit() { super.onInit(); ever(KRAppRunData.getInstance().kr_isLogin, (value) { if (value) { _kr_fetchUserInfo(); _kr_fetchAffiliateCount(); } else { kr_progress.value = KRInviteProgress( pending: 0, processing: 0, success: 0, expired: 0, registers: 0, totalCommission: 0, ); kr_referCode.value = ''; } }); if (KRAppRunData.getInstance().kr_isLogin.value) { _kr_fetchUserInfo(); _kr_fetchAffiliateCount(); } } Future _kr_fetchUserInfo() async { try { kr_isLoading.value = true; final either = await KRUserApi().kr_getUserInfo(); either.fold( (error) => KRCommonUtil.kr_showToast(error.msg), (userInfo) { kr_referCode.value = userInfo.referCode; }, ); } catch (e) { KRCommonUtil.kr_showToast(e.toString()); } finally { kr_isLoading.value = false; } } Future kr_checkLoginStatus() async { return KRAppRunData.getInstance().kr_isLogin.value; } /// 获取分享链接 String kr_getShareLink() { if (kr_referCode.isEmpty) { return ''; } return '${AppConfig.getInstance().kr_invitation_link}${kr_referCode.value}'; } /// 获取二维码内容 String kr_getQRCodeContent() { return kr_getShareLink(); } /// 复制文本到剪贴板 Future _kr_copyToClipboard(String text) async { await Clipboard.setData(ClipboardData(text: text)); KRCommonUtil.kr_showToast(AppTranslations.kr_invite.copiedToClipboard); } Future kr_handleQRShare() async { if (!await kr_checkLoginStatus()) { Get.find().kr_setPage(0); return; } if (kr_referCode.isEmpty) { await _kr_fetchUserInfo(); if (kr_referCode.isEmpty) { KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed); return; } } final qrContent = kr_getQRCodeContent(); if (qrContent.isEmpty) { KRCommonUtil.kr_showToast(AppTranslations.kr_invite.generateQRCodeFailed); return; } // 只有在登录状态下才弹出二维码对话框 if (KRAppRunData.getInstance().kr_isLogin.value) { Get.dialog( Dialog( backgroundColor: Theme.of(Get.context!).cardColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16.r), ), child: Container( padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 24.w), child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( AppTranslations.kr_invite.shareQR, style: KrAppTextStyle( fontSize: 17, fontWeight: FontWeight.w600, color: Theme.of(Get.context!).textTheme.titleMedium?.color, ), ), SizedBox(height: 16.w), Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12.r), border: Border.all( color: Theme.of(Get.context!).dividerColor.withOpacity(0.1), ), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: Offset(0, 2), ), ], ), child: QrImageView( data: qrContent, version: QrVersions.auto, size: 200.w, backgroundColor: Colors.white, foregroundColor: Colors.black, ), ), SizedBox(height: 20.w), Container( width: double.infinity, height: 44.w, child: TextButton( onPressed: () => Get.back(), style: TextButton.styleFrom( backgroundColor: Theme.of(Get.context!).primaryColor.withOpacity(0.1), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(22.r), ), ), child: Text( AppTranslations.kr_invite.close, style: TextStyle( color: Theme.of(Get.context!).textTheme.bodyMedium?.color, fontSize: 16.sp, fontWeight: FontWeight.w500, fontFamily: 'AlibabaPuHuiTi-Regular', ), ), ), ), ], ), ), ), ); } } void kr_viewRewardDetails() { // TODO: 实现查看奖励明细功能 } @override void onReady() { super.onReady(); } @override void onClose() { refreshController.dispose(); super.onClose(); } void increment() => count.value++; /// 处理链接分享 Future kr_handleLinkShare() async { if (!await kr_checkLoginStatus()) { Get.find().kr_setPage(0); return; } if (kr_referCode.isEmpty) { await _kr_fetchUserInfo(); if (kr_referCode.isEmpty) { KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed); return; } } final shareLink = kr_getShareLink(); if (shareLink.isEmpty) { KRCommonUtil.kr_showToast(AppTranslations.kr_invite.generateShareLinkFailed); return; } await _kr_copyToClipboard(shareLink); } /// 处理复制邀请码 Future kr_handleCopyInviteCode() async { if (!await kr_checkLoginStatus()) { Get.find().kr_setPage(0); return; } if (kr_referCode.isEmpty) { await _kr_fetchUserInfo(); if (kr_referCode.isEmpty) { KRCommonUtil.kr_showToast(AppTranslations.kr_invite.getInviteCodeFailed); return; } } await _kr_copyToClipboard(kr_referCode.value); } /// 获取邀请统计信息 Future _kr_fetchAffiliateCount() async { try { final either = await KRUserApi().kr_getAffiliateCount(); either.fold( (error) => KRCommonUtil.kr_showToast(error.msg), (affiliateCount) { kr_progress.value = KRInviteProgress( pending: kr_progress.value.pending, processing: kr_progress.value.processing, success: kr_progress.value.success, expired: kr_progress.value.expired, registers: affiliateCount.registers, totalCommission: affiliateCount.totalCommission, ); }, ); } catch (e) { KRCommonUtil.kr_showToast(e.toString()); } } Future kr_onRefresh() async { if (!KRAppRunData.getInstance().kr_isLogin.value) { refreshController.finishRefresh(); return; } try { await _kr_fetchUserInfo(); await _kr_fetchAffiliateCount(); } finally { refreshController.finishRefresh(); } } }