mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 13:36:48 +00:00
133 lines
5.2 KiB
TypeScript
133 lines
5.2 KiB
TypeScript
import type { TrekWsEventName } from '@trek/shared'
|
|
|
|
/**
|
|
* Client-side handling policy for every event in the shared WS registry
|
|
* (`TREK_WS_EVENTS` in @trek/shared). Together with the tripStore lookups
|
|
* (DEXIE_WRITERS / STATE_APPLIERS in store/slices/remoteEventHandler.ts),
|
|
* these lists partition the registry exactly — the registry-parity test
|
|
* fails if a registry event is missing from all of them, or listed twice.
|
|
* A new server event therefore forces an explicit client decision (handle
|
|
* it, or add it here) instead of being dropped by a silent `default:`.
|
|
*/
|
|
|
|
/**
|
|
* Events consumed by dedicated listeners outside the tripStore reducer.
|
|
* Every entry names real handling code — if that code is removed, remove
|
|
* the entry (the event then needs a new home or an IGNORED_WS_EVENTS slot).
|
|
*/
|
|
export const HANDLED_OUTSIDE_TRIP_STORE = [
|
|
// Tours facet invalidation — hooks/useTripWebSocket forwards tours:changed to
|
|
// useTourPlaceIds so the active trip refreshes its Tours/Places read model.
|
|
'tours:changed',
|
|
// Collab — Collab/MCollab components + useTripWebSocket's collabFileSync
|
|
'collab:note:created',
|
|
'collab:note:updated',
|
|
'collab:note:deleted',
|
|
'collab:link:created',
|
|
'collab:link:updated',
|
|
'collab:link:deleted',
|
|
'collab:poll:created',
|
|
'collab:poll:voted',
|
|
'collab:poll:closed',
|
|
'collab:poll:deleted',
|
|
'collab:message:created',
|
|
'collab:message:reacted',
|
|
'collab:message:deleted',
|
|
// Road trip shaping — components/Roadtrip/useRoadtripVias. The points a drive is
|
|
// routed through live in that hook and nowhere else; a store slice for them would be a
|
|
// second copy of the same list to keep in step.
|
|
'roadtripVia:changed',
|
|
'roadtripTrack:changed',
|
|
'roadtripPreferences:changed',
|
|
// components/Roadtrip/useDayBoundaries reloads the shared boundaries.
|
|
'roadtripBoundary:changed',
|
|
// In-app notifications — hooks/useInAppNotificationListener
|
|
'notification:new',
|
|
'notification:updated',
|
|
// Bag weights (#2191) — content-free ping; components/Packing/usePackingListPanel
|
|
// and mobile/screens/trip/tabs/MPackingListTab re-read the bags on it. It carries
|
|
// no state to apply, which is the point: the totals are summed server-side across
|
|
// members whose items this client may not see.
|
|
'packing:bag-totals',
|
|
// Collections — pages/collections/useCollections ('collections:' prefix listener)
|
|
'collections:updated',
|
|
'collections:accepted',
|
|
'collections:declined',
|
|
'collections:left',
|
|
'collections:deleted',
|
|
'collections:cancelled',
|
|
'collections:removed',
|
|
'collections:invite',
|
|
// Vacay — pages/vacay/useVacay
|
|
'vacay:update',
|
|
'vacay:settings',
|
|
'vacay:accepted',
|
|
'vacay:declined',
|
|
'vacay:cancelled',
|
|
'vacay:dissolved',
|
|
'vacay:invite',
|
|
'vacay:share',
|
|
'vacay:share-removed',
|
|
'vacay:shared-update',
|
|
// Journey — pages/journeyDetail/useJourneyDetail ('journey:' prefix listener)
|
|
'journey:trip:synced',
|
|
'journey:entry:created',
|
|
'journey:entry:updated',
|
|
'journey:entry:deleted',
|
|
'journey:entries:reordered',
|
|
'journey:contributor:changed',
|
|
// Capture times landed after a photo import (#1587); the same listener reloads
|
|
// the journey so the gallery re-sorts.
|
|
'journey:photos:updated',
|
|
// Studio book — components/Studio/useBookStore (its own listener: a client
|
|
// with nothing outstanding takes the new version, one with unsaved edits
|
|
// deliberately does not and conflicts on its next save instead)
|
|
'journey:book:saved',
|
|
// Studio presence — components/Studio/useBookPresence (its own listener:
|
|
// who has the book open, and where their pointers are)
|
|
'journey:book:peers',
|
|
'journey:book:cursor',
|
|
// Document sync: components/Files/docsync/useDocSync re-reads the bindings
|
|
// and their counts, and components/Files/docsync/useDocSyncOffered asks
|
|
// again whether the Files screen offers the sync button. Content-free like
|
|
// the bag ping: what a run changed is per-binding server state, and the
|
|
// files it moved arrive as file:* events.
|
|
'docsync:changed',
|
|
// Booking import — BackgroundTasks/BackgroundTasksWidget ('import:' prefix listener)
|
|
'import:progress',
|
|
'import:done',
|
|
'import:error',
|
|
] as const satisfies readonly TrekWsEventName[]
|
|
|
|
/**
|
|
* Events the client deliberately does not act on today (state of the world
|
|
* when the registry landed — every one of these was already dropped by the
|
|
* old silent `default:` branches). Removing an entry means the event is now
|
|
* handled somewhere; ADDING an entry is a product decision that a new server
|
|
* event should have no client reaction — never add one just to silence the
|
|
* registry-parity test.
|
|
*/
|
|
export const IGNORED_WS_EVENTS = [
|
|
'assignment:participants',
|
|
'packing:reordered',
|
|
'packing:bag-created',
|
|
'packing:bag-updated',
|
|
'packing:bag-deleted',
|
|
'packing:bag-members-updated',
|
|
'packing:assignees',
|
|
'packing:template-applied',
|
|
'todo:assignees',
|
|
'budget:settlement-created',
|
|
'budget:settlement-updated',
|
|
'budget:settlement-deleted',
|
|
'reservation:positions',
|
|
// Accommodations live in page-local planner state; the client refetches
|
|
// them off trip:updated date changes, never off these events.
|
|
'accommodation:created',
|
|
'accommodation:updated',
|
|
'accommodation:deleted',
|
|
'trip:deleted',
|
|
'member:added',
|
|
'member:removed',
|
|
] as const satisfies readonly TrekWsEventName[]
|