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/utils/kr_log_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'; import 'package:kaer_with_panels/app/widgets/dialogs/kr_dialog.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(); // 用于标记是否已经显示过对话框(避免重复弹出) bool _hasShownDialog = false; @override void onInit() { super.onInit(); final appRunData = KRAppRunData.getInstance(); // 监听登录状态变化 ever(appRunData.kr_isLogin, (value) { // 只有账号密码登录才获取数据 if (value && !appRunData.isDeviceLogin()) { _kr_fetchUserInfo(); _kr_fetchAffiliateCount(); _hasShownDialog = false; // 重置对话框标记 } else { kr_progress.value = KRInviteProgress( pending: 0, processing: 0, success: 0, expired: 0, registers: 0, totalCommission: 0, ); kr_referCode.value = ''; } }); // 如果已经是正常登录状态,加载数据 if (appRunData.kr_isLogin.value && !appRunData.isDeviceLogin()) { _kr_fetchUserInfo(); _kr_fetchAffiliateCount(); } } /// 当页面进入视图时调用(从视图层调用) void kr_onPageEnter() { final appRunData = KRAppRunData.getInstance(); final isDeviceLogin = appRunData.isDeviceLogin(); KRLogUtil.kr_i('📄 [InviteController] 页面进入', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_isLogin: ${appRunData.kr_isLogin.value}', tag: 'InviteController'); KRLogUtil.kr_i(' - isDeviceLogin: $isDeviceLogin', tag: 'InviteController'); KRLogUtil.kr_i(' - _hasShownDialog: $_hasShownDialog', tag: 'InviteController'); // 如果未登录或设备登录,且还没显示过对话框 if ((!appRunData.kr_isLogin.value || isDeviceLogin) && !_hasShownDialog) { _hasShownDialog = true; // 标记已显示 KRLogUtil.kr_i('🔒 [InviteController] 未登录或设备登录,显示绑定提示对话框', tag: 'InviteController'); // 延迟执行,确保页面加载完成 Future.delayed(const Duration(milliseconds: 100), () { KRLogUtil.kr_i('💬 [InviteController] 准备显示对话框...', tag: 'InviteController'); try { KRDialog.show( title: AppTranslations.kr_dialog.deviceLoginBindingTitle, message: AppTranslations.kr_dialog.deviceLoginBindingMessage, confirmText: AppTranslations.kr_dialog.kr_ok, cancelText: AppTranslations.kr_dialog.kr_cancel, onConfirm: () { KRLogUtil.kr_i('✅ [InviteController] 用户点击确定,跳转到登录页', tag: 'InviteController'); Get.back(); // 关闭对话框 // 等待对话框完全关闭后再跳转到登录页面 Future.delayed(const Duration(milliseconds: 300), () { // 先跳转到首页,确保登录后返回到首页而不是邀请页面 Get.find().kr_setPage(0); Future.delayed(const Duration(milliseconds: 100), () { Get.toNamed(Routes.MR_LOGIN); }); }); }, onCancel: () { KRLogUtil.kr_i('❌ [InviteController] 用户点击取消,返回首页', tag: 'InviteController'); Get.back(); // 关闭对话框 // 等待对话框完全关闭后再跳转到首页 Future.delayed(const Duration(milliseconds: 100), () { Get.find().kr_setPage(0); }); }, ); KRLogUtil.kr_i('✅ [InviteController] 对话框已显示', tag: 'InviteController'); } catch (e) { KRLogUtil.kr_e('❌ [InviteController] 显示对话框失败: $e', tag: 'InviteController'); } }); } } // ⚠️ 已废弃:新版本后端不再提供 kr_getUserInfo 接口 // 从 AppRunData 获取邀请码(登录后自动获取) Future _kr_fetchUserInfo() async { try { kr_isLoading.value = true; KRLogUtil.kr_i('🔍 [InviteController] 开始获取邀请码...', tag: 'InviteController'); // 从 AppRunData 获取用户邀请码(已在登录时获取) final appData = KRAppRunData.getInstance(); KRLogUtil.kr_i('📊 [InviteController] AppRunData 状态:', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_isLogin: ${appData.kr_isLogin.value}', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_account: ${appData.kr_account.value}', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_referCode: ${appData.kr_referCode.value}', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_balance: ${appData.kr_balance.value}', tag: 'InviteController'); KRLogUtil.kr_i(' - kr_commission: ${appData.kr_commission.value}', tag: 'InviteController'); kr_referCode.value = appData.kr_referCode.value; KRLogUtil.kr_i('📋 [InviteController] 获取到邀请码: "${kr_referCode.value}"', tag: 'InviteController'); if (kr_referCode.value.isEmpty) { KRLogUtil.kr_w('⚠️ [InviteController] 邀请码为空!', tag: 'InviteController'); } } catch (e) { KRLogUtil.kr_e('❌ [InviteController] 获取邀请码失败: $e', tag: 'InviteController'); KRCommonUtil.kr_showToast(e.toString()); } finally { kr_isLoading.value = false; } } Future kr_checkLoginStatus() async { final appRunData = KRAppRunData.getInstance(); // 只有账号密码登录才算登录,设备登录不算 return appRunData.kr_isLogin.value && !appRunData.isDeviceLogin(); } /// 获取分享链接 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 { final appRunData = KRAppRunData.getInstance(); // 只有账号密码登录才允许刷新 if (!appRunData.kr_isLogin.value || appRunData.isDeviceLogin()) { refreshController.finishRefresh(); return; } try { await _kr_fetchUserInfo(); await _kr_fetchAffiliateCount(); } finally { refreshController.finishRefresh(); } } }