From 6f9a259f3803d83bcdc64c0b0a57332811dd9b8a Mon Sep 17 00:00:00 2001 From: poketonova Date: Tue, 9 Jun 2026 09:01:33 -0600 Subject: [PATCH 1/2] feat: expose all PriceCharting price points in searchProducts --- src/services/priceFeedService.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/priceFeedService.js b/src/services/priceFeedService.js index 3e97a13..9b05388 100644 --- a/src/services/priceFeedService.js +++ b/src/services/priceFeedService.js @@ -80,7 +80,7 @@ async function rawSearch(query) { * Search PriceCharting for products of a given game. * @param {string} query free-text (card or sealed product name) * @param {string} game one of SUPPORTED_GAMES ids - * @returns {Promise>} + * @returns {Promise>} */ export async function searchProducts(query, game = 'pokemon') { const q = (query || '').trim() @@ -113,6 +113,11 @@ export async function searchProducts(query, game = 'pokemon') { set: p.consoleName || '', image: p.imageUri || '', price: parsePrice(p.price1), + all_prices: { + ungraded: parsePrice(p.price1), + grade9: parsePrice(p.price2), + grade10: parsePrice(p.price3), + }, url: p.id ? `${PC_BASE}/game/${p.id}` : '', slug: p.id || '', sealed: inferSealed(p.productName), From a24102409051645a6da7ec7783ae2722098f9305 Mon Sep 17 00:00:00 2001 From: poketonova Date: Tue, 9 Jun 2026 09:02:12 -0600 Subject: [PATCH 2/2] feat: update market value for non-Pokemon graded cards in Add Modal --- src/components/AddItemModal.vue | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/components/AddItemModal.vue b/src/components/AddItemModal.vue index af1f527..7cdcbe6 100644 --- a/src/components/AddItemModal.vue +++ b/src/components/AddItemModal.vue @@ -225,6 +225,7 @@ const visibleTypes = computed(() => { }) // Whether the currently-selected non-Pokémon product is a sealed product. const selectedIsSealed = ref(false) +const selectedProduct = ref(null) const gradesByCompany = { PSA: ['10', '9', '8', '7', '6', '5', '4', '3', '2', '1'], @@ -265,17 +266,26 @@ async function doSealedSearch() { } function selectSealed(result) { + selectedProduct.value = result form.value.name = result.name form.value.setName = result.set form.value.pcUrl = result.url form.value.imageUrl = result.image || '' + if (result.price) form.value.currentValue = result.price + + // Update price based on current grade if applicable + if (!isPokemon.value && itemType.value === 'graded') { + updateNonPokemonGradedPrice() + } + // Pokémon results are always sealed; other TCGs carry an inferred `sealed` flag. selectedIsSealed.value = isPokemon.value ? true : (result.sealed !== false) sealedResults.value = [] } function clearSealed() { + selectedProduct.value = null form.value.name = '' form.value.setName = '' form.value.currentValue = null @@ -283,6 +293,18 @@ function clearSealed() { form.value.imageUrl = '' } +function updateNonPokemonGradedPrice() { + if (!selectedProduct.value || isPokemon.value || itemType.value !== 'graded') return + const p = selectedProduct.value.all_prices || {} + const g = String(form.value.grade).toLowerCase() + + let val = p.ungraded + if (g === '10' || g.endsWith('10')) val = p.grade10 || p.grade9 || p.ungraded + else if (g.includes('9')) val = p.grade9 || p.ungraded + + if (val != null) form.value.currentValue = val +} + const form = ref({ name: '', setName: '', @@ -456,6 +478,13 @@ watch(() => props.card, () => { form.value.priceVariant = best || variants.value[0]?.key || '' } }) + +// Watchers for non-Pokémon graded price updates +watch([() => form.value.grade, () => itemType.value], () => { + if (!isPokemon.value && itemType.value === 'graded') { + updateNonPokemonGradedPrice() + } +})