rewarded-video-ad.js 2.3 KB
Newer Older
d-u-a's avatar
d-u-a 已提交
1 2 3 4

const eventNames = [
  'load',
  'close',
d-u-a's avatar
d-u-a 已提交
5
  'verify',
d-u-a's avatar
d-u-a 已提交
6 7 8
  'error'
]

d-u-a's avatar
d-u-a 已提交
9 10
const ERROR_CODE_LIST = [-5001, -5002, -5003, -5004, -5005, -5006]

d-u-a's avatar
d-u-a 已提交
11
class RewardedVideoAd {
12
  constructor (options = {}) {
d-u-a's avatar
d-u-a 已提交
13 14 15 16 17 18 19 20 21 22
    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._isLoad = false
d-u-a's avatar
d-u-a 已提交
23
    this._adError = ''
d-u-a's avatar
d-u-a 已提交
24 25
    this._loadPromiseResolve = null
    this._loadPromiseReject = null
26
    const rewardAd = this._rewardAd = plus.ad.createRewardedVideoAd(options)
d-u-a's avatar
d-u-a 已提交
27 28 29 30 31 32 33 34 35 36 37 38
    rewardAd.onLoad((e) => {
      this._isLoad = true
      this._dispatchEvent('load', {})
      if (this._loadPromiseResolve != null) {
        this._loadPromiseResolve()
        this._loadPromiseResolve = null
      }
    })
    rewardAd.onClose((e) => {
      this._loadAd()
      this._dispatchEvent('close', { isEnded: e.isEnded })
    })
39
    rewardAd.onVerify((e) => {
40
      this._dispatchEvent('verify', { isValid: e.isValid })
41
    })
d-u-a's avatar
d-u-a 已提交
42
    rewardAd.onError((e) => {
43 44
      const { code, message } = e
      const data = { code: code, errMsg: message }
d-u-a's avatar
d-u-a 已提交
45
      this._adError = message
46
      this._dispatchEvent('error', data)
d-u-a's avatar
d-u-a 已提交
47
      if ((code === -5005 || ERROR_CODE_LIST.index(code) === -1) && this._loadPromiseReject != null) {
48
        this._loadPromiseReject(data)
d-u-a's avatar
d-u-a 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
        this._loadPromiseReject = null
      }
    })
    this._loadAd()
  }
  load () {
    return new Promise((resolve, reject) => {
      if (this._isLoad) {
        resolve()
        return
      }
      this._loadPromiseResolve = resolve
      this._loadPromiseReject = reject
      this._loadAd()
    })
  }
  show () {
    return new Promise((resolve, reject) => {
      if (this._isLoad) {
        this._rewardAd.show()
        resolve()
      } else {
d-u-a's avatar
d-u-a 已提交
71
        reject(new Error(this._adError))
d-u-a's avatar
d-u-a 已提交
72 73 74
      }
    })
  }
75 76 77
  getProvider () {
    return this._rewardAd.getProvider()
  }
78 79 80
  destroy () {
    this._rewardAd.destroy()
  }
d-u-a's avatar
d-u-a 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93
  _loadAd () {
    this._isLoad = false
    this._rewardAd.load()
  }
  _dispatchEvent (name, data) {
    this._callbacks[name].forEach(callback => {
      if (typeof callback === 'function') {
        callback(data || {})
      }
    })
  }
}

94 95
export function createRewardedVideoAd (options) {
  return new RewardedVideoAd(options)
d-u-a's avatar
d-u-a 已提交
96
}