From fa04332defd1a8bf468814f87d531927de08b6ae Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 23 Dec 2022 10:29:22 +0100 Subject: [PATCH] refactor(web/skillcheck): skillcheck mantine rewrite --- web/src/features/skillcheck/index.tsx | 79 ++++++++++++++--------- web/src/features/skillcheck/indicator.tsx | 27 ++++---- 2 files changed, 59 insertions(+), 47 deletions(-) diff --git a/web/src/features/skillcheck/index.tsx b/web/src/features/skillcheck/index.tsx index 787eb7b..a0d9efd 100644 --- a/web/src/features/skillcheck/index.tsx +++ b/web/src/features/skillcheck/index.tsx @@ -1,9 +1,8 @@ -import { Box, Center } from '@chakra-ui/react'; import { useRef, useState } from 'react'; import { useNuiEvent } from '../../hooks/useNuiEvent'; -import { debugData } from '../../utils/debugData'; import Indicator from './indicator'; import { fetchNui } from '../../utils/fetchNui'; +import { useMantineTheme, Box, createStyles } from '@mantine/core'; interface CustomGameDifficulty { areaSize: number; @@ -28,7 +27,46 @@ const difficultyOffsets = { hard: 25, }; +const useStyles = createStyles((theme) => ({ + svg: { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + }, + track: { + fill: 'transparent', + stroke: theme.colors.dark[4], + strokeWidth: 8, + }, + skillArea: { + fill: 'transparent', + stroke: theme.fn.primaryColor(), + strokeWidth: 8, + }, + indicator: { + stroke: 'red', + strokeWidth: 16, + fill: 'transparent', + }, + button: { + position: 'absolute', + left: '50%', + top: '50%', + transform: 'translate(-50%, -50%)', + backgroundColor: theme.colors.dark[4], + width: 25, + height: 25, + textAlign: 'center', + borderRadius: 5, + fontSize: 16, + fontWeight: 500, + }, +})); + const SkillCheck: React.FC = () => { + const theme = useMantineTheme(); + const { classes } = useStyles(); const [visible, setVisible] = useState(false); const dataRef = useRef(null); const dataIndexRef = useRef(0); @@ -74,31 +112,21 @@ const SkillCheck: React.FC = () => { }; return ( -
+ <> {visible && ( <> - + {/*Circle track*/} - + {/*SkillCheck area*/} { : skillCheck.difficulty.speedMultiplier } handleComplete={handleComplete} + className={classes.indicator} skillCheck={skillCheck} /> - - E - + E )} -
+ ); }; diff --git a/web/src/features/skillcheck/indicator.tsx b/web/src/features/skillcheck/indicator.tsx index 1f76980..0589ab9 100644 --- a/web/src/features/skillcheck/indicator.tsx +++ b/web/src/features/skillcheck/indicator.tsx @@ -1,7 +1,8 @@ import { useEffect, useRef, useState } from 'react'; import { useKeyPress } from '../../hooks/useKeyPress'; import { SkillCheckProps } from './index'; -import { useInterval } from '@chakra-ui/react'; +// import { useInterval } from '@chakra-ui/react'; +import { useInterval } from '@mantine/hooks'; import { circleCircumference } from './index'; interface Props { @@ -9,31 +10,29 @@ interface Props { offset: number; multiplier: number; skillCheck: SkillCheckProps; + className: string; handleComplete: (success: boolean) => void; } -const Indicator: React.FC = ({ angle, offset, multiplier, handleComplete, skillCheck }) => { +const Indicator: React.FC = ({ angle, offset, multiplier, handleComplete, skillCheck, className }) => { const [indicatorAngle, setIndicatorAngle] = useState(-90); - const [gameState, setGameState] = useState(false); const isKeyPressed = useKeyPress('e'); - - useInterval( - () => { + const interval = useInterval( + () => setIndicatorAngle((prevState) => { return (prevState += multiplier); - }); - }, - gameState ? 1 : null + }), + 1 ); useEffect(() => { setIndicatorAngle(-90); - setGameState(true); + interval.start(); }, [skillCheck]); useEffect(() => { if (indicatorAngle + 90 >= 360) { - setGameState(false); + interval.stop(); handleComplete(false); } }, [indicatorAngle]); @@ -41,7 +40,7 @@ const Indicator: React.FC = ({ angle, offset, multiplier, handleComplete, useEffect(() => { if (!isKeyPressed) return; - setGameState(false); + interval.stop(); if (indicatorAngle < angle || indicatorAngle > angle + offset) handleComplete(false); else handleComplete(true); @@ -52,12 +51,10 @@ const Indicator: React.FC = ({ angle, offset, multiplier, handleComplete, r={50} cx={250} cy={250} - fill="transparent" - stroke="red" - strokeWidth={15} strokeDasharray={circleCircumference} strokeDashoffset={circleCircumference - 3} transform={`rotate(${indicatorAngle}, 250, 250)`} + className={className} /> ); };