import PropTypes from 'prop-types' import { useState, useEffect, useMemo, useCallback, memo } from 'react' import Particles, { initParticlesEngine } from '@tsparticles/react' import { loadSlim } from '@tsparticles/slim' import { useThemeContext } from '../Dashboard/context/ThemeContext' const ParticlesComponent = memo(({ options, particlesLoaded }) => { return ( ) }) ParticlesComponent.displayName = 'ParticlesComponent' const AppParticles = () => { const [init, setInit] = useState(false) const { isDarkMode } = useThemeContext() // this should be run only once per application lifetime useEffect(() => { initParticlesEngine(async (engine) => { await loadSlim(engine) }).then(() => { setInit(true) }) }, []) const particlesLoaded = useCallback(() => {}, []) const options = useMemo( () => ({ background: { color: { value: isDarkMode ? '#000000' : '#ffffff' } }, fpsLimit: 120, interactivity: { events: { onClick: { enable: true, mode: 'push' }, onHover: { enable: true, mode: 'repulse' } }, modes: { push: { quantity: 4 }, repulse: { distance: 200, duration: 0.4 } } }, particles: { color: { value: isDarkMode ? 'rgb(66, 66, 66)' : 'rgb(217, 217, 217)' }, links: { color: isDarkMode ? 'rgb(66, 66, 66)' : 'rgb(217, 217, 217)', distance: 150, enable: true, opacity: 0.5, width: 1 }, move: { direction: 'none', enable: true, outModes: { default: 'bounce' }, random: false, speed: 1, straight: false }, number: { density: { enable: true }, value: 160 }, opacity: { value: 0.5 }, shape: { type: 'circle' }, size: { value: { min: 1, max: 5 } } }, detectRetina: true }), [isDarkMode] ) return ( <> {init && ( )} ) } ParticlesComponent.propTypes = { options: PropTypes.object.isRequired, particlesLoaded: PropTypes.func.isRequired } export default AppParticles