import anime from 'animejs'; import React from 'react'; // eslint-disable-next-line no-unused-vars type SetInstances = (instances: anime.AnimeInstance[]) => void; function playWithLines1(setInstances: SetInstances): anime.AnimeInstance[] { return [ anime({ targets: '.playWithLines2 .roll1', strokeDashoffset: [anime.setDashoffset, 0], easing: 'easeInOutSine', duration: 1500, delay: function (el, i) { return i * 250; }, direction: 'alternate', complete: () => setInstances(playWithLines2(setInstances)), }), ]; } function playWithLines2(setInstances: SetInstances): anime.AnimeInstance[] { return [ anime({ targets: '.playWithLines2 .roll2', strokeDashoffset: [anime.setDashoffset, 0], easing: 'easeInOutSine', duration: 1500, delay: function (el, i) { return i * 250; }, direction: 'alternate', complete: () => setInstances(playWithLines3(setInstances)), }), ]; } function playWithLines3(setInstances: SetInstances): anime.AnimeInstance[] { return [ anime({ targets: '.playWithLines2 .roll3', strokeDashoffset: [anime.setDashoffset, 0], easing: 'easeInOutSine', duration: 1500, delay: function (el, i) { return i * 250; }, direction: 'alternate', complete: () => setInstances(playWithLines4(setInstances)), }), anime({ targets: '.playWithLines2', rotate: '130', easing: 'spring(1, 80, 10, 0)', duration: 30, direction: 'alternate', delay: 100, }), ]; } function playWithLines4(setInstances: SetInstances): anime.AnimeInstance[] { return [ anime({ targets: '.playWithLines2 .roll4', strokeDashoffset: [anime.setDashoffset, 0], easing: 'easeInOutSine', duration: 1500, delay: function (el, i) { return i * 250; }, direction: 'alternate', complete: () => setInstances(playWithLines1(setInstances)), }), ]; } export function AnimatedSvg() { const instancesRef = React.useRef(null); React.useEffect(() => { instancesRef.current = playWithLines1((instances) => { instancesRef.current = instances; }); return () => { for (const instance of instancesRef.current || []) { instance.pause(); } }; }, []); return ( ); }