Merge pull request #23 from jcreek/19-add-a-basic-my-dex-page

feat(#19): Add a basic My Dex page
This commit is contained in:
Josh Creek
2024-04-08 21:23:23 +01:00
committed by GitHub
4 changed files with 102 additions and 27 deletions
+1 -1
View File
@@ -32,5 +32,5 @@
{#if imagePath} {#if imagePath}
<img src={imagePath} alt="sprite" /> <img src={imagePath} alt="sprite" />
{:else} {:else}
<p>Loading...</p> <span class="loading loading-spinner loading-xs"></span>
{/if} {/if}
+26 -26
View File
@@ -38,7 +38,7 @@
"columnNumber": 3, "columnNumber": 3,
"pokedexNumber": 3, "pokedexNumber": 3,
"name": "Venusaur", "name": "Venusaur",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -98,7 +98,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 6, "pokedexNumber": 6,
"name": "Charizard", "name": "Charizard",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -143,7 +143,7 @@
"columnNumber": 4, "columnNumber": 4,
"pokedexNumber": 9, "pokedexNumber": 9,
"name": "Blastoise", "name": "Blastoise",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -188,7 +188,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 12, "pokedexNumber": 12,
"name": "Butterfree", "name": "Butterfree",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -1178,7 +1178,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 52, "pokedexNumber": 52,
"name": "Meowth", "name": "Meowth",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Blue", "originGame": "Blue",
"altOriginGame": "LG: Eevee", "altOriginGame": "LG: Eevee",
@@ -1523,7 +1523,7 @@
"columnNumber": 6, "columnNumber": 6,
"pokedexNumber": 68, "pokedexNumber": 68,
"name": "Machamp", "name": "Machamp",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -2093,7 +2093,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 94, "pokedexNumber": 94,
"name": "Gengar", "name": "Gengar",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -2183,7 +2183,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 99, "pokedexNumber": 99,
"name": "Kingler", "name": "Kingler",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -2914,7 +2914,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 131, "pokedexNumber": 131,
"name": "Lapras", "name": "Lapras",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -3109,7 +3109,7 @@
"columnNumber": 3, "columnNumber": 3,
"pokedexNumber": 143, "pokedexNumber": 143,
"name": "Snorlax", "name": "Snorlax",
"form": "Gigantamax", "form": "",
"generation": 1, "generation": 1,
"originGame": "Red/Blue/Yellow", "originGame": "Red/Blue/Yellow",
"altOriginGame": "LG: Pikachu/Eevee", "altOriginGame": "LG: Pikachu/Eevee",
@@ -11538,7 +11538,7 @@
"columnNumber": 6, "columnNumber": 6,
"pokedexNumber": 569, "pokedexNumber": 569,
"name": "Garbodor", "name": "Garbodor",
"form": "Gigantamax", "form": "",
"generation": 5, "generation": 5,
"originGame": "Black/White", "originGame": "Black/White",
"altOriginGame": "Black 2/White 2", "altOriginGame": "Black 2/White 2",
@@ -16428,7 +16428,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 810, "pokedexNumber": 810,
"name": "Melmetal", "name": "Melmetal",
"form": "Gigantamax", "form": "",
"generation": null, "generation": null,
"originGame": "GO", "originGame": "GO",
"altOriginGame": "", "altOriginGame": "",
@@ -16473,7 +16473,7 @@
"columnNumber": 4, "columnNumber": 4,
"pokedexNumber": 813, "pokedexNumber": 813,
"name": "Rillaboom", "name": "Rillaboom",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16518,7 +16518,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 816, "pokedexNumber": 816,
"name": "Cinderace", "name": "Cinderace",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16563,7 +16563,7 @@
"columnNumber": 4, "columnNumber": 4,
"pokedexNumber": 819, "pokedexNumber": 819,
"name": "Inteleon", "name": "Inteleon",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16638,7 +16638,7 @@
"columnNumber": 3, "columnNumber": 3,
"pokedexNumber": 824, "pokedexNumber": 824,
"name": "Corviknight", "name": "Corviknight",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16683,7 +16683,7 @@
"columnNumber": 6, "columnNumber": 6,
"pokedexNumber": 827, "pokedexNumber": 827,
"name": "Orbeetle", "name": "Orbeetle",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16803,7 +16803,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 835, "pokedexNumber": 835,
"name": "Drednaw", "name": "Drednaw",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16878,7 +16878,7 @@
"columnNumber": 1, "columnNumber": 1,
"pokedexNumber": 840, "pokedexNumber": 840,
"name": "Coalossal", "name": "Coalossal",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16908,7 +16908,7 @@
"columnNumber": 3, "columnNumber": 3,
"pokedexNumber": 842, "pokedexNumber": 842,
"name": "Flapple", "name": "Flapple",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword", "originGame": "Sword",
"altOriginGame": "", "altOriginGame": "",
@@ -16923,7 +16923,7 @@
"columnNumber": 4, "columnNumber": 4,
"pokedexNumber": 843, "pokedexNumber": 843,
"name": "Appletun", "name": "Appletun",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Shield", "originGame": "Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -16953,7 +16953,7 @@
"columnNumber": 6, "columnNumber": 6,
"pokedexNumber": 845, "pokedexNumber": 845,
"name": "Sandaconda", "name": "Sandaconda",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -17073,7 +17073,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 852, "pokedexNumber": 852,
"name": "Centiskorch", "name": "Centiskorch",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -17208,7 +17208,7 @@
"columnNumber": 5, "columnNumber": 5,
"pokedexNumber": 859, "pokedexNumber": 859,
"name": "Hatterene", "name": "Hatterene",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -17253,7 +17253,7 @@
"columnNumber": 2, "columnNumber": 2,
"pokedexNumber": 862, "pokedexNumber": 862,
"name": "Grimmsnarl", "name": "Grimmsnarl",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
@@ -18468,7 +18468,7 @@
"columnNumber": 5, "columnNumber": 5,
"pokedexNumber": 880, "pokedexNumber": 880,
"name": "Copperajah", "name": "Copperajah",
"form": "Gigantamax", "form": "",
"generation": 8, "generation": 8,
"originGame": "Sword/Shield", "originGame": "Sword/Shield",
"altOriginGame": "", "altOriginGame": "",
+26
View File
@@ -0,0 +1,26 @@
import { json } from '@sveltejs/kit';
import { dbConnect, dbDisconnect } from '$lib/utils/db';
import { type PokedexEntry } from '$lib/models/PokedexEntry';
import PokedexEntryRepository from '$lib/repositories/PokedexEntryRepository';
export const GET = async () => {
return json(await fetchPokeDexEntriesFromDatabase());
};
async function fetchPokeDexEntriesFromDatabase() {
let pokemonData = null as PokedexEntry[] | null;
try {
await dbConnect();
const repo = new PokedexEntryRepository();
pokemonData = await repo.findAll();
// order by pokedexNumber property, ascending
pokemonData = pokemonData.sort((a, b) => a.pokedexNumber - b.pokedexNumber);
} catch (error) {
console.error(error);
} finally {
dbDisconnect();
}
return pokemonData;
}
+49
View File
@@ -0,0 +1,49 @@
<script lang="ts">
import { onMount } from 'svelte';
import { type PokedexEntry } from '$lib/models/PokedexEntry';
import PokemonSprite from '$lib/components/PokemonSprite.svelte';
let pokemonData = null as PokedexEntry[] | null;
async function fetchPokeDexEntries() {
const response = await fetch('/api/pokedexentries');
if (!response.ok) {
throw new Error('Failed to fetch Pokémon data');
}
pokemonData = await response.json();
}
onMount(async () => {
const cachedData = localStorage.getItem('pokeDexEntries');
if (cachedData) {
// Use cached data
pokemonData = JSON.parse(cachedData);
} else {
await fetchPokeDexEntries();
// Cache data in local storage
localStorage.setItem('pokeDexEntries', JSON.stringify(pokemonData));
}
});
</script>
{#if pokemonData}
{#each pokemonData as pokemon}
<div>
<PokemonSprite
pokedexNumber={pokemon.pokedexNumber.toString().padStart(3, '0')}
form={pokemon.form
.replace(/[^a-zA-Z ]/g, '')
.trim()
.replace(/ /g, '-')}
/>
<p>
{pokemon.pokedexNumber.toString().padStart(3, '0')}
{pokemon.pokemon}
{pokemon.form}
</p>
</div>
{/each}
{:else}
<span class="loading loading-spinner loading-xl"></span>
{/if}