diff --git a/pages/admin/card-editor.js b/pages/admin/card-editor.js index fc93164..1ab5dfe 100644 --- a/pages/admin/card-editor.js +++ b/pages/admin/card-editor.js @@ -1,3 +1,4 @@ +/* eslint-disable @next/next/no-img-element -- External or generated image URLs; next/image migration is out of scope. */ import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import dynamic from 'next/dynamic'; @@ -10,7 +11,8 @@ const CardEditor = () => { const { id } = router.query; const [card, setCard] = useState(null); - const [loading, setLoading] = useState(true); + const [fetchLoading, setFetchLoading] = useState(false); + const loading = id ? fetchLoading : false; const [saving, setSaving] = useState(false); const [message, setMessage] = useState(''); const [searchQuery, setSearchQuery] = useState(''); @@ -38,16 +40,8 @@ const CardEditor = () => { market_price: '' }); - // Load card data if ID is provided - useEffect(() => { - if (id) { - fetchCard(id); - } else { - setLoading(false); - } - }, [id]); - const fetchCard = async (cardId) => { + setFetchLoading(true); try { const response = await fetch(`/api/cards/${cardId}`); if (response.ok) { @@ -78,10 +72,18 @@ const CardEditor = () => { } catch (error) { setMessage('Error loading card: ' + error.message); } finally { - setLoading(false); + setFetchLoading(false); } }; + // Load card data when editing an existing card + useEffect(() => { + if (id) { + // eslint-disable-next-line react-hooks/set-state-in-effect -- load card when route id is set + fetchCard(id); + } + }, [id]); + const searchCards = async (query) => { if (!query.trim()) { setSearchResults([]); diff --git a/pages/admin/card-submissions.js b/pages/admin/card-submissions.js index ed988d4..2d23587 100644 --- a/pages/admin/card-submissions.js +++ b/pages/admin/card-submissions.js @@ -30,6 +30,7 @@ function CardSubmissionsAdmin() { }; useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect -- mount fetch; setLoading runs inside async loader loadSubmissions(); }, []); diff --git a/pages/card/[id].js b/pages/card/[id].js index 65ee3c9..605d4a9 100644 --- a/pages/card/[id].js +++ b/pages/card/[id].js @@ -1,4 +1,5 @@ -import { useState, useEffect } from 'react'; +/* eslint-disable @next/next/no-img-element -- External or generated image URLs; next/image migration is out of scope. */ +import { useState, useEffect, useMemo } from 'react'; import { useRouter } from 'next/router'; import Layout from '../../components/Layout'; import { useAuth } from '../../lib/use-auth'; @@ -164,6 +165,18 @@ export default function CardDetail() { return particleCounts[rarityKey] || 0; }; + const particleStyles = useMemo(() => { + if (!card) return []; + const count = getParticleCount(card.rarity); + return Array.from({ length: count }, (_, i) => ({ + left: `${((i * 37) % 100)}%`, + top: `${((i * 53) % 100)}%`, + animationDelay: `${i % 3}s`, + animationDuration: `${3 + (i % 2)}s`, + })); + // eslint-disable-next-line react-hooks/exhaustive-deps -- stable decorative layout per card id/rarity + }, [card?.id, card?.rarity]); + const getParticleColor = (rarity) => { const rarityKey = rarity?.toLowerCase(); const colors = { @@ -355,7 +368,7 @@ export default function CardDetail() { Card Not Found
- The card you're looking for doesn't exist. + The card you're looking for doesn't exist.