Files
huangguo_android/lib/alert/vip_guide/guide_common.dart
T
2026-09-15 15:44:13 +07:00

60 lines
2.7 KiB
Dart

import 'package:get/get.dart';
import 'package:hgdj/hj_model/splash/domain_source_model.dart';
import 'package:hgdj/tools_base/global_store/store.dart';
import '../../hj_page/main_page/provider/msg_provider.dart';
import '../../hj_page/mine/mine_vip/mine_charge_vip_page.dart';
import '../../hj_page/mine/mine_vip/pay_order_source.dart';
import '../../hj_page/mine/mine_vip/vip_product_manager.dart';
import '../../hj_page/mine/mine_vip/vip_support_model.dart';
import '../../tools_base/debug_log.dart';
import 'guide_config.dart';
import 'guide_manager.dart';
/// 付费引导弹窗的共用逻辑:取卡 / 场景来源 / 跳会员页
/// 弹窗前置校验都收在这里,返回 null 即不弹:productId、cover 缺任一或卡不在列表里
/// 都算配置有误,一律不弹、不做兜底回落。
/// 顺带备好卡数据(有缓存走缓存),播放页可提前调一次,别暂停后才拉数据白停几百毫秒
Future<VipProductModel?> loadGuideCard(GuideScene scene) async {
final config = GuideManager().configOf(scene);
if (config == null) return null; // 开关关着
if (config.productId?.isNotEmpty != true ||
config.cover?.isNotEmpty != true) {
debugLog('paymentGuide', '${scene.value} 缺 productId 或 cover,配置有误不弹');
return null;
}
if (vipProductManager.vipCards.isEmpty)
await vipProductManager.loadVipCards();
final card = vipProductManager.vipCards
.firstWhereOrNull((e) => e.productID == config.productId);
if (card == null)
debugLog(
'paymentGuide', '${scene.value} 配置的会员卡不在列表里,不弹: ${config.productId}');
return card;
}
/// 分层门槛:非 VIP + 未付费的 under7/over7 两档。只剩上新横幅在用,其余场景走开关
bool isUnpayGuideUser() {
if (globalStore.isVIP) return false;
final status = MineMsgProvider().payTier?.status;
return status == PayTier.under7DayUnpay || status == PayTier.over7DayUnpay;
}
/// 场景 → 下单来源页(透传 /mine/topay 的 sourcePage)
PaySourcePage guideSourcePage(GuideScene scene) => switch (scene) {
GuideScene.homeNewUser ||
GuideScene.homeOldUser ||
GuideScene.homeNewUserFreeTrial =>
PaySourcePage.homeUserSegment,
GuideScene.vipCenter => PaySourcePage.vipCenter,
_ => PaySourcePage.videoBottomSheet, //播放页起播引导 / 返回挽留
};
/// 开通 → 关弹窗 + 进会员页并选中该卡(落地页 VIP_CENTER 开着还会再弹一次,不去重)
void goVipDetail(VipProductModel card, {required PaySourcePage sourcePage}) {
Get.back(result: true); // 带回"去开通了",调用方据此不恢复播放
Get.to(
() => MineChargeVipPage(vipID: card.productID, sourcePage: sourcePage));
}