import { checkSubscriptionFrequency, updateSubscriptionFrequency } from '../check-frequency'; import { IUseModalFrequencyConfig, rewardsEmitter, UseModalFrequencyEventName, InvokeSubscriptionEventName, UseSubscriptionResultEventName } from '@/common/rewards/reward-emitter'; import { createEventPromiseHandler } from '@/common/rewards/registers/utils/event-listener'; import { canIUseNative } from '@/native/api/base'; import { subscriptionService } from '@/native/subscription'; import { createLoading } from '@jolibox/ui'; interface CurrencyModalConfig { frequencyConfigKey: keyof IUseModalFrequencyConfig['joliCoinUseAndCharge']; frequencyChecker: (config: { dailyMaxPopUps?: number; minInterval?: number; }) => Promise<{ canShow: boolean; isFirst: boolean }>; frequencyUpdater: () => Promise; } const SUBSCRIPTION_MODAL_CONFIG: Record<'SUBSCRIPTION', CurrencyModalConfig> = { SUBSCRIPTION: { frequencyConfigKey: 'joinMember', frequencyChecker: checkSubscriptionFrequency, frequencyUpdater: updateSubscriptionFrequency } }; const loading = createLoading(); const modalUseFrequencyConfig = createEventPromiseHandler< IUseModalFrequencyConfig, typeof UseModalFrequencyEventName >(rewardsEmitter, UseModalFrequencyEventName); modalUseFrequencyConfig.getData(); /** * confirm currency modal - 支持 jolicoin 和 gem */ rewardsEmitter.on(InvokeSubscriptionEventName, async (type: 'SUBSCRIPTION') => { // 获取货币类型配置 const modalConfig = SUBSCRIPTION_MODAL_CONFIG['SUBSCRIPTION']; if (!canIUseNative('invokeSubscriptionPanelSync')) { //TODO: show Toast console.info('invokeSubscriptionPanelSync not supported'); setTimeout(() => { rewardsEmitter.emit(UseSubscriptionResultEventName, { result: 'FAILED' }); }, 0); return; } await loading.show({ duration: 3000 }); const config = await modalUseFrequencyConfig.getData(); const { canShow: canShowUseModal, isFirst: isFirstUseModal } = await modalConfig.frequencyChecker( config.joliCoinUseAndCharge[modalConfig.frequencyConfigKey] ); loading.hide(); // If not used directly, then check frequency control. if (!canShowUseModal) { // return by frequency control rewardsEmitter.emit(UseSubscriptionResultEventName, { result: 'FAILED' }); return; } const { data, code } = await subscriptionService.invokeSubscriptionPanel(); if (code == 'SUCCESS') { rewardsEmitter.emit(UseSubscriptionResultEventName, { result: 'SUCCESS' }); } else { rewardsEmitter.emit(UseSubscriptionResultEventName, { result: 'FAILED' }); } // 根据货币类型更新使用频次 await modalConfig.frequencyUpdater(); });