const preact = require('preact'); const { Component } = require('preact'); const anime = require('animejs').default; const { TIMES, COLOURS } = require('../../constants'); class Sustain extends Component { constructor() { super(); this.animations = []; } render({ team }) { return ( ); } componentDidMount() { this.animations.push(anime({ targets: ['#sustain'], opacity: [ { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS * 0.2 }, { value: 0, delay: TIMES.TARGET_DURATION_MS * 0.8, duration: TIMES.TARGET_DURATION_MS * 0.2 }, ], easing: 'easeInOutSine', })); this.animations.push(anime({ targets: ['#stageOne'], points: '128,168 80,240 176,240 128,168', keyframes: [ { stroke: [COLOURS.GREEN, COLOURS.RED], fill: [null, COLOURS.RED], delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.2, duration: TIMES.TARGET_DURATION_MS * 0.6, easing: 'easeInOutSine', }, ], delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, })); this.animations.push(anime({ targets: ['#stageTwo'], keyframes: [ { stroke: [COLOURS.GREEN, COLOURS.RED], fill: [null, COLOURS.RED], delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.5, duration: TIMES.TARGET_DURATION_MS * 0.6, easing: 'easeInOutSine', }, ], points: '176,240 212,216 128,96 44,216 80,240', delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, })); this.animations.push(anime({ targets: ['#stageThree'], keyframes: [ { stroke: [COLOURS.GREEN, COLOURS.RED], fill: [null, COLOURS.RED], delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.8, duration: TIMES.TARGET_DURATION_MS * 0.4, easing: 'easeInOutSine', }, ], points: '212,216 248,192 128,24 8,192 44,216', delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS, })); this.animations.push(anime({ targets: ['#sustainFilter feTurbulence', '#sustainFilter feDisplacementMap'], baseFrequency: 2, scale: 10, numOctaves: 5, easing: 'easeOutSine', delay: TIMES.TARGET_DELAY_MS + TIMES.TARGET_DURATION_MS * 0.4, duration: TIMES.TARGET_DURATION_MS * 0.3 + TIMES.POST_SKILL_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 = Sustain;