const preact = require('preact'); const { Component } = require('preact'); const { connect } = require('preact-redux'); const anime = require('animejs').default; const { TIMES, COLOURS, } = require('../../constants'); const addState = connect( function receiveState(state) { const { animCb } = state; return { animCb }; } ); class Intercept extends Component { constructor() { super(); this.animations = []; } render() { return ( ); } componentDidMount() { this.animations.push(anime({ targets: ['#intercept'], opacity: [ { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS * 0.2 }, { value: 0, delay: TIMES.TARGET_DURATION_MS * 0.6, duration: TIMES.TARGET_DURATION_MS * 0.2 }, ], easing: 'easeInOutSine', })); this.animations.push(anime({ targets: ['#intercept'], transform: [ `scale(1 1) ${this.props.player ? 'rotate(180)' : ''}`, `scale(5 5) ${this.props.player ? 'rotate(180)' : ''}`, ], strokeWidth: 0, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, easing: 'easeInCubic', // direction: 'reverse', })); this.animations.push(anime({ targets: ['#intercept rect'], y: 96, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, easing: 'easeInCubic', // direction: 'reverse', })); this.animations.push(anime({ targets: ['#interceptFilter feTurbulence', '#interceptFilter feDisplacementMap'], baseFrequency: 2, scale: 10, numOctaves: 5, easing: 'easeOutSine', delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, })); } // this is necessary because // skipping / timing / unmounting race conditions // can cause the animations to cut short, this will ensure the values are reset // because preact will recycle all these components componentWillUnmount() { for (let i = this.animations.length - 1; i >= 0; i--) { this.animations[i].reset(); } this.props.animCb && this.props.animCb(); } } module.exports = addState(Intercept);