ad-base.js 3.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
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()
      }
50 51

      this._dispatchEvent(eventTypes.load, {})
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
    })
    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,
d-u-a's avatar
d-u-a 已提交
67 68 69
        errCode: e.code,
        errMsg: e.message,
        detail: e.detail
70 71 72 73 74 75
      }

      this._adError = data

      this._dispatchEvent(eventTypes.error, data)

76 77 78
      const error = new Error(JSON.stringify(this._adError))
      error.code = e.code
      error.errMsg = e.message
d-u-a's avatar
d-u-a 已提交
79
      error.detail = e.detail
80 81

      if (this._loadPromiseReject != null) {
82
        this._loadPromiseReject(error)
83 84 85 86
        this._loadPromiseReject = null
      }

      if (this._showPromiseReject != null) {
87
        this._showPromiseReject(error)
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
        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 {
d-u-a's avatar
d-u-a 已提交
159 160
  eventTypes,
  eventNames,
161 162
  AdBase
}