rewarded-video-ad.js 3.6 KB
Newer Older
d-u-a's avatar
d-u-a 已提交
1 2 3
const eventNames = [
  'load',
  'close',
d-u-a's avatar
d-u-a 已提交
4
  'verify',
d-u-a's avatar
d-u-a 已提交
5 6
  'error',
  'adClicked'
d-u-a's avatar
d-u-a 已提交
7 8
]

d-u-a's avatar
d-u-a 已提交
9
const ERROR_CODE_LIST = [-5001, -5002, -5003, -5004, -5005, -5006]
10 11 12
const EXPIRED_TIME = 1000 * 60 * 30
const EXPIRED_TEXT = { code: -5008, errMsg: '广告数据已过期,请重新加载' }
const ProviderType = { CSJ: 'csj', GDT: 'gdt' }
d-u-a's avatar
d-u-a 已提交
13

d-u-a's avatar
d-u-a 已提交
14
class RewardedVideoAd {
15
  constructor (options = {}) {
d-u-a's avatar
d-u-a 已提交
16 17 18 19 20 21 22 23 24
    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)
      }
    })

25
    this._preload = options.preload !== undefined ? options.preload : true
d-u-a's avatar
d-u-a 已提交
26
    this._isLoad = false
27
    this._isLoading = false
d-u-a's avatar
d-u-a 已提交
28
    this._adError = ''
d-u-a's avatar
d-u-a 已提交
29 30
    this._loadPromiseResolve = null
    this._loadPromiseReject = null
31 32
    this._lastLoadTime = 0

33
    const rewardAd = this._rewardAd = plus.ad.createRewardedVideoAd(options)
d-u-a's avatar
d-u-a 已提交
34 35
    rewardAd.onLoad((e) => {
      this._isLoad = true
36
      this._isLoading = false
37
      this._lastLoadTime = Date.now()
38
      this._dispatchEvent('load', {})
39

d-u-a's avatar
d-u-a 已提交
40 41 42 43 44 45
      if (this._loadPromiseResolve != null) {
        this._loadPromiseResolve()
        this._loadPromiseResolve = null
      }
    })
    rewardAd.onClose((e) => {
46 47
      this._isLoad = false
      this._isLoading = false
48 49 50
      if (this._preload) {
        this._loadAd()
      }
d-u-a's avatar
d-u-a 已提交
51 52
      this._dispatchEvent('close', { isEnded: e.isEnded })
    })
53
    rewardAd.onVerify && rewardAd.onVerify((e) => {
54
      this._dispatchEvent('verify', { isValid: e.isValid })
55
    })
d-u-a's avatar
d-u-a 已提交
56
    rewardAd.onError((e) => {
57
      this._isLoading = false
58 59
      const { code, message } = e
      const data = { code: code, errMsg: message }
d-u-a's avatar
d-u-a 已提交
60
      this._adError = message
61 62 63
      if (code === -5008) {
        this._isLoad = false
      }
64
      this._dispatchEvent('error', data)
65
      // TODO
d-u-a's avatar
d-u-a 已提交
66
      if ((code === -5005 || ERROR_CODE_LIST.index(code) === -1) && this._loadPromiseReject != null) {
67
        this._loadPromiseReject(data)
d-u-a's avatar
d-u-a 已提交
68 69 70
        this._loadPromiseReject = null
      }
    })
d-u-a's avatar
d-u-a 已提交
71 72 73
    rewardAd.onAdClicked((e) => {
      this._dispatchEvent('adClicked', {})
    })
74 75 76 77

    if (this._preload) {
      this._loadAd()
    }
d-u-a's avatar
d-u-a 已提交
78
  }
fxy060608's avatar
fxy060608 已提交
79

80
  get isExpired () {
81
    return (this._lastLoadTime !== 0 && (Math.abs(Date.now() - this._lastLoadTime) > EXPIRED_TIME))
82 83
  }

d-u-a's avatar
d-u-a 已提交
84 85
  load () {
    return new Promise((resolve, reject) => {
86 87 88 89 90
      this._loadPromiseResolve = resolve
      this._loadPromiseReject = reject
      if (this._isLoading) {
        return
      }
d-u-a's avatar
d-u-a 已提交
91 92 93 94 95 96 97
      if (this._isLoad) {
        resolve()
        return
      }
      this._loadAd()
    })
  }
fxy060608's avatar
fxy060608 已提交
98

d-u-a's avatar
d-u-a 已提交
99 100
  show () {
    return new Promise((resolve, reject) => {
101 102 103 104
      if (this._isLoading) {
        return
      }

105 106 107 108 109 110 111 112 113
      const provider = this.getProvider()
      if (provider === ProviderType.CSJ && this.isExpired) {
        this._isLoad = false
        // TODO
        this._dispatchEvent('error', EXPIRED_TEXT)
        reject(new Error(EXPIRED_TEXT.errMsg))
        return
      }

d-u-a's avatar
d-u-a 已提交
114 115 116 117
      if (this._isLoad) {
        this._rewardAd.show()
        resolve()
      } else {
d-u-a's avatar
d-u-a 已提交
118
        reject(new Error(this._adError))
d-u-a's avatar
d-u-a 已提交
119 120 121
      }
    })
  }
fxy060608's avatar
fxy060608 已提交
122

123 124 125
  getProvider () {
    return this._rewardAd.getProvider()
  }
fxy060608's avatar
fxy060608 已提交
126

127 128 129
  destroy () {
    this._rewardAd.destroy()
  }
fxy060608's avatar
fxy060608 已提交
130

d-u-a's avatar
d-u-a 已提交
131 132
  _loadAd () {
    this._isLoad = false
133
    this._isLoading = true
d-u-a's avatar
d-u-a 已提交
134 135
    this._rewardAd.load()
  }
fxy060608's avatar
fxy060608 已提交
136

d-u-a's avatar
d-u-a 已提交
137 138 139 140 141 142 143 144 145
  _dispatchEvent (name, data) {
    this._callbacks[name].forEach(callback => {
      if (typeof callback === 'function') {
        callback(data || {})
      }
    })
  }
}

146 147
export function createRewardedVideoAd (options) {
  return new RewardedVideoAd(options)
d-u-a's avatar
d-u-a 已提交
148
}