import React from "react"; import { Animated, StyleSheet, View } from "react-native"; import Indicator, { IndicatorProps } from "./indicator"; export type BallIndicatorProps = IndicatorProps & { count?: number; size?: number; color?: string; }; /** A component used to provide a visual cue that an action is either processing, awaiting a course of change or a result. */ const BallIndicator = React.memo( React.forwardRef( ( { count = 8, size = 30, color = "rgb(0, 0, 0)", ...rest }: BallIndicatorProps, ref: any ): JSX.Element => { const _renderComponent = React.useCallback( ({ index, count, progress, }: { index: number; count: number; progress: Animated.Value; }) => { let angle = (index * 360) / count; let layerStyle = { transform: [ { rotate: angle + "deg", }, ], }; let inputRange = Array.from( new Array(count + 1), (item, index) => index / count ); let outputRange = Array.from( new Array(count), (item, index) => 1.2 - (0.5 * index) / (count - 1) ); for (let j = 0; j < index; j++) { outputRange.unshift(outputRange.pop() as number); } outputRange.unshift(...outputRange.slice(-1)); let ballStyle = { margin: size / 20, backgroundColor: color, width: size / 5, height: size / 5, borderRadius: size / 10, transform: [ { scale: progress.interpolate({ inputRange, outputRange }), }, ], }; return ( ); }, [count, size, color] ); const { style, ...props } = rest; return ( ); } ) ); export default BallIndicator;