send-gift: cuadrícula de objetos 4/fila centrada + paginación
Aplana el catálogo y lo pagina (8 por página = 2 filas de 4) con controles Atrás / 1 2 3 / Siguiente centrados. Nuevas clases .gift-grid (grid 4 cols, responsive a 2 en móvil) y .gift-pagination en novawow-style.css. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -65,6 +65,17 @@ export function SendGiftForm({
|
||||
[cart],
|
||||
)
|
||||
|
||||
// Catálogo aplanado y paginado: 4 objetos por fila, 2 filas (8) por página.
|
||||
const PAGE_SIZE = 8
|
||||
const allItems = useMemo(
|
||||
() => catalog.flatMap((c) => c.items.map((it) => ({ ...it, category: c.name }))),
|
||||
[catalog],
|
||||
)
|
||||
const [page, setPage] = useState(1)
|
||||
const totalPages = Math.max(1, Math.ceil(allItems.length / PAGE_SIZE))
|
||||
const currentPage = Math.min(page, totalPages)
|
||||
const pageItems = allItems.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE)
|
||||
|
||||
function addItem(item: GiftItem) {
|
||||
setCart((prev) => {
|
||||
const next = new Map(prev)
|
||||
@@ -158,34 +169,45 @@ export function SendGiftForm({
|
||||
<SecretInput value={token} onChange={setToken} placeholder="Token de seguridad" />
|
||||
<hr />
|
||||
|
||||
{/* Catálogo de objetos */}
|
||||
<div className="justified">
|
||||
{catalog.map((cat) => (
|
||||
<div key={cat.id}>
|
||||
<h3 className="first-brown">{cat.name}</h3>
|
||||
<div>
|
||||
{cat.items.map((it) => (
|
||||
<div className="item-box" key={it.id}>
|
||||
<a
|
||||
href={`https://www.wowhead.com/wotlk/item=${it.itemId}`}
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
<img className="item-img-box" src={it.imageUrl} alt={it.name} />
|
||||
</a>
|
||||
<div className="item-name second-brown">{it.name}</div>
|
||||
<div className="yellow-info">
|
||||
{it.price} {currency}
|
||||
</div>
|
||||
<button type="button" className="store-add-button" onClick={() => addItem(it)}>
|
||||
Añadir
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
{/* Catálogo de objetos: cuadrícula centrada de 4 por fila + paginación */}
|
||||
<h3 className="first-brown centered">Objetos disponibles</h3>
|
||||
<div className="gift-grid">
|
||||
{pageItems.map((it) => (
|
||||
<div className="item-box" key={it.id}>
|
||||
<a href={`https://www.wowhead.com/wotlk/item=${it.itemId}`} target="_blank" rel="noreferrer noopener">
|
||||
<img className="item-img-box" src={it.imageUrl} alt={it.name} />
|
||||
</a>
|
||||
<div className="third-brown" style={{ fontSize: '12px' }}>{it.category}</div>
|
||||
<div className="item-name second-brown">{it.name}</div>
|
||||
<div className="yellow-info">
|
||||
{it.price} {currency}
|
||||
</div>
|
||||
<button type="button" className="store-add-button" onClick={() => addItem(it)}>
|
||||
Añadir
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
{totalPages > 1 && (
|
||||
<div className="gift-pagination">
|
||||
<button type="button" onClick={() => setPage((p) => Math.max(1, Math.min(totalPages, p) - 1))} disabled={currentPage === 1}>
|
||||
Atrás
|
||||
</button>
|
||||
{Array.from({ length: totalPages }, (_, i) => i + 1).map((n) => (
|
||||
<button
|
||||
type="button"
|
||||
key={n}
|
||||
className={n === currentPage ? 'active-page' : ''}
|
||||
onClick={() => setPage(n)}
|
||||
>
|
||||
{n}
|
||||
</button>
|
||||
))}
|
||||
<button type="button" onClick={() => setPage((p) => Math.min(totalPages, Math.min(totalPages, p) + 1))} disabled={currentPage === totalPages}>
|
||||
Siguiente
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
<hr />
|
||||
|
||||
{/* Carrito */}
|
||||
|
||||
Reference in New Issue
Block a user