import React from 'react';
import {PI, polar2Canvas, TAU} from 'react-native-redash';
import {useAnimatedProps, useDerivedValue} from 'react-native-reanimated';
import {Track} from './Track';
import {AnimatedPath} from './Animated';
import {SharedNumber} from '../../types';
import {useSliderContext} from '../../context/SliderContext';
import {thetaBetweenStartAndEnd} from '../../utils/worklets';
export interface FilledGaugeProps {
color: string;
startTheta: SharedNumber;
endTheta: SharedNumber;
}
export function FilledGauge({color, startTheta, endTheta}: FilledGaugeProps) {
const {r, center, trackWidth, clockwise} = useSliderContext();
const position = (theta: SharedNumber) => {
'worklet';
return () => {
'worklet';
return polar2Canvas({theta: theta.value, radius: r.value}, center.value);
};
};
const startPosition = useDerivedValue(position(startTheta), [startTheta]);
const endPosition = useDerivedValue(position(endTheta), [endTheta]);
const isFullFilled = Math.abs(startTheta.value - endTheta.value) === TAU;
const animatedProps = useAnimatedProps(() => {
const {x: startX, y: startY} = startPosition.value;
const {x: endX, y: endY} = endPosition.value;
const theta = thetaBetweenStartAndEnd(startTheta.value, endTheta.value);
const large = clockwise ? theta < PI : theta > PI;
const largeArcFlag = large ? '1' : '0';
const sweepFlag = clockwise ? '1' : '0';
const d = [
`M ${startX} ${startY}`,
`A ${r.value} ${r.value} 0 ${largeArcFlag} ${sweepFlag} ${endX} ${endY}`,
].join(' ');
return {
d,
strokeWidth: trackWidth.value,
};
}, [clockwise]);
return (
<>
{isFullFilled ? (
) : (
)}
>
);
}