learn-morse-code/src/app-modes/ChallengeMode.js

117 lines
4.4 KiB
JavaScript
Raw Normal View History

2020-02-10 09:26:04 +01:00
import React, {useContext} from 'react';
2020-01-09 10:06:38 +01:00
import '../css/App.css';
import morseCode from '../data/morse-reverse.json'
2020-01-19 04:35:11 +01:00
import ChallengeWord from '../components/ChallengeWord'
import ChallengeBufferDisplay from '../components/ChallengeBufferDisplay';
2020-01-19 04:35:11 +01:00
import { MorseBufferContext } from '../contexts/morseBufferContext';
import { WordFeederContext } from '../contexts/wordFeederContext';
import GameClock from '../components/GameClock';
import { GameClockContext } from '../contexts/gameClockContext';
import { KeyTypeContext } from '../contexts/keyTypeContext';
import StraightKey from '../components/StraightKey';
import ElectronicKey from '../components/ElectronicKey';
import ChallengeControls from '../components/ChallengeControls';
2020-02-10 09:26:04 +01:00
import { ChallengeContext } from '../contexts/challengeContext';
2020-01-09 10:06:38 +01:00
2020-01-21 12:43:21 +01:00
export default React.memo(function ChallengeMode(props) {
2020-02-10 09:26:04 +01:00
console.log('CHALLENGE MODE');
const {word, getNextWord} = useContext(WordFeederContext)
const {clockIsRunning} = useContext(GameClockContext)
2020-01-21 12:43:21 +01:00
const {morseCharBuffer, setMorseCharBuffer} = useContext(MorseBufferContext)
const {keyType} = useContext(KeyTypeContext)
2020-02-10 09:26:04 +01:00
const {completeChallenge, cancelChallenge} = useContext(ChallengeContext)
2020-01-21 11:04:46 +01:00
let morseArray = morseCharBuffer.split('_').filter(l => l !== '')
let challengeWordClass = ''
2020-01-21 11:04:46 +01:00
let correctCharIndexes = [] // Indexes of correct letters in Challenge Word
let incorrectMorseIndexes = [] // Indexes of incorrect morse characters in morse character buffer
2020-01-21 12:43:21 +01:00
let offset = 0
2020-02-10 09:26:04 +01:00
let challengeLetters
2020-02-10 09:26:04 +01:00
// If no more words in wordlist, feeder returns first word in an array
if (typeof word === 'object') {
completeChallenge()
challengeLetters = word[0].split('')
}
2020-02-10 09:26:04 +01:00
else {
challengeLetters = word.split('')
}
2020-01-21 11:04:46 +01:00
2020-01-21 12:43:21 +01:00
// Iterate through the morse character buffer and compare with each letter of challenge word
morseArray.forEach((item, index) => {
if (morseCharBuffer.slice(-1) === '_') { // If end of morse character
let morseLetter = morseCode[morseArray[index]] || '[?]'
2020-02-01 03:09:54 +01:00
let challengeLetter = challengeLetters[index-offset].toLowerCase()
2020-01-21 12:43:21 +01:00
if (morseLetter === challengeLetter) {
correctCharIndexes.push(index-offset)
2020-02-03 05:51:18 +01:00
document.getElementById('challengeWord').childNodes[index-offset].classList.add('correct')
// incorrectCharIndex = null
2020-01-21 12:43:21 +01:00
}
else {
2020-02-03 05:51:18 +01:00
// incorrectCharIndex = index-offset
2020-01-21 12:43:21 +01:00
incorrectMorseIndexes.push(index)
if (incorrectMorseIndexes.length > 0) {
setMorseCharBuffer(prev => {
let newState = prev.split('_').filter(l => l !== '')
newState.splice(incorrectMorseIndexes[0], 1)
newState = newState.join('_') + '_'
return newState
})
incorrectMorseIndexes.splice(1,incorrectMorseIndexes.length)
}
2020-01-21 12:43:21 +01:00
offset = incorrectMorseIndexes.length
}
}
})
function timeout(delay) {
new Promise((resolve) => {
setTimeout(() => {
resolve()
}, delay)
})
}
2020-01-21 12:43:21 +01:00
// Next word once all correct
if (correctCharIndexes.length === challengeLetters.length) {
//
challengeWordClass = 'correct'
setTimeout(() => {
setMorseCharBuffer('')
2020-02-03 05:51:18 +01:00
morseArray = []
incorrectMorseIndexes = []
2020-02-10 09:26:04 +01:00
correctCharIndexes = []
2020-02-03 05:51:18 +01:00
offset = 0
2020-02-01 03:09:54 +01:00
}, 800)
setTimeout(() => {
getNextWord()
if (document.getElementById('challengeWord') !== null) {
document.getElementById('challengeWord').childNodes.forEach(node => {
node.classList = "cLetter"
})
}
2020-02-01 03:09:54 +01:00
}, 1000)
2020-01-21 12:43:21 +01:00
}
2020-01-09 10:06:38 +01:00
return (
<>
{clockIsRunning ? (keyType === "straight" ?
<StraightKey /> : <ElectronicKey />) : <></>
}
2020-02-10 09:26:04 +01:00
<ChallengeControls cancelChallenge={cancelChallenge} />
<GameClock />
2020-02-03 05:51:18 +01:00
<ChallengeWord className={challengeWordClass} word={word} />
2020-01-21 11:04:46 +01:00
<ChallengeBufferDisplay morseArray={morseArray} incorrectMorseIndexes={incorrectMorseIndexes} />
2020-01-09 10:06:38 +01:00
</>
)
2020-01-21 11:04:46 +01:00
});