const eventTypes = { load: 'load', close: 'close', error: 'error', adClicked: 'adClicked' } const eventNames = [ eventTypes.load, eventTypes.close, eventTypes.error, eventTypes.adClicked ] class AdBase { constructor (adInstance, options) { const _callbacks = this._callbacks = {} eventNames.forEach(item => { _callbacks[item] = [] const name = item[0].toUpperCase() + item.substr(1) this[`on${name}`] = function (callback) { _callbacks[item].push(callback) } }) this._preload = options.preload !== undefined ? options.preload : false this._isLoaded = false this._isLoading = false this._adError = '' this._loadPromiseResolve = null this._loadPromiseReject = null this._showPromiseResolve = null this._showPromiseReject = null const ad = this._ad = adInstance ad.onLoad((e) => { this._isLoaded = true this._isLoading = false if (this._loadPromiseResolve != null) { this._loadPromiseResolve() this._loadPromiseResolve = null } if (this._showPromiseResolve != null) { this._showPromiseResolve() this._showPromiseResolve = null this._showAd() } this._dispatchEvent(eventTypes.load, {}) }) ad.onClose((e) => { this._isLoaded = false this._isLoading = false this._dispatchEvent(eventTypes.close, { isEnded: e.isEnded }) if (this._preload === true) { this._loadAd() } }) ad.onError((e) => { this._isLoading = false const data = { code: e.code, errCode: e.code, errMsg: e.message, detail: e.detail } this._adError = data this._dispatchEvent(eventTypes.error, data) const error = new Error(JSON.stringify(this._adError)) error.code = e.code error.errMsg = e.message error.detail = e.detail if (this._loadPromiseReject != null) { this._loadPromiseReject(error) this._loadPromiseReject = null } if (this._showPromiseReject != null) { this._showPromiseReject(error) this._showPromiseReject = null } }) ad.onAdClicked && ad.onAdClicked((e) => { this._dispatchEvent(eventTypes.adClicked, {}) }) } load () { return new Promise((resolve, reject) => { this._loadPromiseResolve = resolve this._loadPromiseReject = reject if (this._isLoading) { return } if (this._isLoaded) { resolve() } else { this._loadAd() } }) } show () { return new Promise((resolve, reject) => { this._showPromiseResolve = resolve this._showPromiseReject = reject if (this._isLoading) { return } if (this._isLoaded) { this._showAd() resolve() } else { this._loadAd() } }) } destroy () { this._ad.destroy() } getProvider () { return this._ad.getProvider() } _loadAd () { this._adError = '' this._isLoaded = false this._isLoading = true this._ad.load() } _showAd () { this._ad.show() } _dispatchEvent (name, data) { this._callbacks[name].forEach(callback => { if (typeof callback === 'function') { callback(data || {}) } }) } } export { eventTypes, eventNames, AdBase }