diff --git a/src/components/MovesList.js b/src/components/MovesList.js index 65ebcc2..dd627b1 100644 --- a/src/components/MovesList.js +++ b/src/components/MovesList.js @@ -86,18 +86,33 @@ export function MovesList(pokemonMoves, { versionGroupKey, gen = 9, genOfVg = () const byMethod = new Map(); for (const entry of pokemonMoves) { - const detail = entry.version_group_details.find( + const details = entry.version_group_details.filter( (d) => d.version_group.name === versionGroupKey, ); - if (!detail) continue; - const method = detail.move_learn_method.name; - if (!byMethod.has(method)) byMethod.set(method, []); - byMethod.get(method).push({ - id: idFromUrl(entry.move.url), - name: entry.move.name.replace(/-/g, ' '), - level: detail.level_learned_at, - data: null, - }); + if (!details.length) continue; + + // One move can list several details for a single game: one per learn + // method, plus Gen 1/2 data artifacts that repeat a level-up move at + // level 1 (with a non-null `order`) alongside its real learn level. + // Collapse to one entry per method, keeping the highest level. + const perMethod = new Map(); + for (const d of details) { + const method = d.move_learn_method.name; + const prev = perMethod.get(method); + if (!prev || (d.level_learned_at || 0) > (prev.level_learned_at || 0)) { + perMethod.set(method, d); + } + } + + for (const [method, d] of perMethod) { + if (!byMethod.has(method)) byMethod.set(method, []); + byMethod.get(method).push({ + id: idFromUrl(entry.move.url), + name: entry.move.name.replace(/-/g, ' '), + level: d.level_learned_at, + data: null, + }); + } } if (byMethod.size === 0) { diff --git a/src/views/PokemonDetail.js b/src/views/PokemonDetail.js index fe48958..50cc0da 100644 --- a/src/views/PokemonDetail.js +++ b/src/views/PokemonDetail.js @@ -121,7 +121,10 @@ export async function PokemonDetail(nationalId) { } // Recently-viewed history for the feed strip (most recent first, capped). + // Spread the previous state — the function form of set() replaces rather + // than merges, so dropping `...s` here would wipe feedScroll, sort, etc. ui.set((s) => ({ + ...s, recent: [nationalId, ...(s.recent || []).filter((x) => x !== nationalId)].slice(0, 12), }));