Store Detail
Route: /stores/[id]
File: ayts-fe/app/stores/[id]/page.tsx
Layout: ayts-fe/app/stores/[id]/layout.tsx
Auth required: No (add to cart requires auth)
Purpose
Displays a single store with its full product catalog. This is the primary page where customers discover and add products to their cart.
URL Format
Uses store UUID: /stores/550e8400-e29b-41d4-a716-446655440000
Sections
Store Header
- Store banner image (R2 CDN)
- Store name, category, rating, total reviews
- Operating hours
- Location / address
- "Follow" button (future feature)
Product Grid
- All available products for this store
- Displays: product image, name, price (₱), stock indicator
- Add to cart button (increments quantity if already in cart)
- Product card links to
/stores/[id]/products/[productId]
Store Reviews
- Star rating overview (average + distribution)
- Customer review list (paginated)
- "Write a Review" button (auth required)
Data Fetching
// Store details
GET /api/stores/{id}
// Store products
GET /api/products?storeId={id}&status=available
// Store reviews
GET /api/reviews/store/{id}?limit=10&offset=0
Page uses ISR: next: { revalidate: 300 } (5-minute cache).
SEO
The layout.tsx generates dynamic OG meta:
export async function generateMetadata({ params }) {
const store = await getStore(params.id);
return {
title: `${store.name} — AYTS`,
description: store.description,
openGraph: { images: [store.bannerUrl] },
};
}
Key Components
| Component | File |
|---|---|
| Store header + product grid | app/stores/[id]/components/ |
| Cart integration | lib/api.ts → addToCart() |
| Review form | components/review-form.tsx |
Cart Integration
// When customer clicks "Add to Cart"
await api.addToCart({
productId: product.id,
storeId: storeId,
quantity: 1,
});
Known Issues / Status
| Item | Status |
|---|---|
| Store loads by UUID | ✅ Working |
| Products displayed | ✅ Working |
| Add to cart | ✅ Working (productId mapping fixed) |
| OG meta for SEO | ✅ Working |
| ISR caching | ✅ 5-minute revalidation |
| Reviews display | ✅ Working |
Legacy /store/[id] route | ⚠️ Kept for redirect compatibility |