/** * When true, the tickets domain is served by the in-memory mock (`apis/mockApi.ts`) behind the `TicketsApi` * seam. * * **Mock is primary this phase.** b15 serves the ticket endpoints (open / list / thread / message), and the * real `clientApi.ts` maps them 1:1 — but the ticket screens depend on **inputs that are themselves * mock-primary** (the f8 bookings a coordination ticket links to only exist client-side under the bookings * mock), and the wire summary lacks `unreadCount`/`lastMessageAt` (**REQ-028**). So the mock is the primary * source: it seeds realistic tickets/threads **with no internal messages** (mimicking the server's user-view * `is_internal` stripping — it even stores an internal admin note that the user view drops, so the * no-leak test is demonstrable), supports the optimistic append, and makes a booking-linked coordination * ticket reachable. Flip to `false` once the upstreams are real — no hook/component change (only the seam * selection in `apis/index.ts`). */ export const USE_TICKETS_MOCK = false; /** Inbox page size (api-conventions `pageSize`, default 50 / max 100). */ export const TICKETS_PAGE_SIZE = 20; /** * The inbox list moves at human speed — a moderate `staleTime` avoids refetching on every revisit but a * mutation (open ticket / post message) invalidates it so a new ticket / new activity shows without a manual * refresh. The **thread is short-lived** (an active conversation) so it revalidates more eagerly. */ export const TICKETS_LIST_STALE_TIME = 30 * 1000; export const TICKET_THREAD_STALE_TIME = 15 * 1000; export const TICKETS_GC_TIME = 5 * 60 * 1000; /** The admin global queue is a live worklist — a short stale window keeps it fresh without hammering. */ export const ADMIN_TICKETS_LIST_STALE_TIME = 20 * 1000; /** * DEV-ONLY trigger for the optimistic-send **failure** path (phase §7 step 2): posting this exact message * body makes the mock throw a `500` so a human can watch the bubble roll back, the draft stay in the * composer, and the retry succeed. Never a product string. */ export const MOCK_SEND_FAIL_SENTINEL = '/fail'; /** * Stable per-role "me" ids for the **mock** world (the real path uses the authenticated `/me` id). The mock * seeds the customer's / nurse's / support's messages with these sender ids; `useTicket` passes * `currentUser?.id ?? MOCK_VIEWER_USER_ID[actorRole]` so a message renders as **mine** in whichever app is * viewing (customer app → the customer's bubbles are mine; nurse app → the nurse's are). The fallback only * fires under mock auth (no `/me` id); on the real path the authenticated id wins and this is dead weight. */ export const MOCK_VIEWER_USER_ID: Record<'customer' | 'nurse' | 'admin', number> = { customer: 7001, nurse: 7015, admin: 7003, };