mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-21 06:26:26 +00:00
35befb4235
The walk's detail opened from a day lists its stops in order, each with its stay, importance and protection, and marks one visited or skipped for that day, or takes it back. The day row shows how many were visited. Marks reach the other travellers at once and change no route, place or order; a copy or another day starts with none.
138 lines
5.6 KiB
TypeScript
138 lines
5.6 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',
|
|
// CW-03 — components/Tours/walk/useTourVisitsSync keeps the visits store current.
|
|
'tours:visits',
|
|
// 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',
|
|
// Linked journal: components/Trips/useTripJournalLink asks again which journal
|
|
// the trip shows and who it is open to. Content-free, because that answer is
|
|
// per person (a member left off the link must not learn its title).
|
|
'trip:journal: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',
|
|
// 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[]
|