Front End Development Libraries Projects - Build a Drum Machine

Tell us what’s happening:

When I use the keydown eventListener it prints tens to hundreds logs of the keypresses. I knew about React logging it twice but there is clearly something wrong here. Am I missing something?
Also, sometimes you can hear the buttons firing multiple times (only on keypresses, clicking them is fine tho)

###Your project link(s)

https://mchuachong.github.io/cc_drums/

<!--App-->
import Button from './Button'
import './App.css'
import { useState} from 'react'
import Slider from './Slider.tsx'
import {Heater_1,Heater_2,Heater_3,Heater_4,Clap,Closed_HH,Open_HH,Kick,KicknHat} from './audio/index.tsx'
const App = () => {
  const [volume,setVolume] = useState(25);
  const [pressedKey,setPressedKey] = useState ('');
  
  const handleKeyDown = (e:any) => {
    setPressedKey(e.key);
    console.log(e.key)};
  const handleKeyUp = () => {
   setPressedKey('');}
 /* useEffect(()=>{
  document.addEventListener("keydown",handleKeyDown);
  return document.removeEventListener("keydown",handleKeyDown);},[])
  */
  document.addEventListener("keydown",handleKeyDown);
  document.addEventListener("keyup",handleKeyUp);
  return (
    <div id="drum-machine">
      <div id="soundCont">
        <div className="btnRow">
        <Button audio={Heater_1} ckey="7" pressedKey={pressedKey} volume={volume}/><Button audio={Heater_2} pressedKey={pressedKey}  ckey="8" volume={volume}/><Button volume={volume} ckey="9" pressedKey={pressedKey} audio={Heater_3}/>
        </div>
        <div className="btnRow">
        <Button volume={volume} ckey="4" pressedKey={pressedKey} audio={Heater_4}/><Button volume={volume} pressedKey={pressedKey} ckey="5" audio={Clap}/><Button volume={volume} ckey="6" pressedKey={pressedKey} audio={Closed_HH}/>
        </div>
        <div className="btnRow">
        <Button volume={volume} ckey="1" pressedKey={pressedKey} audio={Open_HH}/><Button  volume={volume} pressedKey={pressedKey} ckey="2" audio={Kick}/><Button volume={volume} ckey="3" pressedKey={pressedKey} audio={KicknHat}/>
        </div>
      </div>
      <div id="rightCont">
      <div id="slider"><Slider volume={volume} setVolume={setVolume} setPressedKey={setPressedKey}/></div>
      <div id="display"></div>
      </div>
      
    </div>
  )
}
export default App

<!--Button-->

const Button = ({audio,volume,ckey,pressedKey}:any) => {
    const handleClick = () => {
      const audioFile = new Audio (audio);
        audioFile.volume=volume/100;
        audioFile.play();

        //Not this, I tried
        document.getElementById("display")!.innerHTML=`<div>${dispUp(ckey)}</div>`;
        document.getElementById(`${dispUp(ckey)}`)?.classList.add("on");
        setTimeout(() => {
          removeEff(ckey);
        }, 200);
        //
    }
    if(pressedKey===ckey){handleClick();}
    return (
        <div className="drum-pad" id={dispUp(ckey)} onClick={handleClick}>{ckey}</div>
    )
}

const dispUp = (prompt:any) => {
    switch (prompt) {
      case '1':
        return "Open HH"
      case '2':
        return "Kick"
      case '3':
        return "Kick n' Hat"
      case '4':
        return "Heater-4"
      case '5':
        return "Clap"
      case '6':
        return "Closed HH"
      case '7':
        return "Heater-1"
      case '8':
        return "Heater-2"
      case '9':
        return "Heater-3"
  
    }
  }

const removeEff = (c:any) => {
  
  document.getElementById(`${dispUp(c)}`)?.classList.remove("on");
}
export default Button

<!-- Slider -->
const Slider = ({volume,setVolume,setPressedKey}:any) =>{
    const handleChange = (e:any) => {
      setVolume(e.target.value);
      setPressedKey('');
    }
    return <div id="volCont">
      <input id="volume" type="range" onChange={handleChange} min="0" max="100" value={volume} list="values"></input>
      
      <datalist id="values">
      <option value="0" label="0"></option>
      <option value="12.5" label="12.5"></option>
      <option value="25" label="25"></option>
      <option value="37.5" label="37.5"></option>
      <option value="50" label="50"></option>
      <option value="62.5" label="62.5"></option>
      <option value="75" label="75"></option>
      <option value="87.5" label="87.5"></option>
      <option value="100" label="100"></option>
      </datalist>
      
      </div>
  }

  export default Slider

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36

Challenge Information:

Front End Development Libraries Projects - Build a Drum Machine

what troubleshooting have you tried? if examples like these were in codepen/replit environment its much easier to interact with

happy coding :slight_smile: