// const defaultOption = { 
 | 
//     duration: 300, 
 | 
//     timingFunction: 'linear', 
 | 
//     delay: 0, 
 | 
//     transformOrigin: '50% 50% 0' 
 | 
// } 
 | 
// #ifdef APP-NVUE 
 | 
const nvueAnimation = uni.requireNativePlugin('animation') 
 | 
// #endif 
 | 
class MPAnimation { 
 | 
    constructor(options, _this) { 
 | 
        this.options = options 
 | 
        // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误 
 | 
        this.animation = uni.createAnimation({ 
 | 
            ...options 
 | 
        }) 
 | 
        this.currentStepAnimates = {} 
 | 
        this.next = 0 
 | 
        this.$ = _this 
 | 
  
 | 
    } 
 | 
  
 | 
    _nvuePushAnimates(type, args) { 
 | 
        let aniObj = this.currentStepAnimates[this.next] 
 | 
        let styles = {} 
 | 
        if (!aniObj) { 
 | 
            styles = { 
 | 
                styles: {}, 
 | 
                config: {} 
 | 
            } 
 | 
        } else { 
 | 
            styles = aniObj 
 | 
        } 
 | 
        if (animateTypes1.includes(type)) { 
 | 
            if (!styles.styles.transform) { 
 | 
                styles.styles.transform = '' 
 | 
            } 
 | 
            let unit = '' 
 | 
            if(type === 'rotate'){ 
 | 
                unit = 'deg' 
 | 
            } 
 | 
            styles.styles.transform += `${type}(${args+unit}) ` 
 | 
        } else { 
 | 
            styles.styles[type] = `${args}` 
 | 
        } 
 | 
        this.currentStepAnimates[this.next] = styles 
 | 
    } 
 | 
    _animateRun(styles = {}, config = {}) { 
 | 
        let ref = this.$.$refs['ani'].ref 
 | 
        if (!ref) return 
 | 
        return new Promise((resolve, reject) => { 
 | 
            nvueAnimation.transition(ref, { 
 | 
                styles, 
 | 
                ...config 
 | 
            }, res => { 
 | 
                resolve() 
 | 
            }) 
 | 
        }) 
 | 
    } 
 | 
  
 | 
    _nvueNextAnimate(animates, step = 0, fn) { 
 | 
        let obj = animates[step] 
 | 
        if (obj) { 
 | 
            let { 
 | 
                styles, 
 | 
                config 
 | 
            } = obj 
 | 
            this._animateRun(styles, config).then(() => { 
 | 
                step += 1 
 | 
                this._nvueNextAnimate(animates, step, fn) 
 | 
            }) 
 | 
        } else { 
 | 
            this.currentStepAnimates = {} 
 | 
            typeof fn === 'function' && fn() 
 | 
            this.isEnd = true 
 | 
        } 
 | 
    } 
 | 
  
 | 
    step(config = {}) { 
 | 
        // #ifndef APP-NVUE 
 | 
        this.animation.step(config) 
 | 
        // #endif 
 | 
        // #ifdef APP-NVUE 
 | 
        this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) 
 | 
        this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin 
 | 
        this.next++ 
 | 
        // #endif 
 | 
        return this 
 | 
    } 
 | 
  
 | 
    run(fn) { 
 | 
        // #ifndef APP-NVUE 
 | 
        this.$.animationData = this.animation.export() 
 | 
        this.$.timer = setTimeout(() => { 
 | 
            typeof fn === 'function' && fn() 
 | 
        }, this.$.durationTime) 
 | 
        // #endif 
 | 
        // #ifdef APP-NVUE 
 | 
        this.isEnd = false 
 | 
        let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref 
 | 
        if(!ref) return 
 | 
        this._nvueNextAnimate(this.currentStepAnimates, 0, fn) 
 | 
        this.next = 0 
 | 
        // #endif 
 | 
    } 
 | 
} 
 | 
  
 | 
  
 | 
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', 
 | 
    'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', 
 | 
    'translateZ' 
 | 
] 
 | 
const animateTypes2 = ['opacity', 'backgroundColor'] 
 | 
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] 
 | 
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { 
 | 
    MPAnimation.prototype[type] = function(...args) { 
 | 
        // #ifndef APP-NVUE 
 | 
        this.animation[type](...args) 
 | 
        // #endif 
 | 
        // #ifdef APP-NVUE 
 | 
        this._nvuePushAnimates(type, args) 
 | 
        // #endif 
 | 
        return this 
 | 
    } 
 | 
}) 
 | 
  
 | 
export function createAnimation(option, _this) { 
 | 
    if(!_this) return 
 | 
    clearTimeout(_this.timer) 
 | 
    return new MPAnimation(option, _this) 
 | 
} 
 |