const preact = require('preact'); const { Component } = require('preact'); const anime = require('animejs').default; const { TIMES } = require('../../constants'); class Amplify extends Component { constructor() { super(); this.animations = []; } render() { const path = 'M0,100 C100,100 100,100 200,100'; return ( ); } componentDidMount() { const altPath = 'M0,100 C100,400 100,-200 200,100'; this.animations.push(anime({ targets: ['#amplify'], 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: ['#amplify path'], d: [{ value: altPath }], stroke: ['#3498db', '#a52a2a'], easing: 'easeInOutSine', delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, })); this.animations.push(anime({ targets: ['#amplifyFilter feTurbulence', '#amplifyFilter feDisplacementMap'], baseFrequency: 0.15, scale: 4, easing: 'easeInOutExpo', 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(); } } } module.exports = Amplify;