Files
ox_lib/web/src/features/skillcheck/indicator.tsx

73 lines
1.8 KiB
TypeScript
Raw Normal View History

import { useCallback, useEffect, useState } from 'react';
import { SkillCheckProps } from './index';
import { useInterval } from '@mantine/hooks';
import { circleCircumference } from './index';
2022-10-13 14:00:34 +02:00
interface Props {
angle: number;
offset: number;
multiplier: number;
skillCheck: SkillCheckProps;
className: string;
handleComplete: (success: boolean) => void;
2022-10-13 14:00:34 +02:00
}
const Indicator: React.FC<Props> = ({ angle, offset, multiplier, handleComplete, skillCheck, className }) => {
2022-10-13 14:00:34 +02:00
const [indicatorAngle, setIndicatorAngle] = useState(-90);
const [keyPressed, setKeyPressed] = useState(false);
const interval = useInterval(
() =>
setIndicatorAngle((prevState) => {
return (prevState += multiplier);
}),
1
);
2022-10-13 14:00:34 +02:00
const keyHandler = useCallback(
(e: KeyboardEvent) => {
if (e.key.toLowerCase() !== skillCheck.key.toLowerCase()) return;
setKeyPressed(true);
},
[skillCheck]
);
useEffect(() => {
setIndicatorAngle(-90);
window.addEventListener('keydown', keyHandler);
interval.start();
}, [skillCheck]);
2022-10-13 14:00:34 +02:00
useEffect(() => {
if (indicatorAngle + 90 >= 360) {
interval.stop();
handleComplete(false);
2022-10-13 14:00:34 +02:00
}
}, [indicatorAngle]);
useEffect(() => {
if (!keyPressed) return;
2022-10-13 14:00:34 +02:00
interval.stop();
setKeyPressed(false);
window.removeEventListener('keydown', keyHandler);
if (indicatorAngle < angle || indicatorAngle > angle + offset) handleComplete(false);
else handleComplete(true);
}, [keyPressed]);
2022-10-13 14:00:34 +02:00
return (
<circle
r={50}
cx={250}
cy={250}
strokeDasharray={circleCircumference}
strokeDashoffset={circleCircumference - 3}
2022-10-13 14:00:34 +02:00
transform={`rotate(${indicatorAngle}, 250, 250)`}
className={className}
2022-10-13 14:00:34 +02:00
/>
);
};
export default Indicator;