Next js Confetti Component
confetti.tsxTSX
confetti.tsx
'use client'
import { useEffect } from 'react'
import confetti, { Options } from 'canvas-confetti'
export default function Confetti() {
useEffect(() => {
const duration = 15 * 1000
const animationEnd = Date.now() + duration
const defaults: Options = {
startVelocity: 30,
spread: 360,
ticks: 60,
zIndex: 0,
}
function randomInRange(min: number, max: number): number {
return Math.random() * (max - min) + min
}
const interval: ReturnType<typeof setInterval> = setInterval(function () {
const timeLeft = animationEnd - Date.now()
if (timeLeft <= 0) {
return clearInterval(interval)
}
const particleCount = 50 * (timeLeft / duration)
confetti({
...defaults,
particleCount,
origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },
})
confetti({
...defaults,
particleCount,
origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },
})
}, 250)
return () => clearInterval(interval)
}, [])
return null
}
Updated: 8/5/2024