Files
baya-monorepo/dev/post-phase/refinement/refinement-phase-4-frontend-de-mock.md
T
2026-07-10 20:59:47 +03:30

153 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Refinement Phase 4 — Frontend de-mock (flip every domain to the real backend)
> **Mission:** make the frontend actually call the backend. Today 21 of 22 client service domains default to an
> in-browser mock (`USE_*_MOCK = true`), so the running app is almost entirely fake data. Each domain's real
> `clientApi` already exists and maps the live routes 1:1 — the swap is a **one-line flag flip per domain**,
> once that domain's REQ gaps ([Phase 3](refinement-phase-3-contract-batch.md)) are delivered and the demo data
> ([Phase 1](refinement-phase-1-database-and-seed.md)) exists. This phase flips them, in dependency order, and
> verifies each against the real API.
>
> **Track:** frontend · **Depends on:** [Phase 1](refinement-phase-1-database-and-seed.md),
> [Phase 2](refinement-phase-2-auth-and-role-nav.md), [Phase 3](refinement-phase-3-contract-batch.md) ·
> **Unlocks:** a genuinely integrated app
> **Before you start, read [../../phases/_shared/agent-operating-rules.md](../../phases/_shared/agent-operating-rules.md).**
## 1. Context — where this sits
The frontend was deliberately built **mock-primary** so each phase could ship before its backend counterpart
merged. Every domain follows the same seam: `services/{domain}/apis/index.ts` picks `mockApi` vs `clientApi`
from a compile-time `USE_{DOMAIN}_MOCK` constant in `constants.ts`; the `clientApi` already wraps `clientFetch`
and unwraps the `ApiResult` envelope. The design intent, recorded in every phase report and the mocks-registry,
is: **deliver the REQ → flip the flag → the domain is real, with no hook/component change.**
This phase executes that flip for every domain. The order matters because the domains form a funnel — a domain
whose *inputs* are still mocked can't meaningfully go real (e.g. `bookingRequests` needs `search`/`patients`/
`addresses` real first). Auth is already real and is the template.
**Note on flags:** the `USE_*_MOCK` constants are **hard-coded literals**, not env vars. Flipping means editing
the `constants.ts` line to `false`. Consider (optional, small) refactoring each to read
`process.env.NEXT_PUBLIC_USE_{DOMAIN}_MOCK` with a `false` default so environments can differ without code
edits — but the minimum deliverable is the flags flipped to real.
## 2. Required reading (do this first)
- **`dev/shared-working-context/reports/mocks-registry.md`** → the "Frontend client-side mocks" table. Every
row lists the flag, the file, and the exact "Make it real →" precondition (which REQ + which upstream domain).
This is your checklist.
- `client/CLAUDE.md` → "services/" section (the per-domain descriptions + their REQ gaps).
- `client/src/services/auth/` → the already-real template for how a flipped domain behaves.
- Each domain's `apis/clientApi.ts` (verify the routes it maps against the regenerated
`dev/contracts/openapi/swagger.v1.json` — especially the ones Phase 3 flagged: partner-center **kebab-case**
routes, BNPL `provider_code`, cancellation-policy codes).
- The [Phase 3](refinement-phase-3-contract-batch.md) hand-off (which REQs actually landed) — only flip a
domain whose gaps are delivered.
## 3. Scope — flip these, in this order
Flip each `USE_*_MOCK` to `false` **only after its precondition holds**, then run the domain's screens against
the real backend and fix any real-path shape surprises. Group order mirrors the dependency funnel:
### Group 1 — identity & reference (few/no gaps)
- `USE_GEOGRAPHY_MOCK` — reference lookups; b4 live, **no REQ needed**. Flip early.
- `USE_PATIENTS_MOCK` — needs REQ-005 (relation/conditions).
- `USE_PROFILES_MOCK` — needs REQ-006 (avatar) + REQ-007 (name/language). `uploadAvatar` currently throws 501
until REQ-006.
- `USE_NURSE_BANK_MOCK` — b3 live, **no REQ**. Flip.
- `USE_ADDRESSES_MOCK` — needs REQ-008 (pin) + REQ-009 (provinceId).
- `USE_SERVICE_AREAS_MOCK` — b4 live, **no REQ**. Flip.
### Group 2 — catalog, verification, search (the discovery funnel)
- `USE_CATALOG_MOCK` — b5 live; **data caveat**: a fresh backend has categories but **no option groups** until
Phase 1 seeds them (or the f15 admin authors them). Flip only once option groups exist, or the variant
builder's required-option step is empty.
- `USE_VERIFICATION_MOCK` — needs REQ-011 (credential_details) + REQ-034 (admin queue/doc-URL/approve).
- `USE_SEARCH_MOCK` — needs REQ-012 (name/avatar/distance + public profile). **The linchpin of the funnel.**
### Group 3 — booking funnel
- `USE_BOOKING_REQUESTS_MOCK` — needs REQ-013/014 **and** search/patients/addresses real (Groups 12).
- `USE_BOOKINGS_MOCK` — a booking only exists after a paid request converts, so needs booking-requests +
payment real. Also set `NEXT_PUBLIC_EVV_MOCK_GPS=off` to use real `navigator.geolocation`.
- `USE_PAYMENT_MOCK` — needs REQ-016 (checkout summary) + REQ-017 (outcome/bookingId) + REQ-018 (invoice) and
the upstream request flow real. Delete the dev mock-gateway harness page once flipped.
### Group 4 — money reversal & post-booking
- `USE_REFUNDS_MOCK` — needs REQ-019/020/021 (+ canonical cancellation codes) + REQ-035 (admin).
- `USE_BNPL_MOCK` — needs REQ-022/023/024 (+ the `balinyaar` provider decision) + upstream real. Delete the
BNPL gateway harness page once flipped.
- `USE_PAYOUTS_MOCK` — needs REQ-025 (+ REQ-036 admin).
- `USE_REVIEWS_MOCK` — needs REQ-026 (+ REQ-037 admin `tagCodes`).
- `USE_PATIENT_RECORDS_MOCK` — the nurse visit-note half is already real (b14); the family-record half needs
REQ-027 (**and the product decision** on whether it's a real entity). Flip only the parts that are backed;
keep the family record mocked if the product defers it.
### Group 5 — comms & admin consoles
- `USE_TICKETS_MOCK` — needs REQ-028 + bookings real.
- `USE_NOTIFICATIONS_MOCK` — b1 live; real once upstream domains actually **dispatch** notifications (the
mock exists because nothing dispatches while upstreams are mocked). Flip after Groups 34.
- `USE_ADMIN_MOCK` — needs REQ-029/030/031.
- `USE_PARTNER_MOCK` — needs REQ-032/033 **and** the route-casing reconciliation (verify the kebab-case routes
bind before flipping).
### Cleanup
- Remove the dev-only test harness pages once their domains are real: the payment mock-gateway
(`…/checkout/gateway/page.tsx`) and the BNPL provider-handoff (`…/checkout/bnpl/gateway/page.tsx`) — on the
real path the PSP/provider `redirectUrl` is an absolute URL, so these are never linked.
- Remove the dev-only `__mock*` helpers (`__mockApproveAll`, `__mockPublishSubmittedReview`,
`__mockPushNotification`, etc.) as their domains go real, or keep them behind a dev guard if still useful.
## 4. Mocks & seams in this phase
This phase *retires* mocks. The one client seam that legitimately stays is `ILocationProvider` (EVV GPS
capture) — set `NEXT_PUBLIC_EVV_MOCK_GPS=off` to select the real `navigator.geolocation`. The
`AddressMapPicker` remains a canvas stand-in until a real map widget is inlined (that's a separate design task,
not a data mock).
## 5. Critical rules you must not get wrong
- **Don't flip a domain whose inputs are still mocked** — you'll get empty screens or shape errors. Follow the
group order; a domain is only real if the whole chain beneath it is.
- **Verify each `clientApi`'s routes against the regenerated swagger before flipping** — Phase 3 flagged three
concrete casing/enum mismatches (partner-center kebab-case, BNPL `balinyaar`, cancellation codes). A wrong
route silently 404s.
- **The flip is a flag, not a rewrite.** If a screen needs a hook/component change to work on the real path,
that's a Phase 3 gap that wasn't fully delivered — file/finish the REQ, don't hack the component.
- **`npm run check` and `test:ci` stay green** after each flip; keep `en.json`/`fa.json` in sync (no new
strings expected, but empty/error states may surface copy that was never exercised on the mock path).
- **Real error/empty states now matter.** The mocks always returned tidy data; real endpoints 404/return empty.
Verify each domain's empty, error, and loading states against the real backend — this is where mock-only apps
break.
## 6. Definition of Done
On top of the shared [definition-of-done.md](../../phases/_shared/definition-of-done.md):
- [ ] Every domain whose REQ preconditions are met has `USE_*_MOCK = false` and is verified working against the
real backend; any domain still mocked is because its REQ/product decision is explicitly outstanding
(documented, not forgotten).
- [ ] `npm run check` + `npm run test:ci` green; translations in sync.
- [ ] The full happy path runs on real data end-to-end: log in → browse categories → search → open a nurse
profile → request a booking → nurse accepts → checkout → confirmation → booking detail → review.
- [ ] Dev test-harness pages + `__mock*` helpers for real domains removed or dev-guarded.
- [ ] `client/CLAUDE.md` and the mocks-registry updated to reflect which domains are now real.
## 7. How to test (what a human can verify after this phase)
1. With client + server running on real data (Phases 03 done), open the app and confirm the **Network tab
shows real `/api/v1/*` calls for every screen** (not just auth) — no domain is serving in-browser mock data.
2. Walk the customer funnel: home category grid → search (real seeded nurses) → nurse profile → request →
(switch to the nurse account) accept → (customer) checkout → pay (mock gateway is gone; on a real PSP this
is [Phase 8](refinement-phase-8-external-rails.md), but the request→booking conversion works) → confirmation
→ booking detail.
3. Nurse funnel: verification flow, services builder, coverage, requests inbox, visits/EVV, earnings — all on
real data.
4. Admin: verification queue, refunds, payouts, moderation, config/holidays/audit, partner centers — on real
data with role-gated nav (Phase 2).
5. Confirm empty/error states render correctly where the demo data is sparse (e.g. a nurse with no reviews).
## 8. Hand off & document (close the phase)
- Update `client/CLAUDE.md` "services/" notes and `dev/shared-working-context/reports/mocks-registry.md`
(frontend mocks table) to mark each flipped domain real.
- Report the flip status of all 22 domains (real / still-mocked-because-X) and any real-path surprises found.
Save a memory note on the de-mock order and any domain that needed a Phase-3 follow-up.