mirror of
https://git.meshkee.com/BaloutPastry/website.git
synced 2026-08-11 22:31:01 +04:30
Initial commit of Balout Pastry public website.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+155
@@ -0,0 +1,155 @@
|
||||
# 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`
|
||||
Reference in New Issue
Block a user