# 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`