import {loadingGif} from "./loading.js"; document.getElementById('searchForm').addEventListener('submit', function (event) { event.preventDefault(); const creatureName = document.getElementById('creature').value; const queryParams = new URLSearchParams({ creature: creatureName, }); // Insert the loading.gif before making the fetch request let resultSection = document.getElementById('resultSection'); let imgElement = loadingGif(resultSection); setTimeout(() => { fetch(`${window.BASE_URL}/rules/creature?${queryParams}`) .then((response) => { if (!response.ok) { throw response; } return response.json(); // we only get here if there is no error }) .then((json) => { if (json === null) { // if json is null update the image and stop execution imgElement.src = 'img/404.jpg'; throw new Error('No data found'); // this will stop the execution and go to the catch block } resultSection.innerHTML = ''; // Clear previous content if (creatureName === 'android') { androidResultTable(json); } else { setCreatureTable(json); } }) .catch((err) => { console.log(err); if(!resultSection.hasChildNodes()) { // Only update the image if it wasn't already updated imgElement.src = 'img/404.jpg'; } }); function setResultImage(name) { let imgElement = document.createElement('img'); imgElement.src = 'img/' + name + ".jpg"; console.log(imgElement.src); imgElement.onerror = function () { this.src = 'img/404.jpg'; }; resultSection.appendChild(imgElement); } function formatDiceMnemonic(data) { return Array.isArray(data) ? data[0] + "d" + data[1] + (data[2] === 0 ? "" : (data[2] > 0 ? "+" : "") + data[2]) : data.toString(); } function formatSpeedMnemonic(data){ return data[0] + '/' + data[1] + '/' + data[2]; } function androidResultTable(data) { let container = document.createElement('div'); container.className = 'container android'; let creatureTitle = document.createElement('h2'); creatureTitle.textContent = creatureName.toUpperCase(); container.appendChild(creatureTitle) let image = document.createElement('img'); image.src = 'img/android.jpg'; image.onerror = () => { image.src = 'img/404.jpg' }; image.style.width = '275px'; image.style.height = '275px'; container.appendChild(image); let description = createDescriptionSection(data); container.appendChild(description); Object.entries(data).forEach(([key, value]) => { if (key === 'thinker' || key === 'worker' || key === 'warrior') { let typeTitle = document.createElement('h2'); typeTitle.textContent = key.toUpperCase(); container.appendChild(typeTitle); // Create a div for each type (thinker, worker, or warrior) let typeContainer = document.createElement('div'); typeContainer.className = 'typeContainer'; // we'll use this in css let profile = createProfileSection(value); let abilities = createAbilitiesSection(value); // Append profile and abilities to the typeContainer, instead of the main container typeContainer.appendChild(profile); typeContainer.appendChild(abilities); // Finally, append the typeContainer to the main container. container.appendChild(typeContainer); } }); resultSection.appendChild(container); } function createProfileSection(data) { let profile = document.createElement('div'); profile.className = 'creature_profile'; let profileHTML = `

Profile

`; if(data['land speed']){ profileHTML += ``; } if(data['water speed']){ profileHTML += ``; } if(data['air speed']){ profileHTML += ``; } profileHTML += '
NUMBER ${formatDiceMnemonic(data.number)}
MORALE ${formatDiceMnemonic(data.morale)}
HIT DICE ${formatDiceMnemonic(data['hit dice'])}
ARMOUR ${data.armour}
ENVIRON ${data.environ.join(', ')}
LAND SPEED ${formatSpeedMnemonic(data['land speed'])}
WATER SPEED ${formatSpeedMnemonic(data['water speed'])}
AIR SPEED ${formatSpeedMnemonic(data['air speed'])}
'; profile.innerHTML = profileHTML; return profile; } function createAbilitiesSection(data) { // Abilities section let abilities = document.createElement('div'); abilities.className = 'creature_abilities'; abilities.innerHTML = `

Abilities

MS ${formatDiceMnemonic(data.ms)}
IN ${formatDiceMnemonic(data.in)}
DX ${formatDiceMnemonic(data.dx)}
CH ${formatDiceMnemonic(data.ch)}
CN ${formatDiceMnemonic(data.cn)}
PS ${formatDiceMnemonic(data.ps)}
`; return abilities; } function createAttacksSection(data) { // Attacks section let attacks = document.createElement('div'); attacks.className = 'creature_attacks'; let attacksHTML = '

Attacks

'; let attacksTable = ''; for (let attack in data.attacks) { let mnemonic_display; mnemonic_display = formatDiceMnemonic(data.attacks[attack]); if (mnemonic_display === "0d0") { mnemonic_display = 'See Description'; } attacksTable += `` } attacksTable += '
${attack}${mnemonic_display}
'; attacks.innerHTML = attacksHTML + attacksTable; return attacks } function createMutationsSection(mutarray) { // Mutations section let mutations = document.createElement('div'); mutations.className = 'creature_mutations'; let mutationsHTML = '

Mutations

'; let mutationsList = mutarray.reduce((result, mutation) => result + `
  • ${mutation}
  • `, ''); mutationsHTML += ``; mutations.innerHTML = mutationsHTML return mutations } function createDescriptionSection(data) { // Description section let description = document.createElement('div'); description.className = 'creature_description'; let descriptionHTML = `

    Description

    ${data.description}

    `; description.innerHTML = descriptionHTML; return description } function setCreatureTable(data) { let container = document.createElement('div'); container.className = 'container'; // Creature ID section let creatureId = document.createElement('div'); creatureId.className = 'creature_id'; creatureId.innerHTML = `

    ${creatureName.toUpperCase()}

    `; let profile = createProfileSection(data); let abilities = createAbilitiesSection(data); let attacks = createAttacksSection(data); let mutations = createMutationsSection(data.mutations); // Notice the data difference let description = createDescriptionSection(data); container.appendChild(creatureId); container.appendChild(profile); container.appendChild(abilities); container.appendChild(attacks); container.appendChild(mutations); container.appendChild(description); resultSection.appendChild(container); } }, 1000); });