@stapel/workspaces-react 0.11.0 → 0.11.1
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/CHANGELOG.md +22 -0
- package/dist/model/selection.d.ts.map +1 -1
- package/dist/model/selection.js +15 -5
- package/dist/model/selection.js.map +1 -1
- package/llms.txt +1 -1
- package/manifest.json +1 -1
- package/package.json +3 -3
- package/src/analytics/generated/events.json +1 -1
- package/src/model/selection.tsx +15 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @stapel/workspaces-react
|
|
2
2
|
|
|
3
|
+
## 0.11.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 212a198: `useWorkspaceSelection` now really does return a stable bag.
|
|
8
|
+
|
|
9
|
+
The memoisation was there but two of its dependencies were TanStack result
|
|
10
|
+
objects — `useWorkspaces()`'s query and `useSetPreferredWorkspace()`'s
|
|
11
|
+
mutation — and TanStack returns a NEW object on every render. So `refetch`
|
|
12
|
+
and `switchTo` changed identity every render, and the bag with them.
|
|
13
|
+
|
|
14
|
+
That is exactly the #251 failure the memoisation exists to prevent:
|
|
15
|
+
consumers put `current` straight into `useEffect` dependency arrays, so an
|
|
16
|
+
unstable bag re-runs those effects every render, and where the effect also
|
|
17
|
+
sets state it is an unbounded render loop whose only symptom is a spinner
|
|
18
|
+
that never resolves, with nothing in the console. The hooks now close over
|
|
19
|
+
the stable `refetch` / `mutate` handles, and a regression test pins value
|
|
20
|
+
identity across renders (and pins that it still CHANGES on a real switch).
|
|
21
|
+
|
|
22
|
+
Found by adopting 0.11.0 in a product — the library's own tests asserted the
|
|
23
|
+
resolution, not the identity.
|
|
24
|
+
|
|
3
25
|
## 0.11.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/model/selection.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAW,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;6EAE6E;AAC7E,MAAM,MAAM,wBAAwB,GAChC,KAAK,GACL,OAAO,GACP,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,YAAY,CAAC;AAEjB;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC;;;;;;;;;OASG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KACpE,IAAI,CAAC;CACX;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAC1C;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kCAAkC;IAClC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAmBD,oDAAoD;AACpD,MAAM,WAAW,+BACf,SAAQ,4BAA4B;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,YAAY,
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/model/selection.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAW,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;6EAE6E;AAC7E,MAAM,MAAM,wBAAwB,GAChC,KAAK,GACL,OAAO,GACP,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,YAAY,CAAC;AAEjB;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC;;;;;;;;;OASG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KACpE,IAAI,CAAC;CACX;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAC1C;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kCAAkC;IAClC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAmBD,oDAAoD;AACpD,MAAM,WAAW,+BACf,SAAQ,4BAA4B;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,YAAY,CAkMd;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAQ1D"}
|
package/dist/model/selection.js
CHANGED
|
@@ -39,7 +39,11 @@ function defaultRepository() {
|
|
|
39
39
|
export function WorkspaceSelectionProvider(props) {
|
|
40
40
|
const { urlWorkspaceId, onUrlWorkspaceChange, children } = props;
|
|
41
41
|
const query = useWorkspaces();
|
|
42
|
-
|
|
42
|
+
// Same rule as `query.refetch` below: TanStack's mutation result is a new
|
|
43
|
+
// object every render, so the stable `mutate` handle is what `switchTo`
|
|
44
|
+
// closes over — depending on the result object would restore the very
|
|
45
|
+
// instability the memoisation exists to remove.
|
|
46
|
+
const savePreferred = useSetPreferredWorkspace().mutate;
|
|
43
47
|
// Built once. `createRepository` registers a logout wipe hook, so calling it
|
|
44
48
|
// per render would register one per render.
|
|
45
49
|
const repoRef = useRef(undefined);
|
|
@@ -166,15 +170,21 @@ export function WorkspaceSelectionProvider(props) {
|
|
|
166
170
|
void repo.set(REPO_KEY, workspaceId).catch(() => undefined);
|
|
167
171
|
// Fire-and-forget: the tab has already switched. A switch that blocks on
|
|
168
172
|
// a flaky network is worse than a preference that lags one click.
|
|
169
|
-
|
|
173
|
+
savePreferred({ workspace_id: workspaceId });
|
|
170
174
|
onUrlWorkspaceChange?.(workspaceId, {
|
|
171
175
|
reason: "switch",
|
|
172
176
|
history: "push",
|
|
173
177
|
});
|
|
174
|
-
}, [workspaces, repo,
|
|
178
|
+
}, [workspaces, repo, savePreferred, onUrlWorkspaceChange]);
|
|
179
|
+
// `query.refetch`, NOT `query`: TanStack returns a NEW result object on every
|
|
180
|
+
// render, so depending on the whole query would make this callback — and
|
|
181
|
+
// therefore the memoised bag below — change identity every render, which is
|
|
182
|
+
// exactly the #251 render-loop this memoisation exists to prevent. The
|
|
183
|
+
// `refetch` handle itself is stable.
|
|
184
|
+
const refetchQuery = query.refetch;
|
|
175
185
|
const refetch = useCallback(async () => {
|
|
176
|
-
await
|
|
177
|
-
}, [
|
|
186
|
+
await refetchQuery();
|
|
187
|
+
}, [refetchQuery]);
|
|
178
188
|
// Memoised, and that is load-bearing rather than a performance nicety
|
|
179
189
|
// (ironmemo #251): consumers put `current` straight into `useEffect`
|
|
180
190
|
// dependency arrays to refetch when the workspace changes. A fresh object
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/model/selection.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAoH1D,MAAM,gBAAgB,GACpB,aAAa,CAA4B,IAAI,CAAC,CAAC;AAEjD,wEAAwE;AACxE,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B;;;;;GAKG;AACH,SAAS,iBAAiB;IACxB,OAAO,gBAAgB,CAAS,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC;AAcD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAsC;IAEtC,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACjE,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,MAAM,
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/model/selection.tsx"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stapel/workspaces-react",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"description": "Headless React flow pair for stapel-workspaces: typed API client, TanStack Query hooks, flow machines, headless components, and i18n keys. Zero visual opinion.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -82,9 +82,9 @@
|
|
|
82
82
|
"size-limit": "^11.2.0",
|
|
83
83
|
"typescript": "^5.8.3",
|
|
84
84
|
"vitest": "^3.2.4",
|
|
85
|
-
"@stapel/showcase": "^0.2.0",
|
|
86
85
|
"@stapel/core": "^0.10.0",
|
|
87
|
-
"@stapel/tokens": "^0.5.0"
|
|
86
|
+
"@stapel/tokens": "^0.5.0",
|
|
87
|
+
"@stapel/showcase": "^0.2.0"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": ">=22"
|
package/src/model/selection.tsx
CHANGED
|
@@ -182,7 +182,11 @@ export function WorkspaceSelectionProvider(
|
|
|
182
182
|
): ReactElement {
|
|
183
183
|
const { urlWorkspaceId, onUrlWorkspaceChange, children } = props;
|
|
184
184
|
const query = useWorkspaces();
|
|
185
|
-
|
|
185
|
+
// Same rule as `query.refetch` below: TanStack's mutation result is a new
|
|
186
|
+
// object every render, so the stable `mutate` handle is what `switchTo`
|
|
187
|
+
// closes over — depending on the result object would restore the very
|
|
188
|
+
// instability the memoisation exists to remove.
|
|
189
|
+
const savePreferred = useSetPreferredWorkspace().mutate;
|
|
186
190
|
|
|
187
191
|
// Built once. `createRepository` registers a logout wipe hook, so calling it
|
|
188
192
|
// per render would register one per render.
|
|
@@ -317,18 +321,24 @@ export function WorkspaceSelectionProvider(
|
|
|
317
321
|
if (repo) void repo.set(REPO_KEY, workspaceId).catch(() => undefined);
|
|
318
322
|
// Fire-and-forget: the tab has already switched. A switch that blocks on
|
|
319
323
|
// a flaky network is worse than a preference that lags one click.
|
|
320
|
-
|
|
324
|
+
savePreferred({ workspace_id: workspaceId });
|
|
321
325
|
onUrlWorkspaceChange?.(workspaceId, {
|
|
322
326
|
reason: "switch",
|
|
323
327
|
history: "push",
|
|
324
328
|
});
|
|
325
329
|
},
|
|
326
|
-
[workspaces, repo,
|
|
330
|
+
[workspaces, repo, savePreferred, onUrlWorkspaceChange]
|
|
327
331
|
);
|
|
328
332
|
|
|
333
|
+
// `query.refetch`, NOT `query`: TanStack returns a NEW result object on every
|
|
334
|
+
// render, so depending on the whole query would make this callback — and
|
|
335
|
+
// therefore the memoised bag below — change identity every render, which is
|
|
336
|
+
// exactly the #251 render-loop this memoisation exists to prevent. The
|
|
337
|
+
// `refetch` handle itself is stable.
|
|
338
|
+
const refetchQuery = query.refetch;
|
|
329
339
|
const refetch = useCallback(async () => {
|
|
330
|
-
await
|
|
331
|
-
}, [
|
|
340
|
+
await refetchQuery();
|
|
341
|
+
}, [refetchQuery]);
|
|
332
342
|
|
|
333
343
|
// Memoised, and that is load-bearing rather than a performance nicety
|
|
334
344
|
// (ironmemo #251): consumers put `current` straight into `useEffect`
|