import React from "react";
import { Animated, Easing, StyleSheet, View } from "react-native";
import Indicator, { IndicatorProps } from "./indicator";
export type WaveIndicatorProps = IndicatorProps & {
size?: number;
color?: string;
count?: number;
waveFactor?: number;
waveMode?: "fill" | "outline";
};
const floatEpsilon = Math.pow(2, -23);
const WaveIndicator = React.memo(
React.forwardRef(
(
{
size = 30,
count = 4,
color = "rgb(0, 0, 0)",
animationDuration = 1600,
animationEasing = Easing.out(Easing.ease),
waveFactor = 0.54,
waveMode = "fill",
...rest
}: WaveIndicatorProps,
ref: any
): JSX.Element => {
const _renderComponent = React.useCallback(
({
index,
count,
progress,
}: {
index: number;
count: number;
progress: Animated.Value;
}) => {
let fill = waveMode === "fill";
let factor = Math.max(1 - Math.pow(waveFactor, index), floatEpsilon);
let waveStyle = {
height: size,
width: size,
borderRadius: size / 2,
borderWidth: fill ? 0 : Math.floor(size / 20),
[fill ? "backgroundColor" : "borderColor"]: color,
transform: [
{
scale: progress.interpolate({
inputRange: [factor, 1],
outputRange: [0, 1],
extrapolate: "clamp",
}),
},
],
opacity: progress.interpolate({
inputRange: [0, factor, 1],
outputRange: [0, 1, 0],
}),
};
return (
);
},
[waveMode, waveFactor, size, color]
);
const { style, ...props } = rest;
return (
);
}
)
);
export default WaveIndicator;