Files
website/CONTEXT.md
T

156 lines
4.9 KiB
Markdown

# Balout Pastry — Website (setup context)
Public storefront for شیرینی‌فروشی بلوط. React + Vite SPA that browses products and places orders via the NestJS API. Design matched to [shirinibalout.com](https://www.shirinibalout.com/).
Repo: `https://git.meshkee.com/BaloutPastry/website.git`
API repo: `https://git.meshkee.com/BaloutPastry/backend.git`
Dashboards (customer login / account): `https://git.meshkee.com/BaloutPastry/dashboards.git`
## Stack
- React 19 + TypeScript + Vite 8
- React Router 7
- Lucide icons
- Cart in `localStorage` (`balout.cart`)
- Auth session cookie `balout.auth` (shared with customer dashboard on `*.baloutpastry.com`)
- API client: `src/lib/api.ts``VITE_API_BASE_URL`
## Prerequisites
- Node.js **20+** (LTS recommended)
- npm
- Running **Backend** API on port **3100**
- Optional: customer dashboard on **5173** for login / account (SSO via cookie or hash handoff)
## Setup on a new device
```bash
git clone https://git.meshkee.com/BaloutPastry/website.git
cd website
cp .env.example .env
# Edit if API / customer app URLs differ
npm install
npm run dev
```
Open **http://localhost:5174** (or **http://baloutpastry.com:5174** with local DNS).
### Local hosts (recommended)
Add to `/etc/hosts`:
```
127.0.0.1 baloutpastry.com www.baloutpastry.com
127.0.0.1 admin.baloutpastry.com customer.baloutpastry.com
```
Then:
| App | URL |
|-----|-----|
| Website | `http://baloutpastry.com:5174` |
| Customer dashboard | `http://customer.baloutpastry.com:5173` |
| Admin dashboard | `http://admin.baloutpastry.com:5173` |
| API | `http://localhost:3100/api/v1` |
Backend `CORS_ORIGIN` must include the website origin(s), e.g.
`http://baloutpastry.com:5174,http://www.baloutpastry.com:5174,http://localhost:5174`
### Backend must be up
From the backend repo:
```bash
cp .env.example .env
npm install
npm run db:up
npx prisma migrate deploy
npm run start:dev # http://localhost:3100/api/v1
```
## Scripts
| Command | What it does |
|---------|----------------|
| `npm run dev` | Vite dev server → **http://localhost:5174** |
| `npm run build` | Typecheck + production build → `dist/` |
| `npm run preview` | Serve production build locally |
| `npm run lint` | Oxlint |
## Environment
| Variable | Required | Default | Notes |
|----------|----------|---------|-------|
| `VITE_API_BASE_URL` | no | `http://localhost:3100/api/v1` | Must include `/api/v1` |
| `VITE_CUSTOMER_APP_URL` | no | `http://customer.baloutpastry.com:5173` | Login / profile redirects |
| `VITE_COOKIE_DOMAIN` | no | `.baloutpastry.com` (when on that host) | Shared auth cookie domain |
Copy from `.env.example`. Do **not** commit `.env`.
After changing env vars, restart `npm run dev`.
## App routes
| Path | Page |
|------|------|
| `/` | Home (hero, categories, featured products) |
| `/products` | Product list + filters |
| `/products/:slugOrId` | Category by slug **or** product detail by id |
| `/quick-info` | Quick info |
| `/about-us` | About |
| `/contact-us` | Contact |
Cart drawer and toasts are global (not separate routes). Checkout / login hand off to the customer dashboard when needed.
## Auth / cart notes
- Guest browsing and cart work without login
- Session cookie: `balout.auth` (also accepts `#balout_auth=…` hash handoff from customer app)
- Access token sent as `Authorization: Bearer …` on authenticated API calls
- Cart key: `balout.cart` in `localStorage`; change event `balout:cart-change`
- Prices are integer **تومان**
## Project layout
```
src/
App.tsx Routes + shell (Header / Footer / Cart / Toast)
pages/ Home, products, about, contact, quick-info
components/ Header, Footer, CartDrawer, ProductCard, …
lib/
api.ts HTTP client + catalog / checkout helpers
auth.ts Cookie session + customer-app redirects
cart.ts localStorage cart
types.ts Shared types + formatPriceFa
ids.ts cuid vs category-slug detection
```
## Production build
```bash
cp .env.example .env # set real API + customer app URLs
npm ci
npm run build
# Serve dist/ behind nginx/Caddy, or:
npm run preview
```
Set `VITE_*` **before** `npm run build` (they are baked into the bundle).
## Common issues
| Symptom | Likely cause |
|---------|----------------|
| Empty catalog / fetch errors | Backend not running, or wrong `VITE_API_BASE_URL` |
| CORS errors in browser | Backend `CORS_ORIGIN` missing website origin (port **5174**) |
| Port already in use | Another process on **5174** (`strictPort: true`) |
| Login redirect fails | Customer dashboard down, or wrong `VITE_CUSTOMER_APP_URL` |
| Auth not shared across apps | Missing `/etc/hosts` + `VITE_COOKIE_DOMAIN=.baloutpastry.com` |
## Related
- Backend setup: clone `BaloutPastry/backend` and read `CONTEXT.md`
- Customer / admin UI: clone `BaloutPastry/dashboards` and read `CONTEXT.md`