76 lines
3.5 KiB
Markdown
76 lines
3.5 KiB
Markdown
# Arjmand Pharmacy — AI context
|
||
|
||
Persian RTL pharmacy storefront for **arjmandpharmacy.com** (داروخانه دکتر ارجمند). Next.js App Router.
|
||
|
||
## Meshkee API
|
||
|
||
- Docs: https://api.meshkee.com/docs/website
|
||
- OpenAPI: https://api.meshkee.com/docs/website/openapi.json
|
||
- Base: `https://api.meshkee.com/api/v1`
|
||
- Tenant domain: `arjmandpharmacy.com` (`NEXT_PUBLIC_WEBSITE_DOMAIN` / `WEBSITE_DOMAIN` / `NEXT_PUBLIC_MESHKEE_DOMAIN`)
|
||
- Customer portal: `https://customer.arjmandpharmacy.com` (`NEXT_PUBLIC_CUSTOMER_PORTAL_URL`)
|
||
- Public reads: `/tenants/{domain}/...` (no auth). Cart/orders/favorites: `/businesses/{businessId}/...` + Bearer JWT.
|
||
- Do not invent CMS, upload, or dashboard APIs.
|
||
|
||
Login / user icon (and add-to-cart if not logged in) go to the customer portal. Do not build a local login page.
|
||
|
||
## Routes
|
||
|
||
| Path | Source |
|
||
| --- | --- |
|
||
| `/` | Homepage + static image slots + store specials + latest blogs |
|
||
| `/products` | Store items (`GET /tenants/{domain}/store-items`) |
|
||
| `/products?categoryId=` | Same, filtered |
|
||
| `/products/[variantId]` | Store item variant + product description/gallery + comments |
|
||
| `/blog` | `GET /tenants/{domain}/blogs` |
|
||
| `/blog/[slug]` | Blog details |
|
||
| `/meshkee/static-image-slots` | Slot catalog for the dashboard Refresh button |
|
||
| `/api/search?q=` | Instant store-item search (`name`, min 3 chars) |
|
||
| `/api/cart/items` | Proxies authenticated add-to-cart |
|
||
|
||
## Homepage carousels (store specials)
|
||
|
||
`GET /tenants/{domain}/store-specials` matched by `key`:
|
||
|
||
1. `special-sale`
|
||
2. `multi-vitamin`
|
||
3. `body-building-supplement`
|
||
|
||
If a special has no `items`, keep the current sample products. Use `variants[0].id` as the product URL.
|
||
|
||
## Catalog
|
||
|
||
- Mega menu: product categories **level 1 and 2** (`GET /tenants/{domain}/categories?entityType=product`). Links: `/products?categoryId={id}`.
|
||
- Instant search: header input, activate when query length **> 2**, `store-items?name=`.
|
||
- Details gallery: product `images[].url` + thumbnail. Click = lightbox, hover = zoom.
|
||
- Details tabs: description (`descriptionHtml`) and comments (`GET /comments?entityType=product&entityId={productId}`). Unauthenticated users see a login box to the customer portal.
|
||
- Add to cart: `POST /businesses/{businessId}/cart/items` with `{ storeItemVariantId, quantity }`. No token → customer portal.
|
||
|
||
## Static image slots
|
||
|
||
Homepage images: `GET /tenants/{domain}/website/static-images?pageKey=home`. Catalog: `GET /meshkee/static-image-slots`.
|
||
|
||
| key | kind | itemCount |
|
||
| --- | --- | --- |
|
||
| `slider` | list | null |
|
||
| `two-banner-below-slider` | list | 2 |
|
||
| `categories` | list | null |
|
||
| `two-banner-row` | list | 2 |
|
||
| `three-banner-row` | list | 3 |
|
||
| `about-us-image` | single | 1 |
|
||
|
||
`url` → img, `linkUrl` → wrap in a link, empty/fail → placeholder. Use `slot.aspectRatio`. If a slot’s size/ratio changes in CSS, update `STATIC_IMAGE_SLOTS` in `lib/static-images.ts` in the same change.
|
||
|
||
## Tags & badges
|
||
|
||
`GET /tenants/{domain}/website/business-info`
|
||
|
||
- `metaTags`: `[{ name, content }]` emitted once from root `generateMetadata` as `other`. Empty → omit.
|
||
- `trustBadges`: `[{ kind: "enamad" | "samandehi", embedHtml }]` rendered in the footer with `dangerouslySetInnerHTML`. Empty → omit. Do not hardcode eNamad or Samandehi placeholders.
|
||
|
||
## Local fallbacks
|
||
|
||
- Slider: `src/assets/images/slides`, else `/placeholders/slider-*.svg`
|
||
- Logo: `src/assets/images/logo`, else `/placeholders/logo.svg`
|
||
- Other art / empty catalog: `/public/placeholders/*.svg` and sample products/posts in `lib/data.ts`
|