write-ups-challenges-2020-2021/gotta_catch_em_all/frontend/index.js

112 lines
3.6 KiB
JavaScript
Raw Permalink Normal View History

2022-11-24 17:03:20 +00:00
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)
}