Files
baya-monorepo/client/src/services/catalog/constants.ts
T
hamid 99ebf5d881 frontend phase 4: catalog browse (Home A5) & nurse service builder (B7)
Light up the two faces of the configurable service catalog over a new cached
services/catalog domain (consumes the b5 contract; unlocks f6 search).

- services/catalog: types/keys/constants/apis(client+mock+seam)/hooks/index +
  names.ts. Categories & option groups are session-cached reference data
  (Infinity staleTime, like geography); variant mutations invalidate
  myVariantsLists() and setQueryData the edited row. Mock-primary
  (USE_CATALOG_MOCK), one-line swap; mock reproduces the 400 missing-required
  and (nurse,category,option-set) 409 duplicate rules.
- Customer Home (A5): greeting+avatar, search bar (navigates toward f6),
  data-driven category grid (loading/empty/error), patient nudge from the
  cached f2 query. Deferred /search placeholder stub.
- Nurse Services & prices (B7) at /nurse/services: offerings list (active vs
  deactivated, edit, soft-deactivate w/ confirm, reactivate, no delete) and a
  3-step variant builder (category -> required/optional options -> price+unit+
  duration). Required-group gate; Toman->IRR digit-string at the field
  boundary (no float); live unit-aware estimated total (never from price
  alone); editable auto display_name; inline 409 duplicate warning; locked
  category edit form.
- Shared, tested components: CategoryTile, PriceDisplay, VariantCard. Money
  util: tomanToRial + multiplyIrr (integer-safe) + tests.
- i18n: catalog/services/search namespaces + home additions + nav.services
  (both locales, in sync). Icons, routes (SEARCH, NURSE_SERVICES), nurse nav.

Gate: npm run check green; npm run test:ci green (147 tests, +18 across 4
suites); npm run build green with NEXT_PUBLIC_API_URL set.

Docs: client/CLAUDE.md (Project Structure, caching note, namespaces), STATUS,
for-backend REQ-010 (pagination param casing), phase report, mocks registry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 17:33:44 +03:30

25 lines
1.4 KiB
TypeScript

/**
* When true, the catalog domain is served by the in-memory mock (apis/mockApi.ts) behind the
* CatalogApi seam — the b5 `catalog` + `nurse_variants` routes exist, but the mock lets the Home
* grid and the nurse builder (incl. the required-option validation and the duplicate-listing 409)
* demo standalone before the backend is reachable in this environment. Flip to false to hit the
* live endpoints — no hook/component changes (see dev/shared-working-context/reports/mocks-registry.md).
*/
export const USE_CATALOG_MOCK = true;
/**
* Categories and a category's option groups/values are **admin-seeded reference data** that changes
* rarely, so they are cached **for the whole session** (Infinite `staleTime`) exactly like the geo
* hierarchy — fetched once and served from cache across the Home grid and every builder step, never
* refetched per screen. A generous `gcTime` keeps them warm after the last consumer unmounts.
*/
export const CATALOG_REFERENCE_STALE_TIME = Infinity;
export const CATALOG_REFERENCE_GC_TIME = 24 * 60 * 60 * 1000; // 24h
/** The nurse's own offerings change on mutation; keep warm across remounts, invalidate on write. */
export const MY_VARIANTS_STALE_TIME = 60_000;
/** api-conventions default/max page sizes. A nurse has a handful of offerings; categories are few. */
export const CATEGORIES_PAGE_SIZE = 50;
export const MY_VARIANTS_PAGE_SIZE = 50;