import React from "react";
import { Animated, I18nManager, View } from "react-native";
import Indicator, { IndicatorProps } from "./indicator";
export type PacmanIndicatorProps = IndicatorProps & {
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 PacmanIndicator = React.memo(
React.forwardRef(
(
{ size = 30, color = "rgb(0, 0, 0)", ...rest }: PacmanIndicatorProps,
ref: any
): JSX.Element => {
const _renderBlock = React.useCallback(
({
index,
count,
progress,
}: {
index: number;
count: number;
progress: Animated.Value;
}) => {
let transform: object[] = [
{
translateX: progress.interpolate({
inputRange: [0.5, 1],
outputRange: [0, size / (I18nManager.isRTL ? 4 : -4)],
extrapolate: "clamp",
}),
},
];
let style: any = {
position: "absolute",
top: size / 2 - size / 16,
left: size / 2 + size / 16 + ((index - 2) * size) / 4,
width: size / 8,
height: size / 8,
borderRadius: size / 16,
backgroundColor: color,
transform,
};
if (index === count - 1) {
transform.push({
scale: progress.interpolate({
inputRange: [0, 0.5],
outputRange: [0, 1],
extrapolate: "clamp",
}),
});
style.opacity = progress.interpolate({
inputRange: [0, 0.25],
outputRange: [0, 1],
extrapolate: "clamp",
});
}
return ;
},
[size, color]
);
const _renderComponent = React.useCallback(
({
index,
count,
progress,
}: {
index: number;
count: number;
progress: Animated.Value;
}) => {
if (index > 1) {
return _renderBlock({ index, count, progress });
}
let hf = size / 2;
let qr = size / 4;
let pacmanStyle = {
position: "absolute" as "absolute",
top: qr,
left: 0,
width: hf,
height: hf,
transform: [
{
rotate: progress.interpolate({
inputRange: [0, 0.67, 1],
outputRange:
index ^ (I18nManager.isRTL as any)
? ["0deg", "45deg", "0deg"]
: ["0deg", "-45deg", "0deg"],
extrapolate: "clamp",
}),
},
],
};
let containerStyle = {
overflow: "hidden" as "hidden",
width: hf,
height: qr,
...(index
? {
top: qr,
borderBottomLeftRadius: qr,
borderBottomRightRadius: qr,
}
: {
borderTopLeftRadius: qr,
borderTopRightRadius: qr,
}),
backgroundColor: color,
};
return (
);
},
[_renderBlock, size, color]
);
const { style, ...props } = rest;
return (
);
}
)
);
export default PacmanIndicator;