From f24bd7a93beae292dc240d120057613e3fb1494e Mon Sep 17 00:00:00 2001 From: Syco21 Date: Fri, 15 May 2026 22:18:04 +0200 Subject: [PATCH] Fetch image_ids lazily with first image, remove from initial cards load --- src/context/CardContext.jsx | 15 ++++++---- src/pages/HomePage.jsx | 55 ++++++++++++++++++------------------- src/services/api.js | 3 +- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/context/CardContext.jsx b/src/context/CardContext.jsx index 405c3c1..e699664 100644 --- a/src/context/CardContext.jsx +++ b/src/context/CardContext.jsx @@ -5,7 +5,8 @@ export const CardContext = createContext(); export function CardProvider({ children }) { const [ownedAmounts, setOwnedAmounts] = useState({}); const [expandedCardId, setExpandedCardId] = useState(null); - // cardImages[cardId] is an array of base64 strings, one per artwork index + // cardImages[cardId].blobs: string[] (base64 per artwork index) + // cardImages[cardId].ids: number[] (image_ids from API) const [cardImages, setCardImages] = useState({}); const updateAmount = (card_id, key, amount) => { @@ -15,11 +16,15 @@ export function CardProvider({ children }) { })); }; - const setCardImage = (card_id, index, blob) => { + const setCardImage = (card_id, index, blob, image_ids) => { setCardImages(prev => { - const existing = prev[card_id] ? [...prev[card_id]] : []; - existing[index] = blob; - return { ...prev, [card_id]: existing }; + const existing = prev[card_id] ?? { blobs: [], ids: [] }; + const blobs = [...existing.blobs]; + blobs[index] = blob; + return { + ...prev, + [card_id]: { blobs, ids: image_ids ?? existing.ids } + }; }); }; diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index f19f2de..c9db9e3 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -45,14 +45,14 @@ function HomePage() { useEffect(() => { if (!expandedCardId) return; - const card = cards.find(c => c.id === expandedCardId); - if (!card) return; - const imageId = card.image_ids?.[artworkIndex]; - if (!imageId || cardImages[expandedCardId]?.[artworkIndex]) return; + const imageIds = cardImages[expandedCardId]?.ids; + const imageId = imageIds?.[artworkIndex]; + if (cardImages[expandedCardId]?.blobs[artworkIndex]) return; + // imageId may be undefined on first load (ids not yet fetched) fetchCardImage(expandedCardId, imageId) - .then(image => setCardImage(expandedCardId, artworkIndex, image)) + .then(({ image, image_ids }) => setCardImage(expandedCardId, artworkIndex, image, image_ids)) .catch(err => console.error('Failed to load card image', err)); - }, [expandedCardId, artworkIndex, cards, cardImages, setCardImage]); + }, [expandedCardId, artworkIndex, cardImages, setCardImage]); const getTotal = useCallback((card) => card.printings?.reduce((sum, p) => { @@ -134,30 +134,27 @@ function HomePage() {
{expandedCard ? ( <> -
- {cardImages[expandedCardId]?.[artworkIndex] ? ( - {expandedCard.name} - ) : ( -
Loading image…
- )} - {(expandedCard.image_ids?.length ?? 0) > 1 && ( -
- - - {artworkIndex + 1} / {expandedCard.image_ids.length} - - + {(() => { + const imgs = cardImages[expandedCardId]; + const blob = imgs?.blobs[artworkIndex]; + const ids = imgs?.ids ?? []; + return ( +
+ {blob ? ( + {expandedCard.name} + ) : ( +
Loading image…
+ )} + {ids.length > 1 && ( +
+ + {artworkIndex + 1} / {ids.length} + +
+ )}
- )} -
+ ); + })()}
{expandedCard.name}
diff --git a/src/services/api.js b/src/services/api.js index a5cce7c..3ee20a0 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -13,8 +13,7 @@ export async function fetchCardImage(cardId, imageId) { : `${API_BASE}/cardImage/${cardId}`; const response = await fetch(url); if (!response.ok) throw new Error('Failed to fetch card image'); - const data = await response.json(); - return data.image; + return await response.json(); // { image, image_ids } } export async function updateCardAmount(cardId, setId, rarityId, amount) {