UNPKG

react-native-fiesta

Version:

A set of celebration animations powered by Skia. Engage more with your users by celebrating in your React Native application.

56 lines 2.06 kB
import React, { memo, useEffect, useMemo } from 'react'; import { Rect, vec } from '@shopify/react-native-skia'; import { useDerivedValue, useSharedValue, withRepeat, withTiming } from 'react-native-reanimated'; import { screenHeight } from '../constants/dimensions'; import { degreesToRadians, randomIntFromInterval, DEFAULT_ANIMATION_DURATION } from '../utils/confettis'; export const Confetti = /*#__PURE__*/memo(({ initialPosition = { x: 0, y: 0 }, color = '#fff', index = 0, size = 30, duration = DEFAULT_ANIMATION_DURATION }) => { const randomDuration = useMemo(() => randomIntFromInterval(duration, duration * 1.5), [duration]); const yPosition = useSharedValue(-screenHeight / 2 + initialPosition.y); const xOrigin = useSharedValue(initialPosition.x); const rotateValue = useSharedValue(0); const scaleYValue = useSharedValue(Math.random() < 0.5 ? -0.5 : 0.5); useEffect(() => { yPosition.value = withTiming(screenHeight + 300, { duration: randomDuration }); xOrigin.value = withRepeat(withTiming(initialPosition.x + randomIntFromInterval(100, 50), { duration: randomDuration }), -1, true); rotateValue.value = withRepeat(withTiming(degreesToRadians(Math.random() < 0.5 ? -360 : 360), { duration: randomDuration / 2 }), -1, true); scaleYValue.value = withRepeat(withTiming(0, { duration: randomDuration / 2 }), -1, true); }, [initialPosition.x, randomDuration, rotateValue, scaleYValue, xOrigin, yPosition]); const origin = useDerivedValue(() => vec(xOrigin.value, yPosition.value), [yPosition, xOrigin]); const matrix = useDerivedValue(() => [{ scaleY: scaleYValue.value }, { rotate: rotateValue.value }, { skewX: scaleYValue.value / 2 }, { skewY: -scaleYValue.value / 2 }]); return /*#__PURE__*/React.createElement(Rect, { x: initialPosition.x, y: yPosition, width: size / 3, height: size, color: color, origin: origin, transform: matrix, key: index }); }); //# sourceMappingURL=Confetti.js.map