[PK-43] FE-3 Detail produktu (galéria, ks/kg, akcia, add-to-cart) #7

Merged
forge-admin merged 1 commit from feature/PK-43-product-detail into main 2026-05-16 19:21:29 +00:00
Owner

What

FE-3 detail produktu — route /p/<slug>, galéria, cena (akcia/preškrtnutá), ks/kg stepper, add-to-cart cez POST /api/cart/items, SEO meta + 404.

Files

  • fe/src/app/p/[slug]/page.tsx — server component, revalidate=60, notFound() na 404.
  • fe/src/app/p/[slug]/not-found.tsx — 404 stránka.
  • fe/src/components/product/ProductGallery.tsx — hero + thumbnail switcher, placeholder.
  • fe/src/components/product/ProductDetailAddToCart.tsx — qty stepper (ks/kg), orientačná cena pre kg, POST do košíka, toast event reuse, router.refresh() po úspechu aj po stock_exceeded.
  • fe/src/lib/api.ts — pridaný ProductDetail type + getProductDetail(slug).

Smoke tests (lokálne, docker compose)

  • /p/klobasa-domaca (piece + promo) — strikethrough 5,49 €, effective 4,67 €, badge Akcia, POST 201 → toast success ✓
  • /p/bravcova-krkovicka (kg) — decimal stepper 0,5, orientačná cena 4,50 €, POST 201 ✓
  • /p/korenie-na-grilovanie po stock=0 → Vypredané badge + disabled button ✓
  • /p/neexistuje → 404 (FE aj BE) ✓
  • POST so qty=9999 → 400 {error:"stock_exceeded", available:100} → toast s množstvom + refresh ✓
  • lint, tsc --noEmit, next build čisté.

Závislosti

  • BE-3 /api/products/<slug> (PK-28) ✓
  • BE-4 /api/cart/items (PK-30) ✓
  • FE-1 layout + Toaster (PK-37) ✓
  • FE-2 toast event masox:toast (PK-41) reuse ✓

Mimo scope

  • Lightbox (mark TODO, gallery iba thumbnail switcher).
  • Smoke slugy /p/akciovy-produkt a /p/vypredane v menovke chýbajú v seed; pokryl som ekvivalentné scenáre cez klobasa-domaca (promo) a korenie-na-grilovanie (manuálne stock=0).

Issue: PK-43

## What FE-3 detail produktu — route `/p/<slug>`, galéria, cena (akcia/preškrtnutá), ks/kg stepper, add-to-cart cez `POST /api/cart/items`, SEO meta + 404. ## Files - `fe/src/app/p/[slug]/page.tsx` — server component, `revalidate=60`, `notFound()` na 404. - `fe/src/app/p/[slug]/not-found.tsx` — 404 stránka. - `fe/src/components/product/ProductGallery.tsx` — hero + thumbnail switcher, placeholder. - `fe/src/components/product/ProductDetailAddToCart.tsx` — qty stepper (ks/kg), orientačná cena pre kg, POST do košíka, toast event reuse, `router.refresh()` po úspechu aj po `stock_exceeded`. - `fe/src/lib/api.ts` — pridaný `ProductDetail` type + `getProductDetail(slug)`. ## Smoke tests (lokálne, docker compose) - `/p/klobasa-domaca` (piece + promo) — strikethrough 5,49 €, effective 4,67 €, badge Akcia, POST 201 → toast success ✓ - `/p/bravcova-krkovicka` (kg) — decimal stepper 0,5, orientačná cena 4,50 €, POST 201 ✓ - `/p/korenie-na-grilovanie` po `stock=0` → Vypredané badge + disabled button ✓ - `/p/neexistuje` → 404 (FE aj BE) ✓ - POST so `qty=9999` → 400 `{error:"stock_exceeded", available:100}` → toast s množstvom + refresh ✓ - `lint`, `tsc --noEmit`, `next build` čisté. ## Závislosti - BE-3 `/api/products/<slug>` (PK-28) ✓ - BE-4 `/api/cart/items` (PK-30) ✓ - FE-1 layout + Toaster (PK-37) ✓ - FE-2 toast event `masox:toast` (PK-41) reuse ✓ ## Mimo scope - Lightbox (mark TODO, gallery iba thumbnail switcher). - Smoke slugy `/p/akciovy-produkt` a `/p/vypredane` v menovke chýbajú v seed; pokryl som ekvivalentné scenáre cez `klobasa-domaca` (promo) a `korenie-na-grilovanie` (manuálne `stock=0`). Issue: PK-43
Route /p/[slug] (server component, revalidate=60, notFound() na 404)
fetch GET /api/products/<slug>.

- ProductGallery — hero + thumbnail switcher, placeholder ak prázdne images.
- Cena: effective_price v brand-primary, original_price preškrtnutá ak active_promotion, badge Akcia s názvom promo v title/aria-label.
- ProductDetailAddToCart:
  * unit=piece: integer stepper −/+, min 1, max stock, default 1.
  * unit=kg: decimal stepper step=0.1, min=0.1, max=stock, default 0.5; pod inputom orientačná cena qty × effective_price (sk-SK €).
- Pridať do košíka volá POST /api/cart/items, na 2xx toast success + router.refresh()
  (header cart counter sa updatne). Na 400 stock_exceeded toast s available + router.refresh().
- in_stock=false → badge Vypredané, button disabled.
- SEO: title `<product.name> — MASOX` (absolute), description orezaný na ~155 znakov, OG image z prvého obrázka galérie.
- not-found.tsx pre /p/[slug] route.

Co-authored-by: multica-agent <github@multica.ai>
forge-admin deleted branch feature/PK-43-product-detail 2026-05-16 19:21:30 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forge-admin/masox-eshop!7
No description provided.