mango-v4-ui/components/shared/SuccessParticles.tsx

139 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-01-02 04:19:30 -08:00
import { PerpMarket, Serum3Market } from '@blockworks-foundation/mango-v4'
2022-11-24 18:39:14 -08:00
import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings'
2022-11-21 19:23:54 -08:00
import mangoStore from '@store/mangoStore'
import useJupiterMints from 'hooks/useJupiterMints'
2022-11-22 21:38:31 -08:00
import useLocalStorageState from 'hooks/useLocalStorageState'
2022-11-21 19:23:54 -08:00
import { useEffect, useMemo } from 'react'
import Particles from 'react-tsparticles'
2022-11-22 21:38:31 -08:00
import { ANIMATION_SETTINGS_KEY } from 'utils/constants'
2022-11-21 19:23:54 -08:00
2023-01-02 04:19:30 -08:00
const SuccessParticles = () => {
2022-11-21 19:23:54 -08:00
const { mangoTokens } = useJupiterMints()
2023-01-02 04:19:30 -08:00
const showForSwap = mangoStore((s) => s.successAnimation.swap)
const showForTrade = mangoStore((s) => s.successAnimation.trade)
2023-01-20 03:03:31 -08:00
const tradeType = mangoStore((s) => s.tradeForm.tradeType)
2022-11-21 19:23:54 -08:00
const set = mangoStore((s) => s.set)
2022-11-22 21:38:31 -08:00
const [animationSettings] = useLocalStorageState(
ANIMATION_SETTINGS_KEY,
INITIAL_ANIMATION_SETTINGS
)
2022-11-21 19:23:54 -08:00
const tokenLogo = useMemo(() => {
2023-01-02 04:19:30 -08:00
if (!mangoTokens.length) return ''
if (showForSwap) {
const tokenMint = mangoStore.getState().swap.outputBank?.mint.toString()
return mangoTokens.find((t) => t.address === tokenMint)?.logoURI
}
2023-01-20 03:03:31 -08:00
if (showForTrade && tradeType === 'Market') {
2023-01-02 04:19:30 -08:00
const market = mangoStore.getState().selectedMarket.current
const side = mangoStore.getState().tradeForm.side
if (market instanceof Serum3Market) {
const symbol =
side === 'buy' ? market.name.split('/')[0] : market.name.split('/')[1]
2023-01-20 03:03:31 -08:00
return mangoTokens.find((t) => t.symbol.toUpperCase() === symbol)
?.logoURI
2023-01-02 04:19:30 -08:00
}
if (market instanceof PerpMarket) {
const symbol = side === 'buy' ? market.name.split('-')[0] : 'USDC'
2023-01-20 03:03:31 -08:00
return (
mangoTokens.find((t) => t.symbol.toUpperCase() === symbol)?.logoURI ||
`/icons/${symbol.toLowerCase()}.svg`
)
2023-01-02 04:19:30 -08:00
}
}
}, [mangoTokens, showForSwap, showForTrade])
2022-11-21 19:23:54 -08:00
useEffect(() => {
2023-01-02 04:19:30 -08:00
if (showForSwap) {
setTimeout(
() =>
set((s) => {
s.successAnimation.swap = false
}),
8000
)
}
if (showForTrade) {
2022-11-21 19:23:54 -08:00
setTimeout(
() =>
set((s) => {
2023-01-02 04:19:30 -08:00
s.successAnimation.trade = false
2022-11-21 19:23:54 -08:00
}),
8000
)
}
2023-01-02 04:19:30 -08:00
}, [showForSwap, showForTrade])
2022-11-21 19:23:54 -08:00
2023-01-02 04:19:30 -08:00
return animationSettings['swap-success'] &&
tokenLogo &&
(showForSwap || showForTrade) ? (
2022-11-21 19:23:54 -08:00
<Particles
id="tsparticles"
options={{
detectRetina: true,
particles: {
2022-11-23 21:04:33 -08:00
opacity: {
2022-11-21 19:23:54 -08:00
value: 0,
},
2022-11-23 21:04:33 -08:00
},
emitters: {
life: {
count: 30,
delay: 0,
duration: 0.1,
2022-11-21 19:23:54 -08:00
},
2022-11-23 21:04:33 -08:00
startCount: 0,
particles: {
shape: {
type: 'image',
options: {
image: {
src: tokenLogo,
width: 48,
height: 48,
},
2022-11-21 19:23:54 -08:00
},
},
2022-11-23 21:04:33 -08:00
rotate: {
value: 0,
random: true,
direction: 'clockwise',
animation: {
enable: true,
speed: 15,
sync: false,
},
},
opacity: {
value: 1,
},
size: {
value: 20,
random: false,
},
move: {
angle: 10,
attract: {
rotate: {
x: 600,
y: 1200,
},
},
direction: 'bottom',
enable: true,
speed: { min: 8, max: 16 },
outMode: 'destroy',
},
2022-11-21 19:23:54 -08:00
},
2022-11-22 21:38:31 -08:00
position: {
2022-11-23 21:04:33 -08:00
x: { random: true },
y: 0,
2022-11-22 21:38:31 -08:00
},
2022-11-21 19:23:54 -08:00
},
}}
/>
) : null
}
2023-01-02 04:19:30 -08:00
export default SuccessParticles