function memory({
containerID,
coupleAmount,
cardBack,
images,
onVictory,
onStart,
onTurn
}) {
const state = { turned: [], locked: false, started: false };
const deck = images.slice();
const board = document.getElementById(containerID);
function handleClick({ target }, index) {
if (state.turned.includes(index) || state.locked) return;
if (onTurn) onTurn();
if (!state.started && onStart) {
state.started = true;
onStart();
}
state.turned.push(index);
target.classList.toggle('cover');
target.setAttribute('style', `background-image: url(${couples[index]})`);
const { turned } = state;
const check = {
first: turned[turned.length - 2],
second: turned[turned.length - 1]
};
if (turned.length % 2 === 0) {
if (couples[check.first] === couples[check.second]) {
if (turned.length === couples.length && onVictory) onVictory();
} else {
state.locked = true;
const timer = setTimeout(() => {
const cards = board.getElementsByClassName('card');
const first = cards[check.first];
first.classList.toggle('cover');
first.setAttribute('style', `background-image: url(${cardBack}})`);
const second = cards[check.second];
second.classList.toggle('cover');
second.setAttribute('style', `background-image: url(${cardBack}})`);
turned.pop();
turned.pop();
state.locked = false;
}, 500);
}
}
}
while (board.hasChildNodes()) {
board.removeChild(board.lastChild);
}
while (deck.length > coupleAmount) {
const randomCard = Math.floor(Math.random() * deck.length);
deck.splice(randomCard, 1);
}
const couples = shuffle([].concat(deck, deck));
for (let i = 0; i < coupleAmount * 2; i++) {
const card = document.createElement('div');
card.setAttribute('class', 'card cover');
card.setAttribute('style', `background-image: url(${cardBack})`);
card.addEventListener('click', e => handleClick(e, i));
board.appendChild(card);
}
}