export type RewardType = | 'ADS' | 'JOLI_COIN' | 'JOLI_COIN_ONLY' | 'JOLI_GEM' | 'JOLI_GEM_ONLY' | 'SUBSCRIPTION'; import { context } from '../context'; import type { AdsRewardsHandler } from './registers/use-ads'; import { IUseModalFrequencyConfig, DefaltJoliCoinUseAndCharge, DefaltLoginGuide } from './reward-emitter'; export interface RewardHandlerMap { ADS: AdsRewardsHandler; JOLI_COIN: (params?: unknown) => Promise; // coins + ads JOLI_COIN_ONLY: (params?: unknown) => Promise; // coins only JOLI_GEM: (params?: unknown) => Promise; // gem + ads JOLI_GEM_ONLY: (params?: unknown) => Promise; // gem only SUBSCRIPTION: (params?: unknown) => Promise; // subscription } export type RewardHandler = RewardHandlerMap[T]; const isTestMode = context.testMode; export function createRewardsHelper() { const rewardsHandlers = new Map>(); let rewardFetcher: ((...args: any[]) => Promise) | undefined; let rewardFrequencyConfigFetcher: ((...args: any[]) => Promise) | undefined; return { registerRewardHandler(type: T, handler: RewardHandler) { rewardsHandlers.set(type, handler); }, async handleReward(rewardsTypes: T[], ...args: Parameters>) { const result = await rewardsTypes.reduce(async (prevPromise, type) => { const prevResult = await prevPromise; if (prevResult === true) return true; isTestMode && console.log(`handleReward ${type}`); const handler = rewardsHandlers.get(type); const nextResult = handler ? await handler(...args) : prevResult; isTestMode && console.log(`handleReward ${type} ${nextResult}`); return nextResult; }, Promise.resolve(false)); return result; }, async registerRewardsFetcher(fetcher: (...args: any[]) => Promise) { rewardFetcher = async (...args: unknown[]) => { try { const rewardsTypes = await fetcher(...args); return rewardsTypes; } catch (e) { console.error(`getRewardOptions error:`, e); return ['ADS']; } }; }, async registerRewardFrequencyConfigFetcher( fetcher: (...args: any[]) => Promise ) { rewardFrequencyConfigFetcher = async (...args: unknown[]) => { try { const config = await fetcher(...args); return config; } catch (e) { console.error(`getRewardOptions error:`, e); return { joliCoinUseAndCharge: DefaltJoliCoinUseAndCharge, loginGuide: DefaltLoginGuide }; } }; }, async getRewardsTypes(...args: unknown[]): Promise { if (!rewardFetcher) { return ['ADS']; } return await rewardFetcher(...args); }, async getRewardFrequencyConfig(...args: unknown[]): Promise { if (!rewardFrequencyConfigFetcher) { return { joliCoinUseAndCharge: DefaltJoliCoinUseAndCharge, loginGuide: DefaltLoginGuide }; } return await rewardFrequencyConfigFetcher(...args); } }; } export type RewardsHelper = ReturnType;