import React from "react";
import { Animated, Easing, StyleSheet, View } from "react-native";
import Indicator, { IndicatorProps } from "./indicator";
export type SkypeIndicatorProps = IndicatorProps & {
size?: number;
color?: string;
count?: number;
minScale?: number;
maxScale?: number;
};
const SkypeIndicator = React.memo(
React.forwardRef(
(
{
size = 30,
count = 5,
color = "rgb(0, 0, 0)",
animationDuration = 1600,
minScale = 0.2,
maxScale = 1.0,
...rest
}: SkypeIndicatorProps,
ref: any
): JSX.Element => {
const _renderComponent = React.useCallback(
({
index,
count,
progress,
}: {
index: number;
count: number;
progress: Animated.Value;
}) => {
let frames = (60 * animationDuration) / 1000;
let offset = index / (count - 1);
let easing = Easing.bezier(0.5, offset, 0.5, 1.0);
let inputRange = Array.from(
new Array(frames),
(item, index) => index / (frames - 1)
);
let outputRange = Array.from(
new Array(frames),
(item, index) => easing(index / (frames - 1)) * 360 + "deg"
);
let layerStyle = {
transform: [
{
rotate: progress.interpolate({ inputRange, outputRange }),
},
],
};
let ballStyle = {
width: size / 5,
height: size / 5,
borderRadius: size / 10,
backgroundColor: color,
transform: [
{
scale: progress.interpolate({
inputRange: [0, 1],
outputRange: [
maxScale - (maxScale - minScale) * offset,
minScale + (maxScale - minScale) * offset,
],
}),
},
],
};
return (
);
},
[animationDuration, color, maxScale, minScale, size]
);
const { style, ...props } = rest;
return (
);
}
)
);
export default SkypeIndicator;