253 lines
4.4 KiB
JavaScript
253 lines
4.4 KiB
JavaScript
// ad.js
|
|
const ADType = {
|
|
RewardedVideo: "RewardedVideo",
|
|
FullScreenVideo: "FullScreenVideo"
|
|
}
|
|
|
|
class AdHelper {
|
|
|
|
constructor() {
|
|
this._ads = {}
|
|
}
|
|
|
|
load(options, onload, onerror) {
|
|
let ops = this._fixOldOptions(options)
|
|
let {
|
|
adpid
|
|
} = ops
|
|
|
|
if (!adpid || this.isBusy(adpid)) {
|
|
return
|
|
}
|
|
|
|
this.get(ops).load(onload, onerror)
|
|
}
|
|
|
|
show(options, onsuccess, onfail) {
|
|
let ops = this._fixOldOptions(options)
|
|
let {
|
|
adpid
|
|
} = ops
|
|
|
|
if (!adpid) {
|
|
return
|
|
}
|
|
|
|
uni.showLoading({
|
|
mask: true
|
|
})
|
|
|
|
var ad = this.get(ops)
|
|
|
|
ad.load(() => {
|
|
uni.hideLoading()
|
|
ad.show((e) => {
|
|
onsuccess && onsuccess(e)
|
|
})
|
|
}, (err) => {
|
|
uni.hideLoading()
|
|
onfail && onfail(err)
|
|
})
|
|
}
|
|
|
|
isBusy(adpid) {
|
|
return (this._ads[adpid] && this._ads[adpid].isLoading)
|
|
}
|
|
|
|
get(options) {
|
|
const {
|
|
adpid,
|
|
singleton = true
|
|
} = options
|
|
if (singleton === false) {
|
|
if (this._ads[adpid]) {
|
|
this._ads[adpid].destroy()
|
|
delete this._ads[adpid]
|
|
}
|
|
}
|
|
delete options.singleton
|
|
if (!this._ads[adpid]) {
|
|
this._ads[adpid] = this._createAdInstance(options)
|
|
}
|
|
|
|
return this._ads[adpid]
|
|
}
|
|
|
|
_createAdInstance(options) {
|
|
const adType = options.adType || ADType.RewardedVideo
|
|
delete options.adType
|
|
|
|
let ad = null;
|
|
if (adType === ADType.RewardedVideo) {
|
|
ad = new RewardedVideo(options)
|
|
} else if (adType === ADType.FullScreenVideo) {
|
|
ad = new FullScreenVideo(options)
|
|
}
|
|
|
|
return ad
|
|
}
|
|
|
|
_fixOldOptions(options) {
|
|
return (typeof options === "string") ? {
|
|
adpid: options
|
|
} : options
|
|
}
|
|
}
|
|
|
|
const EXPIRED_TIME = 1000 * 60 * 30
|
|
const ProviderType = {
|
|
CSJ: 'csj',
|
|
GDT: 'gdt'
|
|
}
|
|
|
|
const RETRY_COUNT = 1
|
|
|
|
class AdBase {
|
|
constructor(adInstance, options = {}) {
|
|
this._isLoad = false
|
|
this._isLoading = false
|
|
this._lastLoadTime = 0
|
|
this._lastError = null
|
|
this._retryCount = 0
|
|
|
|
this._loadCallback = null
|
|
this._closeCallback = null
|
|
this._errorCallback = null
|
|
|
|
const ad = this._ad = adInstance
|
|
ad.onLoad((e) => {
|
|
this._isLoading = false
|
|
this._isLoad = true
|
|
this._lastLoadTime = Date.now()
|
|
|
|
this.onLoad()
|
|
})
|
|
ad.onClose((e) => {
|
|
this._isLoad = false
|
|
this.onClose(e)
|
|
})
|
|
ad.onVerify && ad.onVerify((e) => {
|
|
// e.isValid
|
|
})
|
|
ad.onError(({
|
|
code,
|
|
message
|
|
}) => {
|
|
this._isLoading = false
|
|
const data = {
|
|
code: code,
|
|
errMsg: message
|
|
}
|
|
|
|
if (code === -5008) {
|
|
this._loadAd()
|
|
return
|
|
}
|
|
|
|
if (this._retryCount < RETRY_COUNT) {
|
|
this._retryCount += 1
|
|
this._loadAd()
|
|
return
|
|
}
|
|
|
|
this._lastError = data
|
|
this.onError(data)
|
|
})
|
|
}
|
|
|
|
get isExpired() {
|
|
return (this._lastLoadTime !== 0 && (Math.abs(Date.now() - this._lastLoadTime) > EXPIRED_TIME))
|
|
}
|
|
|
|
get isLoading() {
|
|
return this._isLoading
|
|
}
|
|
|
|
getProvider() {
|
|
return this._ad.getProvider()
|
|
}
|
|
|
|
load(onload, onerror) {
|
|
this._loadCallback = onload
|
|
this._errorCallback = onerror
|
|
|
|
if (this._isLoading) {
|
|
return
|
|
}
|
|
|
|
if (this._isLoad) {
|
|
this.onLoad()
|
|
return
|
|
}
|
|
|
|
this._retryCount = 0
|
|
|
|
this._loadAd()
|
|
}
|
|
|
|
show(onclose) {
|
|
this._closeCallback = onclose
|
|
|
|
if (this._isLoading || !this._isLoad) {
|
|
return
|
|
}
|
|
|
|
if (this._lastError !== null) {
|
|
this.onError(this._lastError)
|
|
return
|
|
}
|
|
|
|
const provider = this.getProvider()
|
|
if (provider === ProviderType.CSJ && this.isExpired) {
|
|
this._loadAd()
|
|
return
|
|
}
|
|
|
|
this._ad.show()
|
|
}
|
|
|
|
onLoad(e) {
|
|
if (this._loadCallback != null) {
|
|
this._loadCallback()
|
|
}
|
|
}
|
|
|
|
onClose(e) {
|
|
if (this._closeCallback != null) {
|
|
this._closeCallback({
|
|
isEnded: e.isEnded
|
|
})
|
|
}
|
|
}
|
|
|
|
onError(e) {
|
|
if (this._errorCallback != null) {
|
|
this._errorCallback(e)
|
|
}
|
|
}
|
|
|
|
destroy() {
|
|
this._ad.destroy()
|
|
}
|
|
|
|
_loadAd() {
|
|
this._isLoad = false
|
|
this._isLoading = true
|
|
this._lastError = null
|
|
this._ad.load()
|
|
}
|
|
}
|
|
|
|
class RewardedVideo extends AdBase {
|
|
constructor(options = {}) {
|
|
super(plus.ad.createRewardedVideoAd(options), options)
|
|
}
|
|
}
|
|
|
|
class FullScreenVideo extends AdBase {
|
|
constructor(options = {}) {
|
|
super(plus.ad.createFullScreenVideoAd(options), options)
|
|
}
|
|
}
|
|
|
|
export default new AdHelper() |