sinan
sinan

Reputation: 570

Radio button onChange function doesnt update the state of app - React

I am trying to learn React but stuck on sth. I have checked other topics as well but couldnt find the answer.

I am trying to shut down the app with on/off radio buttons. When I first run the app, pressing Q works and play the sound. When I click Off radio but it doesnt work anymore which is I am trying to do. However when I click On radio button again, it doesnt play any sound.

I am also open to your recommendations to optimize my code.

let { Button, ButtonToolbar, ButtonGroup, Radio } = ReactBootstrap;

class App extends React.Component {
  constructor(props){
    super(props);
    this.state = {
        power: true,
    };
    this.playSound = this.playSound.bind(this);
    this.turnItOff = this.turnItOff.bind(this);
    const bankOne = [{
    keyCode: 81,
    keyTrigger: 'Q',
    id: 'Heater-1',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3'
  }, {
    keyCode: 87,
    keyTrigger: 'W',
    id: 'Heater-2',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3'
  }, {
    keyCode: 69,
    keyTrigger: 'E',
    id: 'Heater-3',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3'
  }, {
    keyCode: 65,
    keyTrigger: 'A',
    id: 'Heater-4',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3'
  }, {
    keyCode: 83,
    keyTrigger: 'S',
    id: 'Clap',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3'
  }, {
    keyCode: 68,
    keyTrigger: 'D',
    id: 'Open-HH',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3'
  }, {
    keyCode: 90,
    keyTrigger: 'Z',
    id: "Kick-n'-Hat",
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3'
  }, {
    keyCode: 88,
    keyTrigger: 'X',
    id: 'Kick',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3'
  }, {
    keyCode: 67,
    keyTrigger: 'C',
    id: 'Closed-HH',
    url: 'https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3'
  },
];
    this.audio = new Audio(bankOne[1].url)
  }
  
  playSound(){
    if (this.state.power == true) {
      return this.audio.play();
    }
  };
  
  turnItOff() {
    if (this.state.power == true) {
    this.setState({
      power: false
    })      
    } else {
    this.setState({
      power: false
    })        
    }
  };
  
  render(){
    return(
    <div id='container' >
      <div className='buttons' >
        <div className='firstLine'>
          <ButtonToolbar>
            <Button bsStyle="primary" className='drum-pad' bsSize="large"  onClick = {this.playSound}>Q</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">W</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">E</Button>
          </ButtonToolbar>
        </div>
        <div className='firstLine'>
          <ButtonToolbar>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">A</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">S</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">D</Button>
          </ButtonToolbar>   
        </div>  
        <div className='firstLine'>
          <ButtonToolbar>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">Z</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">X</Button>
            <Button bsStyle="primary" className='drum-pad' bsSize="large">C</Button>
          </ButtonToolbar>   
        </div>
      </div>
      <div className='setting'>
        <div>
          <ButtonGroup className='radio' >
            <Radio name="groupOptions" defaultChecked onChange = {this.turnItOff} >ONN</Radio>     
            <Radio name="groupOptions" onChange = {this.turnItOff}>OFF</Radio>  
          </ButtonGroup>
        </div>
        <div>
          <div id='display' />          
        </div>
        <div>
          <ButtonGroup className='radio' >
            <Button bsStyle="success">Vol +</Button>
            <Button bsStyle="danger">Vol -</Button>
          </ButtonGroup>
          <ButtonGroup className='changeTune' >
            <Radio name="groupOptions">Flute Kit</Radio>           
            <Radio name="groupOptions">Piano Kit</Radio>  
          </ButtonGroup>          
        </div>
      </div>
    </div>
    )
  }
}

ReactDOM.render(
	<App/>,
    document.getElementById('drum-machine')
);
#container{
  background-color:#f5f5f5;
  margin: 30px auto;
  width: 30%;
  height: 200px;
  border: 3px solid #337ab7;
  padding: 10px;
}

.buttons{
  float:left;
}

.radio{
  display:inline-block;
  margin: 4px;
}

.firstLine {
  margin: 10px;
}

#display{
  background-color: #337ab7;
  float: left;
  width: 180px;
  height: 40px;
  color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.32.1/react-bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div id='drum-machine'></div>

Upvotes: 0

Views: 397

Answers (3)

Sankalp
Sankalp

Reputation: 76

got the issue,

the state is not changing properly on turnItOff method.

update the code as follows:

 turnItOff() {
if (this.state.power == true) {
this.setState({
  power: !this.state.power
})      
} else {
this.setState({
  power: !this.state.power
})        
}

};

fiddle here

Upvotes: 0

Colin Ricardo
Colin Ricardo

Reputation: 17239

This:

  turnItOff() {
    if (this.state.power == true) {
      this.setState({
        power: false
      });
    } else {
      this.setState({
        power: false
      });
    }
  }

Should be something like this:

toggle() {
  this.setState({ power: !this.state.power });
}

The way you have it, it will only ever set power to be false.

Upvotes: 2

Dhananjai Pai
Dhananjai Pai

Reputation: 6015

if (this.state.power == true) {
    this.setState({
    power: false
})      
} else {
this.setState({
  power: false
})        

Both if and else statements are doing the same thing ? Can you please check the logic ?

Upvotes: 0

Related Questions