import { IAdsInitParams, IAdConfigParams, IAdBreakParams, IAdUnitParams, JoliboxAdsForGame } from '@jolibox/ads'; import { IAdsHandler } from '../ads'; declare global { interface Window { // gamedistribution gdsdk: { preloadAd: (type: string) => Promise; showAd: (type: string) => Promise<{ adType: string; args: { success: boolean } }>; }; } } export default class GamedistributionAdsHandler implements IAdsHandler { private static instance: GamedistributionAdsHandler; private constructor() { // 不需要初始化 } public static getInstance(): GamedistributionAdsHandler { if (!GamedistributionAdsHandler.instance) { GamedistributionAdsHandler.instance = new GamedistributionAdsHandler(); } return GamedistributionAdsHandler.instance; } getAdsInstance(): JoliboxAdsForGame { return GamedistributionAdsHandler.getInstance() as unknown as JoliboxAdsForGame; } init(): void { // 不需要初始化 } adConfig(params: IAdConfigParams): void { if (params.onReady) params.onReady(); } adBreak(params: IAdBreakParams): Promise | void { try { if (params.type === 'reward') { window.gdsdk .preloadAd('rewarded') .then(() => { params.beforeReward?.(() => { if (params.beforeAd) params.beforeAd(); window.gdsdk .showAd('rewarded') .then((response) => { if (response?.args?.success) { params.adViewed?.(); } else { params.adDismissed?.(); } if (params.afterAd) params.afterAd(); params.adBreakDone?.({ breakType: params.type, breakName: params.name, breakFormat: 'reward', breakStatus: response?.args?.success ? 'viewed' : 'dismissed' }); }) .catch((error) => { console.log('showReward error => ', error); params.adBreakDone?.({ breakType: params.type, breakName: params.name, breakFormat: 'reward', breakStatus: 'noAdPreloaded' }); }); }); }) .catch((error) => { console.log('preloadAd error => ', error); params.adBreakDone?.({ breakType: params.type, breakName: params.name, breakFormat: 'reward', breakStatus: 'noAdPreloaded' }); }); } else { if (params.type !== 'preroll' && params.beforeAd) params.beforeAd(); window.gdsdk.showAd('interstitial').then(() => { if (params.type !== 'preroll' && params.afterAd) params.afterAd(); params.adBreakDone?.({ breakType: params.type, breakName: params.type === 'preroll' ? undefined : params.name, breakFormat: 'interstitial', breakStatus: 'viewed' }); }); } } catch (e) { console.log('adBreak error => ', e); params.adBreakDone?.({ breakType: params.type, breakName: params.type === 'preroll' ? undefined : params.name, breakFormat: params.type === 'reward' ? 'reward' : 'interstitial', breakStatus: 'error' }); } } adUnit(): void { // 不需要初始化 } }