import React from "react";
import { Animated } from "react-native";
import Box from "../../box/box";
import Indicator, { IndicatorProps } from "./indicator";
export type BarIndicatorProps = 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 BarIndicator = React.memo(
React.forwardRef(
(
{
count = 3,
size = 30,
color = "rgb(0, 0, 0)",
...rest
}: BarIndicatorProps,
ref: any
): JSX.Element => {
const outputRange = React.useCallback(
(base: number, index: number, count: number, samples: number) => {
let range = Array.from(
new Array(samples),
(item, index) =>
base * Math.abs(Math.cos((Math.PI * index) / (samples - 1)))
);
for (let j = 0; j < index * (samples / count); j++) {
range.unshift(range.pop() as number);
}
range.unshift(...range.slice(-1));
return range;
},
[]
);
const _renderComponent = React.useCallback(
({
index,
count,
progress,
}: {
index: number;
count: number;
progress: Animated.Value;
}) => {
let frames = (60 * (rest.animationDuration as number)) / 1000;
let samples = 0;
do samples += count;
while (samples < frames);
let inputRange = Array.from(
new Array(samples + 1),
(item, index) => index / samples
);
let width = Math.floor(size / 5),
height = Math.floor(size / 2),
radius = Math.ceil(width / 2);
let containerStyle = {
height: size,
width: width,
marginHorizontal: radius,
};
let topStyle = {
width,
height,
backgroundColor: color,
borderTopLeftRadius: radius,
borderTopRightRadius: radius,
transform: [
{
translateY: progress.interpolate({
inputRange,
outputRange: outputRange(
+(height - radius) / 2,
index,
count,
samples
),
}),
},
],
};
let bottomStyle = {
width,
height,
backgroundColor: color,
borderBottomLeftRadius: radius,
borderBottomRightRadius: radius,
transform: [
{
translateY: progress.interpolate({
inputRange,
outputRange: outputRange(
-(height - radius) / 2,
index,
count,
samples
),
}),
},
],
};
return (
);
},
[outputRange]
);
return (
);
}
)
);
export default BarIndicator;