@brendanbank/atrium-host-bundle-utils 0.15.3 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -97,8 +97,8 @@ or hosts that want axios-shaped retry).
97
97
 
98
98
  ## Versioning
99
99
 
100
- The package version tracks atrium's image version. Pin `^0.15` for
101
- "compatible with atrium 0.15.x"; bump together with the atrium image
100
+ The package version tracks atrium's image version. Pin `^0.16` for
101
+ "compatible with atrium 0.16.x"; bump together with the atrium image
102
102
  to pick up new registry slots and SDK helpers.
103
103
 
104
104
  ## See also
@@ -91,13 +91,21 @@ export type AtriumLocation = {
91
91
  pathname: string;
92
92
  search: string;
93
93
  hash: string;
94
+ /** Monotonic per-event counter atrium increments on every
95
+ * `atrium:locationchange` dispatch. Use this in effect deps when
96
+ * the effect should re-run on every navigation event, including a
97
+ * re-click of the same href that react-router would otherwise
98
+ * no-op (e.g. clicking the same notification bell item twice — see
99
+ * atrium #81). Without it, `useEffect(…, [search])` stays put
100
+ * because `search` is structurally identical between the two
101
+ * events. Always present from atrium 0.16+; `0` on older images
102
+ * that don't dispatch a nonce. */
103
+ nonce: number;
94
104
  };
95
105
  /** Subscribe to atrium's react-router location changes from inside a
96
- * host bundle's React tree. Returns `{ pathname, search, hash }`
97
- * mirroring `window.location`, and re-renders the calling component
98
- * whenever atrium navigates — including in-place navigations
99
- * (`navigate('/?focus=booking:42')` while already on `/`) where the
100
- * host's wrapper element doesn't remount.
106
+ * host bundle's React tree. Returns `{ pathname, search, hash, nonce }`
107
+ * — the first three mirror `window.location`; `nonce` is a monotonic
108
+ * counter atrium increments on every dispatch.
101
109
  *
102
110
  * Bridges the `atrium:locationchange` CustomEvent atrium dispatches
103
111
  * on `window` through `useSyncExternalStore`, so multiple subscribers
@@ -112,18 +120,80 @@ export type AtriumLocation = {
112
120
  * }
113
121
  * ```
114
122
  *
123
+ * When you want the effect to re-run on **every** navigation event —
124
+ * including the same-URL re-click case (clicking the same notification
125
+ * bell item twice — atrium #81) — include `nonce` in the deps:
126
+ *
127
+ * ```tsx
128
+ * function FocusDrawer() {
129
+ * const { search, nonce } = useAtriumLocation();
130
+ * useEffect(() => {
131
+ * const focus = new URLSearchParams(search).get('focus');
132
+ * if (focus) openDrawer(focus);
133
+ * // Without `nonce` here, React dedupes on `[search]` so a second
134
+ * // click of the same href doesn't re-open the drawer.
135
+ * }, [search, nonce]);
136
+ * }
137
+ * ```
138
+ *
115
139
  * Hosts that don't use React (or want to handle navigation outside a
116
140
  * component) can subscribe directly:
117
141
  * `window.addEventListener('atrium:locationchange', e => …)`. The
118
- * event's `detail` carries the same `{pathname, search, hash}` shape.
119
- *
120
- * Available on atrium 0.15.3+. On older atrium images the hook still
121
- * works but only reflects the initial `window.location` — the SPA
122
- * doesn't dispatch the event, so in-place navigations won't trigger
123
- * updates. Hosts that need to support pre-0.15.3 atrium can read
124
- * `window.__ATRIUM_VERSION__` and fall back to `useLocation()` from a
125
- * wrapper that remounts on route swaps. */
142
+ * event's `detail` carries the same `{pathname, search, hash, nonce}`
143
+ * shape.
144
+ *
145
+ * Available on atrium 0.15.3+; `nonce` lands in 0.16+. On older atrium
146
+ * images the hook still works but only reflects the initial
147
+ * `window.location` (and `nonce` stays at 0). Hosts that need to
148
+ * support pre-0.15.3 atrium can read `window.__ATRIUM_VERSION__` and
149
+ * fall back to `useLocation()` from a wrapper that remounts on route
150
+ * swaps. */
126
151
  export declare function useAtriumLocation(): AtriumLocation;
152
+ /** Programmatic navigate that works from inside a host bundle's React
153
+ * tree, where `useNavigate()` from react-router isn't available
154
+ * (atrium owns the router context; the host tree only meets atrium's
155
+ * at the wrapper element produced by `makeWrapperElement`).
156
+ *
157
+ * Returns a stable `navigate(href, opts?)` function that updates the
158
+ * URL via `pushState` / `replaceState` and re-syncs atrium's
159
+ * react-router by dispatching a synthesized `popstate`. Atrium then
160
+ * fires its own `atrium:locationchange` so other host listeners
161
+ * observe the change.
162
+ *
163
+ * The primary use case is **cleaning up a deep-link query param after
164
+ * the host has consumed it** — a flow that previously had no host-
165
+ * observable solution (a raw `history.replaceState` desyncs atrium's
166
+ * router from the browser URL). See atrium #81.
167
+ *
168
+ * ```tsx
169
+ * function FocusDrawer() {
170
+ * const { search } = useAtriumLocation();
171
+ * const navigate = useAtriumNavigate();
172
+ * const focus = new URLSearchParams(search).get('focus');
173
+ * return focus ? (
174
+ * <Drawer
175
+ * opened
176
+ * onClose={() => {
177
+ * // Strip the param so a second click of the same bell item
178
+ * // (which navigates to the same href) is a real change from
179
+ * // atrium's perspective and re-fires the locationchange.
180
+ * const next = new URLSearchParams(search);
181
+ * next.delete('focus');
182
+ * navigate(`/?${next.toString()}`, { replace: true });
183
+ * }}
184
+ * >
185
+ * <BookingDetail id={focus} />
186
+ * </Drawer>
187
+ * ) : null;
188
+ * }
189
+ * ```
190
+ *
191
+ * Available since atrium 0.16. The hook works on older images too —
192
+ * it doesn't depend on any atrium-side surface — but on pre-0.16 the
193
+ * resulting `atrium:locationchange` event won't carry a `nonce`. */
194
+ export declare function useAtriumNavigate(): (href: string, opts?: {
195
+ replace?: boolean;
196
+ }) => void;
127
197
  /** Test-only: drop the cached snapshot so the next `getSnapshot` reads
128
198
  * `window.location` fresh. Production code never calls this — the
129
199
  * cache is updated by the event subscription. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,UAAU,kBAAkB;IAC1B,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACrD;AAmBD,MAAM,WAAW,mBAAmB;IAClC;;;kDAG8C;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;sBAGkB;IAClB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;qCAGqC;AACrC,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,gBAAgB,EAChB,QAAQ,GACT,EAAE,mBAAmB,2MAYrB;AAED;;iEAEiE;AACjE,eAAO,MAAM,YAAY,2BAA4B,CAAC;AAmBtD;;;;;;;;8BAQ8B;AAC9B,wBAAgB,KAAK,IAAI,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,CAQ1D;AAED;;iBAEiB;AACjB,wBAAgB,cAAc,IAAI,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,CAEnE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAMnD;AAED;sEACsE;AACtE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED;;;qBAGqB;AACrB,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AA4DF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA8B4C;AAC5C,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED;;kDAEkD;AAClD,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,UAAU,kBAAkB;IAC1B,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACrD;AAmBD,MAAM,WAAW,mBAAmB;IAClC;;;kDAG8C;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;sBAGkB;IAClB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;qCAGqC;AACrC,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,gBAAgB,EAChB,QAAQ,GACT,EAAE,mBAAmB,2MAYrB;AAED;;iEAEiE;AACjE,eAAO,MAAM,YAAY,2BAA4B,CAAC;AAmBtD;;;;;;;;8BAQ8B;AAC9B,wBAAgB,KAAK,IAAI,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,CAQ1D;AAED;;iBAEiB;AACjB,wBAAgB,cAAc,IAAI,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,CAEnE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAMnD;AAED;sEACsE;AACtE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED;;;qBAGqB;AACrB,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;uCAQmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAoEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6Ca;AACb,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAyCqE;AACrE,wBAAgB,iBAAiB,IAAI,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KACzB,IAAI,CAeR;AAED;;kDAEkD;AAClD,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
@@ -125,6 +125,7 @@ const SSR_LOCATION = {
125
125
  pathname: '/',
126
126
  search: '',
127
127
  hash: '',
128
+ nonce: 0,
128
129
  };
129
130
  // Module-level cache so `useSyncExternalStore.getSnapshot` returns a
130
131
  // referentially-stable object across renders — re-creating it every
@@ -139,6 +140,9 @@ function readWindowLocation() {
139
140
  pathname: window.location.pathname,
140
141
  search: window.location.search,
141
142
  hash: window.location.hash,
143
+ // No event has been observed yet, so we have no atrium-supplied
144
+ // nonce. Zero is the documented "no nonce yet" value.
145
+ nonce: 0,
142
146
  };
143
147
  }
144
148
  function getLocationSnapshot() {
@@ -163,6 +167,10 @@ function subscribeLocation(onChange) {
163
167
  pathname: detail.pathname,
164
168
  search: detail.search,
165
169
  hash: detail.hash,
170
+ // ``nonce`` was added to the event detail in atrium 0.16
171
+ // (#81). Older images dispatch the event without it; default
172
+ // to 0 so the field is always a number.
173
+ nonce: typeof detail.nonce === 'number' ? detail.nonce : 0,
166
174
  };
167
175
  }
168
176
  else {
@@ -174,11 +182,9 @@ function subscribeLocation(onChange) {
174
182
  return () => window.removeEventListener(ATRIUM_LOCATION_EVENT, handler);
175
183
  }
176
184
  /** Subscribe to atrium's react-router location changes from inside a
177
- * host bundle's React tree. Returns `{ pathname, search, hash }`
178
- * mirroring `window.location`, and re-renders the calling component
179
- * whenever atrium navigates — including in-place navigations
180
- * (`navigate('/?focus=booking:42')` while already on `/`) where the
181
- * host's wrapper element doesn't remount.
185
+ * host bundle's React tree. Returns `{ pathname, search, hash, nonce }`
186
+ * — the first three mirror `window.location`; `nonce` is a monotonic
187
+ * counter atrium increments on every dispatch.
182
188
  *
183
189
  * Bridges the `atrium:locationchange` CustomEvent atrium dispatches
184
190
  * on `window` through `useSyncExternalStore`, so multiple subscribers
@@ -193,20 +199,97 @@ function subscribeLocation(onChange) {
193
199
  * }
194
200
  * ```
195
201
  *
202
+ * When you want the effect to re-run on **every** navigation event —
203
+ * including the same-URL re-click case (clicking the same notification
204
+ * bell item twice — atrium #81) — include `nonce` in the deps:
205
+ *
206
+ * ```tsx
207
+ * function FocusDrawer() {
208
+ * const { search, nonce } = useAtriumLocation();
209
+ * useEffect(() => {
210
+ * const focus = new URLSearchParams(search).get('focus');
211
+ * if (focus) openDrawer(focus);
212
+ * // Without `nonce` here, React dedupes on `[search]` so a second
213
+ * // click of the same href doesn't re-open the drawer.
214
+ * }, [search, nonce]);
215
+ * }
216
+ * ```
217
+ *
196
218
  * Hosts that don't use React (or want to handle navigation outside a
197
219
  * component) can subscribe directly:
198
220
  * `window.addEventListener('atrium:locationchange', e => …)`. The
199
- * event's `detail` carries the same `{pathname, search, hash}` shape.
200
- *
201
- * Available on atrium 0.15.3+. On older atrium images the hook still
202
- * works but only reflects the initial `window.location` — the SPA
203
- * doesn't dispatch the event, so in-place navigations won't trigger
204
- * updates. Hosts that need to support pre-0.15.3 atrium can read
205
- * `window.__ATRIUM_VERSION__` and fall back to `useLocation()` from a
206
- * wrapper that remounts on route swaps. */
221
+ * event's `detail` carries the same `{pathname, search, hash, nonce}`
222
+ * shape.
223
+ *
224
+ * Available on atrium 0.15.3+; `nonce` lands in 0.16+. On older atrium
225
+ * images the hook still works but only reflects the initial
226
+ * `window.location` (and `nonce` stays at 0). Hosts that need to
227
+ * support pre-0.15.3 atrium can read `window.__ATRIUM_VERSION__` and
228
+ * fall back to `useLocation()` from a wrapper that remounts on route
229
+ * swaps. */
207
230
  export function useAtriumLocation() {
208
231
  return useSyncExternalStore(subscribeLocation, getLocationSnapshot, getServerLocationSnapshot);
209
232
  }
233
+ /** Programmatic navigate that works from inside a host bundle's React
234
+ * tree, where `useNavigate()` from react-router isn't available
235
+ * (atrium owns the router context; the host tree only meets atrium's
236
+ * at the wrapper element produced by `makeWrapperElement`).
237
+ *
238
+ * Returns a stable `navigate(href, opts?)` function that updates the
239
+ * URL via `pushState` / `replaceState` and re-syncs atrium's
240
+ * react-router by dispatching a synthesized `popstate`. Atrium then
241
+ * fires its own `atrium:locationchange` so other host listeners
242
+ * observe the change.
243
+ *
244
+ * The primary use case is **cleaning up a deep-link query param after
245
+ * the host has consumed it** — a flow that previously had no host-
246
+ * observable solution (a raw `history.replaceState` desyncs atrium's
247
+ * router from the browser URL). See atrium #81.
248
+ *
249
+ * ```tsx
250
+ * function FocusDrawer() {
251
+ * const { search } = useAtriumLocation();
252
+ * const navigate = useAtriumNavigate();
253
+ * const focus = new URLSearchParams(search).get('focus');
254
+ * return focus ? (
255
+ * <Drawer
256
+ * opened
257
+ * onClose={() => {
258
+ * // Strip the param so a second click of the same bell item
259
+ * // (which navigates to the same href) is a real change from
260
+ * // atrium's perspective and re-fires the locationchange.
261
+ * const next = new URLSearchParams(search);
262
+ * next.delete('focus');
263
+ * navigate(`/?${next.toString()}`, { replace: true });
264
+ * }}
265
+ * >
266
+ * <BookingDetail id={focus} />
267
+ * </Drawer>
268
+ * ) : null;
269
+ * }
270
+ * ```
271
+ *
272
+ * Available since atrium 0.16. The hook works on older images too —
273
+ * it doesn't depend on any atrium-side surface — but on pre-0.16 the
274
+ * resulting `atrium:locationchange` event won't carry a `nonce`. */
275
+ export function useAtriumNavigate() {
276
+ return useCallback((href, opts) => {
277
+ if (typeof window === 'undefined')
278
+ return;
279
+ if (opts?.replace) {
280
+ window.history.replaceState(window.history.state, '', href);
281
+ }
282
+ else {
283
+ window.history.pushState(window.history.state, '', href);
284
+ }
285
+ // React-router's BrowserHistory subscribes to ``popstate`` for
286
+ // back/forward navigation. Synthesizing one here makes it re-read
287
+ // ``window.location`` and update its internal state, which in turn
288
+ // re-renders atrium's NavigationBridge and dispatches a fresh
289
+ // ``atrium:locationchange`` with a new monotonic nonce.
290
+ window.dispatchEvent(new PopStateEvent('popstate'));
291
+ }, []);
292
+ }
210
293
  /** Test-only: drop the cached snapshot so the next `getSnapshot` reads
211
294
  * `window.location` fresh. Production code never calls this — the
212
295
  * cache is updated by the event subscription. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brendanbank/atrium-host-bundle-utils",
3
- "version": "0.15.3",
3
+ "version": "0.16.0",
4
4
  "description": "Runtime helpers, Vite preset, and React hooks for atrium host bundles. Wraps the dual-tree mount pattern, the host-bundle Vite library config, and the /users/me/context hook so a host's main.tsx is ~10 lines of registration calls.",
5
5
  "license": "BSD-2-Clause",
6
6
  "type": "module",
@@ -25,7 +25,7 @@
25
25
  }
26
26
  },
27
27
  "dependencies": {
28
- "@brendanbank/atrium-host-types": "0.15.3"
28
+ "@brendanbank/atrium-host-types": "0.16.0"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@tanstack/react-query": "^5.0.0",