write-ups-challenges-2020-2021/gotta_catch_em_all/frontend/index.js
2022-11-24 18:03:20 +01:00

112 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const webSocket = new WebSocket('ws://51.15.125.82:5000')
const waitForOpenConnection = () => {
return new Promise((resolve, reject) => {
const maxNumberOfAttempts = 10
const intervalTime = 200 //ms
let currentAttempt = 0
const interval = setInterval(() => {
if (currentAttempt > maxNumberOfAttempts - 1) {
clearInterval(interval)
reject(new Error('Maximum number of attempts exceeded'))
} else if (webSocket.readyState === webSocket.OPEN) {
clearInterval(interval)
resolve()
}
currentAttempt++
}, intervalTime)
})
}
async function send(msg, data) {
await waitForOpenConnection();
webSocket.send(JSON.stringify({msg, data}))
}
let pokedex = {}
webSocket.onmessage = evt => {
const {msg, data} = JSON.parse(evt.data);
switch (msg) {
case 'pokedexUpdated': pokedex = data; showPokedex(); break;
case 'pokedexInitialized': pokedex = data; initGUI(); break;
case 'pokedexCompleted': window.alert(data.msg); break;
case 'error': window.alert(data.msg); break;
}
}
function fillInPokémons(pkdx) {
window.setTimeout(() => {
send('updatePokedex', {pokemon: pkdx[0], values: {captured: true}})
fillInPokémons(pkdx.slice(1))
}, 200)
}
function initializePokedex() {
send('initializePokedex')
}
initializePokedex()
function initGUI() {
const selection = document.getElementById("pokeselect");
const options = Object.entries(pokedex).map(([pokemon, properties]) => {
const option = document.createElement("option")
option.setAttribute("value", pokemon)
option.append(pokemon)
return option
})
selection.append(...options);
showPokedex();
}
function catchPokemon() {
const selection = document.getElementById("pokeselect").value;
send('updatePokedex', {pokemon: selection, values: {captured: true}})
}
function showPokedex() {
const container = document.getElementById("capturedPokemon");
container.textContent = '';
const pokedexTable = Object.entries(pokedex)
.reduce((acc, val) =>
(acc[acc.length - 1].length === 5)
? [...acc, [val]]
: [...acc.slice(0, acc.length - 1), [...acc[acc.length - 1], val]],
[[]]
)
const pokedexGUI = pokedexTable.map((pokeRow, colNum) => {
const ths = pokeRow.map(([pokemon, properties], rowNum) => {
const th = document.createElement("th");
th.setAttribute("class", "pokecell")
if(properties.captured) {
const img = document.createElement("img");
const htmlFriendlyPokeName = pokemon
.toLowerCase()
.replace("♀", "-f")
.replace("♂", "-m")
.replace("", "")
.replace(". ", "-")
img.setAttribute("src", `https://img.pokemondb.net/artwork/${htmlFriendlyPokeName}.jpg`);
img.setAttribute("height", "100");
img.setAttribute("width", "100");
const name = document.createElement("h2")
name.innerText = pokemon
th.append(img, name)
} else {
const name = document.createElement("h1")
name.innerText = `${colNum * 5 + rowNum + 1}`
th.append(name)
}
return th
})
const tr = document.createElement("tr");
tr.append(...ths)
return tr
})
container.append(...pokedexGUI)
}