143 lines
6.0 KiB
JavaScript
143 lines
6.0 KiB
JavaScript
import React, { Component } from 'react';
|
|
import Switch from 'react-toggle-switch';
|
|
import { kanaDictionary } from '../../data/kanaDictionary';
|
|
import './ChooseCharacters.scss';
|
|
import CharacterGroup from './CharacterGroup';
|
|
|
|
class ChooseCharacters extends Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
errMsg : '',
|
|
selectedGroups: this.props.selectedGroups
|
|
}
|
|
this.startGame = this.startGame.bind(this);
|
|
this.showGroupRows = this.showGroupRows.bind(this);
|
|
this.toggleSelect = this.toggleSelect.bind(this);
|
|
this.selectAll = this.selectAll.bind(this);
|
|
this.selectNone = this.selectNone.bind(this);
|
|
}
|
|
|
|
getIndex(groupName) {
|
|
return this.state.selectedGroups.indexOf(groupName);
|
|
}
|
|
|
|
isSelected(groupName) {
|
|
return this.getIndex(groupName) > -1 ? true : false;
|
|
}
|
|
|
|
removeSelect(groupName) {
|
|
if(this.getIndex(groupName)<0) return;
|
|
let newSelectedGroups = this.state.selectedGroups.slice();
|
|
newSelectedGroups.splice(this.getIndex(groupName), 1);
|
|
this.setState({selectedGroups: newSelectedGroups});
|
|
}
|
|
|
|
addSelect(groupName) {
|
|
this.setState({errMsg: '', selectedGroups: this.state.selectedGroups.concat(groupName)});
|
|
}
|
|
|
|
toggleSelect(groupName) {
|
|
if(this.getIndex(groupName) > -1) this.removeSelect(groupName);
|
|
else this.addSelect(groupName);
|
|
}
|
|
|
|
selectAll(whichKana) {
|
|
let thisKana = kanaDictionary[whichKana];
|
|
let newSelectedGroups = this.state.selectedGroups.slice();
|
|
Object.keys(thisKana).map(function(groupName) {
|
|
if(!this.isSelected(groupName))
|
|
newSelectedGroups.push(groupName);
|
|
}, this);
|
|
this.setState({errMsg: '', selectedGroups: newSelectedGroups});
|
|
}
|
|
|
|
selectNone(whichKana) {
|
|
let newSelectedGroups = [];
|
|
this.state.selectedGroups.map(function(groupName) {
|
|
let mustBeRemoved = false;
|
|
Object.keys(kanaDictionary[whichKana]).map(function(removableGroupName) {
|
|
if(removableGroupName===groupName)
|
|
mustBeRemoved = true;
|
|
}, this);
|
|
if(!mustBeRemoved)
|
|
newSelectedGroups.push(groupName);
|
|
}, this);
|
|
this.setState({selectedGroups: newSelectedGroups});
|
|
}
|
|
|
|
showGroupRows(whichKana) {
|
|
let thisKana = kanaDictionary[whichKana];
|
|
return Object.keys(thisKana).map(function(groupName, idx) {
|
|
return (
|
|
<CharacterGroup
|
|
key={idx}
|
|
groupName={groupName}
|
|
selected={this.isSelected(groupName)}
|
|
characters={thisKana[groupName].characters}
|
|
handleToggleSelect={this.toggleSelect}
|
|
/>
|
|
);
|
|
}, this);
|
|
}
|
|
|
|
startGame() {
|
|
if(this.state.selectedGroups.length < 1) {
|
|
this.setState({ errMsg: 'Choose at least one group!'});
|
|
return;
|
|
}
|
|
this.props.handleStartGame(this.state.selectedGroups);
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div className="choose-characters">
|
|
<div className="row">
|
|
<div className="col-xs-12">
|
|
<div className="panel panel-default">
|
|
<div className="panel-body welcome">
|
|
<h4>Welcome to Kana Quiz!</h4>
|
|
<p>Please choose the groups of characters that you'd like to be studying.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="row">
|
|
<div className="col-sm-6">
|
|
<div className="panel panel-default">
|
|
<div className="panel-heading">Hiragana · ひらがな</div>
|
|
<div className="panel-body selection-areas">
|
|
{this.showGroupRows('hiragana')}
|
|
</div>
|
|
<div className="panel-footer text-center">
|
|
<a href="javascript:;" onClick={()=>this.selectAll('hiragana')}>All</a> · <a href="javascript:;" onClick={()=>this.selectNone('hiragana')}>None</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-6">
|
|
<div className="panel panel-default">
|
|
<div className="panel-heading">Katakana · カタカナ</div>
|
|
<div className="panel-body selection-areas">
|
|
{this.showGroupRows('katakana')}
|
|
</div>
|
|
<div className="panel-footer text-center">
|
|
<a href="javascript:;" onClick={()=>this.selectAll('katakana')}>All</a> · <a href="javascript:;" onClick={()=>this.selectNone('katakana')}>None</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-3 col-xs-12 pull-right">
|
|
<span className="pull-right lock">Lock to stage
|
|
{this.props.isLocked?<input className="stage-choice" type="number" min="1" max="4" maxLength="1" size="1" onChange={(e)=>this.props.lockStage(e.target.value, true)} value={this.props.stage} />:''}
|
|
<Switch onClick={()=>this.props.lockStage(1)} on={this.props.isLocked} /></span>
|
|
</div>
|
|
<div className="col-sm-offset-3 col-sm-6 col-xs-12 text-center">
|
|
{this.state.errMsg!=''?(<div className="error-message">{this.state.errMsg}</div>):''}
|
|
<button className="btn btn-danger startgame-button" onClick={this.startGame}>Start the Quiz!</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default ChooseCharacters; |