From 97f790877a18a96abcf8f51c70ac9cc77101ded7 Mon Sep 17 00:00:00 2001 From: Shahinabonu Shamshodova Date: Sun, 6 Nov 2022 01:52:00 +0000 Subject: [PATCH] Implement keyboard controls for the current version of calculator. --- src/App.js | 161 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 131 insertions(+), 30 deletions(-) diff --git a/src/App.js b/src/App.js index f28bb60..4baa483 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, {useState, useEffect, useRef} from "react"; import Wrapper from "./components/Wrapper"; import Screen from "./components/Screen"; @@ -28,6 +28,15 @@ const App = () => { res: 0, }); + + const ref = useRef(0); + + useEffect(() => { + ref.current.focus(); + }, []); + + + const numClickHandler = (e) => { e.preventDefault(); const value = e.target.innerHTML; @@ -121,36 +130,128 @@ const App = () => { }); }; + const onKeyPressed = (event) => { + console.log('User pressed: ', event.key); + if(event.key === '1' || event.key === '2' || event.key === '3' || event.key === '4' || + event.key === '5' || event.key === '6' || event.key === '7' || event.key === '8' || + event.key === '9' || event.key === '0'){ + const value = event.key; + if (removeSpaces(calc.num).length < 16) { + setCalc({ + ...calc, + num: + removeSpaces(calc.num) % 1 === 0 && !calc.num.toString().includes(".") + ? toLocaleString(Number(removeSpaces(calc.num + value))) + : toLocaleString(calc.num + value), + res: !calc.sign ? 0 : calc.res, + }); + } + } + else if(event.key==='Backspace'){ + setCalc({ + ...calc, + sign: "", + num: 0, + res: 0, + }); + } + else if(event.key==='I'){ + setCalc({ + ...calc, + num: calc.num ? toLocaleString(removeSpaces(calc.num) * -1) : 0, + res: calc.res ? toLocaleString(removeSpaces(calc.res) * -1) : 0, + sign: "", + }); + } + else if(event.key==='%'){ + let num = calc.num ? parseFloat(removeSpaces(calc.num)) : 0; + let res = calc.res ? parseFloat(removeSpaces(calc.res)) : 0; + setCalc({ + ...calc, + num: (num /= Math.pow(100, 1)), + res: (res /= Math.pow(100, 1)), + sign: "", + }); + } + else if(event.key === '/' || event.key === '+' || event.key === '-' || event.key==='*'){ + setCalc({ + ...calc, + sign: event.key === '*'? 'X' : event.key, + res: !calc.num + ? calc.res + : !calc.res + ? calc.num + : toLocaleString( + math( + Number(removeSpaces(calc.res)), + Number(removeSpaces(calc.num)), + calc.sign + ) + ), + num: 0, + }); + } + else if(event.key === '.'){ + const value = event.key; + setCalc({ + ...calc, + num: !calc.num.toString().includes(".") ? calc.num + value : calc.num, + }); + } + else if(event.key === 'Enter'){ + if (calc.sign && calc.num) { + setCalc({ + ...calc, + res: + calc.num === "0" && calc.sign === "/" + ? "Can't divide with 0" + : toLocaleString( + math( + Number(removeSpaces(calc.res)), + Number(removeSpaces(calc.num)), + calc.sign + ) + ), + sign: "", + num: 0, + }); + } + } + } + + return ( - - - - {btnValues.flat().map((btn, i) => { - return ( -