@effector-tanstack-query/react 0.3.0 → 0.4.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/dist/index.cjs +300 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -2
- package/dist/index.d.ts +20 -2
- package/dist/index.js +299 -32
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +492 -54
package/dist/index.js
CHANGED
|
@@ -88,9 +88,74 @@ function useInfiniteQuery(query) {
|
|
|
88
88
|
}, [mount, unmount]);
|
|
89
89
|
return { ...state, refresh, fetchNextPage, fetchPreviousPage };
|
|
90
90
|
}
|
|
91
|
+
function useQueries(arg) {
|
|
92
|
+
if (Array.isArray(arg)) {
|
|
93
|
+
return useQueriesTuple(arg);
|
|
94
|
+
}
|
|
95
|
+
return useQueriesFamily(arg);
|
|
96
|
+
}
|
|
97
|
+
function useQueriesTuple(queries) {
|
|
98
|
+
const datas = useUnit(queries.map((q) => q.$data));
|
|
99
|
+
const errors = useUnit(queries.map((q) => q.$error));
|
|
100
|
+
const statuses = useUnit(queries.map((q) => q.$status));
|
|
101
|
+
const isPendings = useUnit(queries.map((q) => q.$isPending));
|
|
102
|
+
const isFetchings = useUnit(queries.map((q) => q.$isFetching));
|
|
103
|
+
const isSuccesses = useUnit(queries.map((q) => q.$isSuccess));
|
|
104
|
+
const isErrors = useUnit(queries.map((q) => q.$isError));
|
|
105
|
+
const isPlaceholderDatas = useUnit(queries.map((q) => q.$isPlaceholderData));
|
|
106
|
+
const fetchStatuses = useUnit(queries.map((q) => q.$fetchStatus));
|
|
107
|
+
const mounts = useUnit(queries.map((q) => q.mounted));
|
|
108
|
+
const unmounts = useUnit(queries.map((q) => q.unmounted));
|
|
109
|
+
const refreshes = useUnit(queries.map((q) => q.refresh));
|
|
110
|
+
React.useEffect(() => {
|
|
111
|
+
for (const m of mounts) m();
|
|
112
|
+
return () => {
|
|
113
|
+
for (const u of unmounts) u();
|
|
114
|
+
};
|
|
115
|
+
}, [queries.length]);
|
|
116
|
+
return queries.map((_, i) => ({
|
|
117
|
+
data: datas[i],
|
|
118
|
+
error: errors[i],
|
|
119
|
+
status: statuses[i],
|
|
120
|
+
isPending: isPendings[i],
|
|
121
|
+
isFetching: isFetchings[i],
|
|
122
|
+
isSuccess: isSuccesses[i],
|
|
123
|
+
isError: isErrors[i],
|
|
124
|
+
isPlaceholderData: isPlaceholderDatas[i],
|
|
125
|
+
fetchStatus: fetchStatuses[i],
|
|
126
|
+
refresh: refreshes[i]
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
function useQueriesFamily(family) {
|
|
130
|
+
const items = useUnit(family.$items);
|
|
131
|
+
const mount = useUnit(family.mounted);
|
|
132
|
+
const unmount = useUnit(family.unmounted);
|
|
133
|
+
const refreshOne = useUnit(family.refreshOne);
|
|
134
|
+
React.useEffect(() => {
|
|
135
|
+
mount();
|
|
136
|
+
return () => unmount();
|
|
137
|
+
}, [mount, unmount]);
|
|
138
|
+
return items.map((it) => ({
|
|
139
|
+
data: it.data,
|
|
140
|
+
error: it.error,
|
|
141
|
+
status: it.status,
|
|
142
|
+
isPending: it.isPending,
|
|
143
|
+
isFetching: it.isFetching,
|
|
144
|
+
isSuccess: it.isSuccess,
|
|
145
|
+
isError: it.isError,
|
|
146
|
+
isPlaceholderData: it.isPlaceholderData,
|
|
147
|
+
fetchStatus: it.fetchStatus,
|
|
148
|
+
// Per-item refresh — routes through the family's `refreshOne(item)`
|
|
149
|
+
// so the consumer doesn't have to thread the source manually.
|
|
150
|
+
refresh: () => refreshOne(it.source)
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
91
153
|
function useObserverRerender(observer) {
|
|
92
154
|
const [, forceRender] = React.useReducer((x) => x + 1, 0);
|
|
93
|
-
React.useEffect(() =>
|
|
155
|
+
React.useEffect(() => {
|
|
156
|
+
if (!observer) return;
|
|
157
|
+
return observer.subscribe(forceRender);
|
|
158
|
+
}, [observer]);
|
|
94
159
|
}
|
|
95
160
|
function useSuspenseQuery(query) {
|
|
96
161
|
const mount = useUnit(query.mounted);
|
|
@@ -102,21 +167,49 @@ function useSuspenseQuery(query) {
|
|
|
102
167
|
}, [mount, unmount]);
|
|
103
168
|
const observer = useSuspenseObserver(query);
|
|
104
169
|
useObserverRerender(observer);
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
170
|
+
const state = useUnit({
|
|
171
|
+
data: query.$data,
|
|
172
|
+
error: query.$error,
|
|
173
|
+
status: query.$status,
|
|
174
|
+
isFetching: query.$isFetching,
|
|
175
|
+
isPlaceholderData: query.$isPlaceholderData,
|
|
176
|
+
fetchStatus: query.$fetchStatus
|
|
177
|
+
});
|
|
178
|
+
if (observer) {
|
|
179
|
+
const result = observer.getOptimisticResult(observer.options);
|
|
180
|
+
if (result.status === "error") throw result.error;
|
|
181
|
+
if (result.status === "pending") {
|
|
182
|
+
throw observer.fetchOptimistic(observer.options);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
data: result.data,
|
|
186
|
+
error: result.error,
|
|
187
|
+
status: "success",
|
|
188
|
+
isPending: false,
|
|
189
|
+
isSuccess: true,
|
|
190
|
+
isError: false,
|
|
191
|
+
isFetching: result.isFetching,
|
|
192
|
+
isPlaceholderData: result.isPlaceholderData,
|
|
193
|
+
fetchStatus: result.fetchStatus,
|
|
194
|
+
refresh
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (state.status === "error") throw state.error;
|
|
198
|
+
if (state.status === "pending") {
|
|
199
|
+
throw new Error(
|
|
200
|
+
"[@effector-tanstack-query/react] useSuspenseQuery: no QueryClient is set. Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] })."
|
|
201
|
+
);
|
|
109
202
|
}
|
|
110
203
|
return {
|
|
111
|
-
data:
|
|
112
|
-
error:
|
|
204
|
+
data: state.data,
|
|
205
|
+
error: state.error,
|
|
113
206
|
status: "success",
|
|
114
207
|
isPending: false,
|
|
115
208
|
isSuccess: true,
|
|
116
209
|
isError: false,
|
|
117
|
-
isFetching:
|
|
118
|
-
isPlaceholderData:
|
|
119
|
-
fetchStatus:
|
|
210
|
+
isFetching: state.isFetching,
|
|
211
|
+
isPlaceholderData: state.isPlaceholderData,
|
|
212
|
+
fetchStatus: state.fetchStatus,
|
|
120
213
|
refresh
|
|
121
214
|
};
|
|
122
215
|
}
|
|
@@ -132,28 +225,71 @@ function useSuspenseInfiniteQuery(query) {
|
|
|
132
225
|
}, [mount, unmount]);
|
|
133
226
|
const observer = useSuspenseObserver(query);
|
|
134
227
|
useObserverRerender(observer);
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
228
|
+
const state = useUnit({
|
|
229
|
+
data: query.$data,
|
|
230
|
+
error: query.$error,
|
|
231
|
+
status: query.$status,
|
|
232
|
+
isFetching: query.$isFetching,
|
|
233
|
+
isPlaceholderData: query.$isPlaceholderData,
|
|
234
|
+
fetchStatus: query.$fetchStatus,
|
|
235
|
+
hasNextPage: query.$hasNextPage,
|
|
236
|
+
hasPreviousPage: query.$hasPreviousPage,
|
|
237
|
+
isFetchingNextPage: query.$isFetchingNextPage,
|
|
238
|
+
isFetchingPreviousPage: query.$isFetchingPreviousPage,
|
|
239
|
+
isFetchNextPageError: query.$isFetchNextPageError,
|
|
240
|
+
isFetchPreviousPageError: query.$isFetchPreviousPageError
|
|
241
|
+
});
|
|
242
|
+
if (observer) {
|
|
243
|
+
const obs = observer;
|
|
244
|
+
const result = obs.getOptimisticResult(obs.options);
|
|
245
|
+
if (result.status === "error") throw result.error;
|
|
246
|
+
if (result.status === "pending") {
|
|
247
|
+
throw obs.fetchOptimistic(obs.options);
|
|
248
|
+
}
|
|
249
|
+
const r = result;
|
|
250
|
+
return {
|
|
251
|
+
data: r.data,
|
|
252
|
+
error: r.error,
|
|
253
|
+
status: "success",
|
|
254
|
+
isPending: false,
|
|
255
|
+
isSuccess: true,
|
|
256
|
+
isError: false,
|
|
257
|
+
isFetching: r.isFetching,
|
|
258
|
+
isPlaceholderData: r.isPlaceholderData,
|
|
259
|
+
fetchStatus: r.fetchStatus,
|
|
260
|
+
hasNextPage: r.hasNextPage,
|
|
261
|
+
hasPreviousPage: r.hasPreviousPage,
|
|
262
|
+
isFetchingNextPage: r.isFetchingNextPage,
|
|
263
|
+
isFetchingPreviousPage: r.isFetchingPreviousPage,
|
|
264
|
+
isFetchNextPageError: r.isFetchNextPageError,
|
|
265
|
+
isFetchPreviousPageError: r.isFetchPreviousPageError,
|
|
266
|
+
refresh,
|
|
267
|
+
fetchNextPage,
|
|
268
|
+
fetchPreviousPage
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (state.status === "error") throw state.error;
|
|
272
|
+
if (state.status === "pending") {
|
|
273
|
+
throw new Error(
|
|
274
|
+
"[@effector-tanstack-query/react] useSuspenseInfiniteQuery: no QueryClient is set. Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] })."
|
|
275
|
+
);
|
|
139
276
|
}
|
|
140
|
-
const r = result;
|
|
141
277
|
return {
|
|
142
|
-
data:
|
|
143
|
-
error:
|
|
278
|
+
data: state.data,
|
|
279
|
+
error: state.error,
|
|
144
280
|
status: "success",
|
|
145
281
|
isPending: false,
|
|
146
282
|
isSuccess: true,
|
|
147
283
|
isError: false,
|
|
148
|
-
isFetching:
|
|
149
|
-
isPlaceholderData:
|
|
150
|
-
fetchStatus:
|
|
151
|
-
hasNextPage:
|
|
152
|
-
hasPreviousPage:
|
|
153
|
-
isFetchingNextPage:
|
|
154
|
-
isFetchingPreviousPage:
|
|
155
|
-
isFetchNextPageError:
|
|
156
|
-
isFetchPreviousPageError:
|
|
284
|
+
isFetching: state.isFetching,
|
|
285
|
+
isPlaceholderData: state.isPlaceholderData,
|
|
286
|
+
fetchStatus: state.fetchStatus,
|
|
287
|
+
hasNextPage: state.hasNextPage,
|
|
288
|
+
hasPreviousPage: state.hasPreviousPage,
|
|
289
|
+
isFetchingNextPage: state.isFetchingNextPage,
|
|
290
|
+
isFetchingPreviousPage: state.isFetchingPreviousPage,
|
|
291
|
+
isFetchNextPageError: state.isFetchNextPageError,
|
|
292
|
+
isFetchPreviousPageError: state.isFetchPreviousPageError,
|
|
157
293
|
refresh,
|
|
158
294
|
fetchNextPage,
|
|
159
295
|
fetchPreviousPage
|
|
@@ -173,15 +309,146 @@ function useSuspenseObserver(query) {
|
|
|
173
309
|
if (!transient) return;
|
|
174
310
|
transient.setOptions({ ...transient.options, queryKey, enabled });
|
|
175
311
|
}, [transient, queryKey, enabled]);
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
312
|
+
return observerInScope ?? transient;
|
|
313
|
+
}
|
|
314
|
+
function useSuspenseQueries(arg) {
|
|
315
|
+
if (Array.isArray(arg)) {
|
|
316
|
+
return useSuspenseQueriesTuple(arg);
|
|
317
|
+
}
|
|
318
|
+
return useSuspenseQueriesFamily(
|
|
319
|
+
arg
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
function useSuspenseQueriesTuple(queries) {
|
|
323
|
+
const mounts = useUnit(queries.map((q) => q.mounted));
|
|
324
|
+
const unmounts = useUnit(queries.map((q) => q.unmounted));
|
|
325
|
+
const refreshes = useUnit(queries.map((q) => q.refresh));
|
|
326
|
+
React.useEffect(() => {
|
|
327
|
+
for (const m of mounts) m();
|
|
328
|
+
return () => {
|
|
329
|
+
for (const u of unmounts) u();
|
|
330
|
+
};
|
|
331
|
+
}, [queries.length]);
|
|
332
|
+
const datas = useUnit(queries.map((q) => q.$data));
|
|
333
|
+
const errors = useUnit(queries.map((q) => q.$error));
|
|
334
|
+
const statuses = useUnit(queries.map((q) => q.$status));
|
|
335
|
+
const isFetchings = useUnit(queries.map((q) => q.$isFetching));
|
|
336
|
+
const isPlaceholderDatas = useUnit(queries.map((q) => q.$isPlaceholderData));
|
|
337
|
+
const fetchStatuses = useUnit(queries.map((q) => q.$fetchStatus));
|
|
338
|
+
const observersInScope = useUnit(queries.map((q) => q.$observer));
|
|
339
|
+
const qcs = useUnit(queries.map((q) => q.$queryClient));
|
|
340
|
+
const resolvedKeys = useUnit(
|
|
341
|
+
queries.map((q) => q.__resolvedKey)
|
|
342
|
+
);
|
|
343
|
+
const enabledStates = useUnit(
|
|
344
|
+
queries.map((q) => q.__enabled)
|
|
345
|
+
);
|
|
346
|
+
const transients = React.useMemo(() => {
|
|
347
|
+
return queries.map((q, i) => {
|
|
348
|
+
if (observersInScope[i]) return null;
|
|
349
|
+
const qc = qcs[i];
|
|
350
|
+
if (!qc) return null;
|
|
351
|
+
return q.__createObserver(qc, {
|
|
352
|
+
queryKey: resolvedKeys[i],
|
|
353
|
+
enabled: enabledStates[i]
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
}, [queries, ...observersInScope, ...qcs, ...resolvedKeys, ...enabledStates]);
|
|
357
|
+
const observers = queries.map(
|
|
358
|
+
(_, i) => observersInScope[i] ?? transients[i] ?? null
|
|
359
|
+
);
|
|
360
|
+
const [, forceRender] = React.useReducer((x) => x + 1, 0);
|
|
361
|
+
React.useEffect(() => {
|
|
362
|
+
const unsubs = observers.map(
|
|
363
|
+
(obs) => obs ? obs.subscribe(forceRender) : null
|
|
180
364
|
);
|
|
365
|
+
return () => {
|
|
366
|
+
for (const u of unsubs) u?.();
|
|
367
|
+
};
|
|
368
|
+
}, [queries.length, ...observers]);
|
|
369
|
+
const liveResults = observers.map(
|
|
370
|
+
(obs) => obs ? obs.getOptimisticResult(obs.options) : null
|
|
371
|
+
);
|
|
372
|
+
for (let i = 0; i < queries.length; i++) {
|
|
373
|
+
const live = liveResults[i];
|
|
374
|
+
if (live) {
|
|
375
|
+
if (live.status === "error") throw live.error;
|
|
376
|
+
} else if (statuses[i] === "error") {
|
|
377
|
+
throw errors[i];
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
const pendingPromises = [];
|
|
381
|
+
for (let i = 0; i < queries.length; i++) {
|
|
382
|
+
const live = liveResults[i];
|
|
383
|
+
const obs = observers[i];
|
|
384
|
+
if (live) {
|
|
385
|
+
if (live.status === "pending" && obs) {
|
|
386
|
+
pendingPromises.push(obs.fetchOptimistic(obs.options));
|
|
387
|
+
}
|
|
388
|
+
} else if (statuses[i] === "pending") {
|
|
389
|
+
throw new Error(
|
|
390
|
+
"[@effector-tanstack-query/react] useSuspenseQueries: no QueryClient is set. Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] })."
|
|
391
|
+
);
|
|
392
|
+
}
|
|
181
393
|
}
|
|
182
|
-
|
|
394
|
+
if (pendingPromises.length > 0) throw Promise.all(pendingPromises);
|
|
395
|
+
return queries.map((_, i) => {
|
|
396
|
+
const live = liveResults[i];
|
|
397
|
+
return {
|
|
398
|
+
data: live ? live.data : datas[i],
|
|
399
|
+
error: live ? live.error : errors[i] ?? null,
|
|
400
|
+
status: "success",
|
|
401
|
+
isPending: false,
|
|
402
|
+
isSuccess: true,
|
|
403
|
+
isError: false,
|
|
404
|
+
isFetching: live ? live.isFetching : isFetchings[i],
|
|
405
|
+
isPlaceholderData: live ? live.isPlaceholderData : isPlaceholderDatas[i],
|
|
406
|
+
fetchStatus: live ? live.fetchStatus : fetchStatuses[i],
|
|
407
|
+
refresh: refreshes[i]
|
|
408
|
+
};
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
function useSuspenseQueriesFamily(family) {
|
|
412
|
+
const mount = useUnit(family.mounted);
|
|
413
|
+
const unmount = useUnit(family.unmounted);
|
|
414
|
+
const refreshOne = useUnit(family.refreshOne);
|
|
415
|
+
React.useEffect(() => {
|
|
416
|
+
mount();
|
|
417
|
+
return () => unmount();
|
|
418
|
+
}, [mount, unmount]);
|
|
419
|
+
const items = useUnit(family.$items);
|
|
420
|
+
const qc = useUnit(family.$queryClient);
|
|
421
|
+
for (const it of items) {
|
|
422
|
+
if (it.status === "error") throw it.error;
|
|
423
|
+
}
|
|
424
|
+
const pending = items.filter((it) => it.status === "pending");
|
|
425
|
+
if (pending.length > 0) {
|
|
426
|
+
if (!qc) {
|
|
427
|
+
throw new Error(
|
|
428
|
+
"[@effector-tanstack-query/react] useSuspenseQueries: no QueryClient is set. Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] })."
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
const queryFor = family.__queryFor;
|
|
432
|
+
throw Promise.all(
|
|
433
|
+
pending.map(
|
|
434
|
+
(it) => qc.fetchQuery(queryFor(it.source)).catch(() => void 0)
|
|
435
|
+
)
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
return items.map((it) => ({
|
|
439
|
+
data: it.data,
|
|
440
|
+
error: it.error,
|
|
441
|
+
status: "success",
|
|
442
|
+
isPending: false,
|
|
443
|
+
isSuccess: true,
|
|
444
|
+
isError: false,
|
|
445
|
+
isFetching: it.isFetching,
|
|
446
|
+
isPlaceholderData: it.isPlaceholderData,
|
|
447
|
+
fetchStatus: it.fetchStatus,
|
|
448
|
+
refresh: () => refreshOne(it.source)
|
|
449
|
+
}));
|
|
183
450
|
}
|
|
184
451
|
|
|
185
|
-
export { HydrationBoundary, useInfiniteQuery, useMutation, useQuery, useSuspenseInfiniteQuery, useSuspenseQuery };
|
|
452
|
+
export { HydrationBoundary, useInfiniteQuery, useMutation, useQueries, useQuery, useSuspenseInfiniteQuery, useSuspenseQueries, useSuspenseQuery };
|
|
186
453
|
//# sourceMappingURL=index.js.map
|
|
187
454
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { useUnit } from 'effector-react'\nimport { hydrate } from '@tanstack/query-core'\nimport type {\n DehydratedState,\n FetchStatus,\n HydrateOptions,\n MutateOptions,\n QueryStatus,\n} from '@tanstack/query-core'\nimport { $queryClient } from '@effector-tanstack-query/core'\nimport type {\n InfiniteQueryResult,\n MutationResult,\n MutationStatus,\n QueryResult,\n} from '@effector-tanstack-query/core'\n\nexport interface HydrationBoundaryProps {\n /**\n * Snapshot produced by `dehydrate(queryClient)` on the server. Re-applied\n * to the scope's `QueryClient` cache so observers mounted under this tree\n * read prefetched data instead of triggering fresh network requests.\n */\n state?: DehydratedState\n /** Forwarded to `hydrate(...)` — see `@tanstack/query-core` docs. */\n options?: HydrateOptions\n children?: React.ReactNode\n}\n\n/**\n * Merges a server-prefetched `DehydratedState` into the scope's\n * `QueryClient` cache.\n *\n * Mirrors `<HydrationBoundary>` from `@tanstack/react-query`: hydration\n * runs in `useMemo` so the merge happens during the render phase (children\n * see a populated cache on their first render, no flash). The hook\n * resolves the QueryClient via `useUnit($queryClient)` instead of\n * `useQueryClient()` — meaning each fork scope can have its own client\n * without an additional `<QueryClientProvider>` in the tree.\n *\n * `hydrate` is idempotent: re-rendering with the same `state` reference\n * is a no-op. Pass new `state` references on navigation to merge fresh\n * snapshots.\n *\n * Note: this only handles the QueryClient cache layer. Effector store\n * snapshots (e.g. `serialize(scope)`) flow through your existing\n * `<Provider>` / `<EffectorNext values>` layer — orthogonal concerns.\n */\nexport function HydrationBoundary({\n state,\n options,\n children,\n}: HydrationBoundaryProps): React.ReactElement {\n const queryClient = useUnit($queryClient)\n React.useMemo(() => {\n if (queryClient && state) hydrate(queryClient, state, options)\n }, [queryClient, state, options])\n return React.createElement(React.Fragment, null, children)\n}\n\nexport interface UseQueryResult<TData, TError = Error> {\n data: TData | undefined\n error: TError | null\n status: QueryStatus\n isPending: boolean\n isFetching: boolean\n isSuccess: boolean\n isError: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n refresh: () => void\n}\n\n/**\n * Subscribes a React component to a query, automatically calling\n * `mounted()` on mount and `unmounted()` on cleanup.\n */\nexport function useQuery<TData, TError = Error>(\n query: QueryResult<TData, TError>,\n): UseQueryResult<TData, TError> {\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isPending: query.$isPending,\n isFetching: query.$isFetching,\n isSuccess: query.$isSuccess,\n isError: query.$isError,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n })\n\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n return { ...state, refresh }\n}\n\nexport interface UseMutationResult<TData, TError, TVariables> {\n data: TData | undefined\n error: TError | null\n status: MutationStatus\n variables: TVariables | undefined\n isPaused: boolean\n isPending: boolean\n isSuccess: boolean\n isError: boolean\n isIdle: boolean\n mutate: (variables: TVariables) => void\n /**\n * Trigger the mutation with per-call callbacks layered on top of the\n * observer-level ones (`onSuccess` / `onError` / `onSettled` in\n * `createMutation` options). Use this for component-local reactions\n * that don't fit module-level `sample` wiring — navigation after success,\n * one-shot toasts, etc.\n */\n mutateWith: (args: {\n variables: TVariables\n onSuccess?: MutateOptions<TData, TError, TVariables>['onSuccess']\n onError?: MutateOptions<TData, TError, TVariables>['onError']\n onSettled?: MutateOptions<TData, TError, TVariables>['onSettled']\n }) => void\n reset: () => void\n}\n\n/**\n * Subscribes a React component to a mutation, automatically calling\n * `start()` on mount and `unmounted()` on cleanup so the queryClient can\n * garbage-collect the mutation entry once no observers remain.\n */\nexport function useMutation<TData = unknown, TError = Error, TVariables = void>(\n mutation: MutationResult<TData, TError, TVariables>,\n): UseMutationResult<TData, TError, TVariables> {\n const state = useUnit({\n data: mutation.$data,\n error: mutation.$error,\n status: mutation.$status,\n variables: mutation.$variables,\n isPaused: mutation.$isPaused,\n isPending: mutation.$isPending,\n isSuccess: mutation.$isSuccess,\n isError: mutation.$isError,\n isIdle: mutation.$isIdle,\n })\n\n const start = useUnit(mutation.start)\n const unmount = useUnit(mutation.unmounted)\n const mutate = useUnit(mutation.mutate)\n const mutateWith = useUnit(mutation.mutateWith)\n const reset = useUnit(mutation.reset)\n\n React.useEffect(() => {\n start()\n return () => unmount()\n }, [start, unmount])\n\n return { ...state, mutate, mutateWith, reset }\n}\n\nexport interface UseInfiniteQueryResult<TData, TError> {\n data: TData | undefined\n error: TError | null\n status: QueryStatus\n isPending: boolean\n isFetching: boolean\n isSuccess: boolean\n isError: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n refresh: () => void\n fetchNextPage: () => void\n fetchPreviousPage: () => void\n}\n\n/**\n * Subscribes a React component to an infinite query, with auto mount/unmount\n * lifecycle and bound `fetchNextPage` / `fetchPreviousPage` callbacks.\n */\nexport function useInfiniteQuery<TData, TError = Error, TPageParam = unknown>(\n query: InfiniteQueryResult<TData, TError, TPageParam>,\n): UseInfiniteQueryResult<TData, TError> {\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isPending: query.$isPending,\n isFetching: query.$isFetching,\n isSuccess: query.$isSuccess,\n isError: query.$isError,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n hasNextPage: query.$hasNextPage,\n hasPreviousPage: query.$hasPreviousPage,\n isFetchingNextPage: query.$isFetchingNextPage,\n isFetchingPreviousPage: query.$isFetchingPreviousPage,\n isFetchNextPageError: query.$isFetchNextPageError,\n isFetchPreviousPageError: query.$isFetchPreviousPageError,\n })\n\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n const fetchNextPage = useUnit(query.fetchNextPage)\n const fetchPreviousPage = useUnit(query.fetchPreviousPage)\n\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n return { ...state, refresh, fetchNextPage, fetchPreviousPage }\n}\n\n// Suspense data path: read from a per-scope observer.\n//\n// The scope mount chain runs in useEffect, which is skipped while a component\n// is suspended — so on the very first render the scope's `$observer` may be\n// null. To get synchronous access to the observer's promise during suspense,\n// we construct a transient observer via the factory's hidden\n// `__createObserver(qc, { queryKey, enabled })` helper. The transient observer\n// reads from / writes to the same queryClient cache as the eventual scope\n// observer (which is created when mountFx runs after useEffect commits).\n//\n// The mount/unmount effect is still wired up so that other consumers reading\n// the same query through `useUnit` / `useQuery` see updates in scope state.\n\nfunction useObserverRerender(observer: {\n subscribe: (cb: () => void) => () => void\n}): void {\n const [, forceRender] = React.useReducer((x: number) => x + 1, 0)\n React.useEffect(() => observer.subscribe(forceRender), [observer])\n}\n\ninterface SuspenseFactory<TObserver> {\n __createObserver(\n qc: import('@tanstack/query-core').QueryClient,\n init: { queryKey: unknown; enabled: boolean },\n ): TObserver\n __resolvedKey: import('effector').Store<unknown>\n __enabled: import('effector').Store<boolean>\n}\n\nexport interface UseSuspenseQueryResult<TData, TError = Error> {\n /** Resolved query data — non-nullable inside the rendered subtree (Suspense\n * absorbed the pending state). */\n data: TData\n /** Always `null` past the Suspense gate; errors are thrown to the nearest\n * `<ErrorBoundary>`. Typed as `TError | null` for consistency with\n * `useQuery` so the same destructure works in both. */\n error: TError | null\n status: 'success'\n isPending: false\n isSuccess: true\n isError: false\n /** `true` while a background refetch is running. Use for refresh spinners. */\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n refresh: () => void\n}\n\n/**\n * Reads a query for use inside a `<Suspense>` boundary. While the query is\n * pending, throws an inflight promise (queryClient-deduplicated). On error,\n * throws the error — catch with `<ErrorBoundary>`. Returns the same shape as\n * `useQuery`, but with `data` narrowed to non-nullable `TData` since the\n * pending state is impossible past the Suspense gate.\n */\nexport function useSuspenseQuery<TData, TError = Error>(\n query: QueryResult<TData, TError>,\n): UseSuspenseQueryResult<TData, TError> {\n // Auto-mount lifecycle so concurrent consumers (useUnit / useQuery) reading\n // the same query through the effector scope stay in sync.\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n const observer = useSuspenseObserver(query)\n\n useObserverRerender(observer)\n\n const result = observer.getOptimisticResult(observer.options as any)\n\n if (result.status === 'error') throw result.error\n if (result.status === 'pending') {\n throw observer.fetchOptimistic(observer.options as any)\n }\n\n // Read all secondary fields from the observer result, not the effector\n // stores: stores are only populated after mountFx fires from useEffect,\n // which on the very first successful render hasn't run yet. The observer\n // result is always live and consistent.\n return {\n data: result.data as TData,\n error: result.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: result.isFetching,\n isPlaceholderData: result.isPlaceholderData,\n fetchStatus: result.fetchStatus,\n refresh,\n }\n}\n\nexport interface UseSuspenseInfiniteQueryResult<TData, TError = Error> {\n data: TData\n error: TError | null\n status: 'success'\n isPending: false\n isSuccess: true\n isError: false\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n refresh: () => void\n fetchNextPage: () => void\n fetchPreviousPage: () => void\n}\n\n/**\n * Suspense variant of {@link useInfiniteQuery}. Same shape as `useInfiniteQuery`,\n * with `data` narrowed to non-nullable.\n */\nexport function useSuspenseInfiniteQuery<\n TData,\n TError = Error,\n TPageParam = unknown,\n>(\n query: InfiniteQueryResult<TData, TError, TPageParam>,\n): UseSuspenseInfiniteQueryResult<TData, TError> {\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n const fetchNextPage = useUnit(query.fetchNextPage)\n const fetchPreviousPage = useUnit(query.fetchPreviousPage)\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n const observer = useSuspenseObserver(query)\n\n useObserverRerender(observer)\n\n const result = observer.getOptimisticResult(observer.options as any)\n\n if (result.status === 'error') throw result.error\n if (result.status === 'pending') {\n throw (\n observer as unknown as {\n fetchOptimistic: (\n options: typeof observer.options,\n ) => Promise<unknown>\n }\n ).fetchOptimistic(observer.options)\n }\n\n const r = result as typeof result & {\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n }\n\n return {\n data: r.data as TData,\n error: r.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: r.isFetching,\n isPlaceholderData: r.isPlaceholderData,\n fetchStatus: r.fetchStatus,\n hasNextPage: r.hasNextPage,\n hasPreviousPage: r.hasPreviousPage,\n isFetchingNextPage: r.isFetchingNextPage,\n isFetchingPreviousPage: r.isFetchingPreviousPage,\n isFetchNextPageError: r.isFetchNextPageError,\n isFetchPreviousPageError: r.isFetchPreviousPageError,\n refresh,\n fetchNextPage,\n fetchPreviousPage,\n }\n}\n\n/**\n * Resolves a per-scope observer for suspense usage. Prefers the scope's\n * `$observer` (set by mountFx); falls back to a transient observer\n * constructed via `__createObserver` so that the very first render — before\n * useEffect has fired — has a working observer. Both flavors read/write the\n * same queryClient cache, so the transient observer is a thin wrapper.\n */\nfunction useSuspenseObserver<\n TQuery extends {\n $observer: import('effector').Store<TObserver | null>\n $queryClient: import('effector').Store<\n import('@tanstack/query-core').QueryClient | null\n >\n },\n TObserver extends {\n options: { queryKey: unknown }\n setOptions(options: any): void\n subscribe(cb: () => void): () => void\n getOptimisticResult(options: any): {\n status: 'pending' | 'success' | 'error'\n data: unknown\n error: unknown\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n // Infinite-query result fields — present at runtime when the underlying\n // observer is an InfiniteQueryObserver; the suspense hooks narrow as\n // needed. Typed as `any` here to keep the constraint loose.\n hasNextPage?: any\n hasPreviousPage?: any\n isFetchingNextPage?: any\n isFetchingPreviousPage?: any\n isFetchNextPageError?: any\n isFetchPreviousPageError?: any\n }\n fetchOptimistic(options: any): Promise<unknown>\n },\n>(query: TQuery): TObserver {\n const factory = query as unknown as TQuery & SuspenseFactory<TObserver>\n const observerInScope = useUnit(query.$observer) as TObserver | null\n const qc = useUnit(query.$queryClient)\n const queryKey = useUnit(factory.__resolvedKey)\n const enabled = useUnit(factory.__enabled)\n\n // Memoize a transient observer keyed by qc, so it survives across renders\n // while the scope observer is null. Once observerInScope appears, we\n // switch — the transient one is unsubscribed and abandoned (it never\n // subscribed to queryCache, so there is nothing to leak).\n const transient = React.useMemo(() => {\n if (observerInScope || !qc) return null\n return factory.__createObserver(qc, { queryKey, enabled })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [observerInScope, qc, factory])\n\n // Keep the transient observer's options in sync with reactive key/enabled,\n // so re-suspending on key changes still works through it.\n React.useEffect(() => {\n if (!transient) return\n transient.setOptions({ ...transient.options, queryKey, enabled })\n }, [transient, queryKey, enabled])\n\n const observer = observerInScope ?? transient\n if (!observer) {\n throw new Error(\n '[@effector-tanstack-query/react] useSuspenseQuery: no QueryClient is set. ' +\n 'Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] }).',\n )\n }\n return observer\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { useUnit } from 'effector-react'\nimport { hydrate } from '@tanstack/query-core'\nimport type {\n DehydratedState,\n FetchStatus,\n HydrateOptions,\n MutateOptions,\n QueryStatus,\n} from '@tanstack/query-core'\nimport { $queryClient } from '@effector-tanstack-query/core'\nimport type {\n InfiniteQueryResult,\n MutationResult,\n MutationStatus,\n QueriesResult,\n QueryResult,\n} from '@effector-tanstack-query/core'\n\nexport interface HydrationBoundaryProps {\n /**\n * Snapshot produced by `dehydrate(queryClient)` on the server. Re-applied\n * to the scope's `QueryClient` cache so observers mounted under this tree\n * read prefetched data instead of triggering fresh network requests.\n */\n state?: DehydratedState\n /** Forwarded to `hydrate(...)` — see `@tanstack/query-core` docs. */\n options?: HydrateOptions\n children?: React.ReactNode\n}\n\n/**\n * Merges a server-prefetched `DehydratedState` into the scope's\n * `QueryClient` cache.\n *\n * Mirrors `<HydrationBoundary>` from `@tanstack/react-query`: hydration\n * runs in `useMemo` so the merge happens during the render phase (children\n * see a populated cache on their first render, no flash). The hook\n * resolves the QueryClient via `useUnit($queryClient)` instead of\n * `useQueryClient()` — meaning each fork scope can have its own client\n * without an additional `<QueryClientProvider>` in the tree.\n *\n * `hydrate` is idempotent: re-rendering with the same `state` reference\n * is a no-op. Pass new `state` references on navigation to merge fresh\n * snapshots.\n *\n * Note: this only handles the QueryClient cache layer. Effector store\n * snapshots (e.g. `serialize(scope)`) flow through your existing\n * `<Provider>` / `<EffectorNext values>` layer — orthogonal concerns.\n */\nexport function HydrationBoundary({\n state,\n options,\n children,\n}: HydrationBoundaryProps): React.ReactElement {\n const queryClient = useUnit($queryClient)\n React.useMemo(() => {\n if (queryClient && state) hydrate(queryClient, state, options)\n }, [queryClient, state, options])\n return React.createElement(React.Fragment, null, children)\n}\n\nexport interface UseQueryResult<TData, TError = Error> {\n data: TData | undefined\n error: TError | null\n status: QueryStatus\n isPending: boolean\n isFetching: boolean\n isSuccess: boolean\n isError: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n refresh: () => void\n}\n\n/**\n * Subscribes a React component to a query, automatically calling\n * `mounted()` on mount and `unmounted()` on cleanup.\n */\nexport function useQuery<TData, TError = Error>(\n query: QueryResult<TData, TError>,\n): UseQueryResult<TData, TError> {\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isPending: query.$isPending,\n isFetching: query.$isFetching,\n isSuccess: query.$isSuccess,\n isError: query.$isError,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n })\n\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n return { ...state, refresh }\n}\n\nexport interface UseMutationResult<TData, TError, TVariables> {\n data: TData | undefined\n error: TError | null\n status: MutationStatus\n variables: TVariables | undefined\n isPaused: boolean\n isPending: boolean\n isSuccess: boolean\n isError: boolean\n isIdle: boolean\n mutate: (variables: TVariables) => void\n /**\n * Trigger the mutation with per-call callbacks layered on top of the\n * observer-level ones (`onSuccess` / `onError` / `onSettled` in\n * `createMutation` options). Use this for component-local reactions\n * that don't fit module-level `sample` wiring — navigation after success,\n * one-shot toasts, etc.\n */\n mutateWith: (args: {\n variables: TVariables\n onSuccess?: MutateOptions<TData, TError, TVariables>['onSuccess']\n onError?: MutateOptions<TData, TError, TVariables>['onError']\n onSettled?: MutateOptions<TData, TError, TVariables>['onSettled']\n }) => void\n reset: () => void\n}\n\n/**\n * Subscribes a React component to a mutation, automatically calling\n * `start()` on mount and `unmounted()` on cleanup so the queryClient can\n * garbage-collect the mutation entry once no observers remain.\n */\nexport function useMutation<TData = unknown, TError = Error, TVariables = void>(\n mutation: MutationResult<TData, TError, TVariables>,\n): UseMutationResult<TData, TError, TVariables> {\n const state = useUnit({\n data: mutation.$data,\n error: mutation.$error,\n status: mutation.$status,\n variables: mutation.$variables,\n isPaused: mutation.$isPaused,\n isPending: mutation.$isPending,\n isSuccess: mutation.$isSuccess,\n isError: mutation.$isError,\n isIdle: mutation.$isIdle,\n })\n\n const start = useUnit(mutation.start)\n const unmount = useUnit(mutation.unmounted)\n const mutate = useUnit(mutation.mutate)\n const mutateWith = useUnit(mutation.mutateWith)\n const reset = useUnit(mutation.reset)\n\n React.useEffect(() => {\n start()\n return () => unmount()\n }, [start, unmount])\n\n return { ...state, mutate, mutateWith, reset }\n}\n\nexport interface UseInfiniteQueryResult<TData, TError> {\n data: TData | undefined\n error: TError | null\n status: QueryStatus\n isPending: boolean\n isFetching: boolean\n isSuccess: boolean\n isError: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n refresh: () => void\n fetchNextPage: () => void\n fetchPreviousPage: () => void\n}\n\n/**\n * Subscribes a React component to an infinite query, with auto mount/unmount\n * lifecycle and bound `fetchNextPage` / `fetchPreviousPage` callbacks.\n */\nexport function useInfiniteQuery<TData, TError = Error, TPageParam = unknown>(\n query: InfiniteQueryResult<TData, TError, TPageParam>,\n): UseInfiniteQueryResult<TData, TError> {\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isPending: query.$isPending,\n isFetching: query.$isFetching,\n isSuccess: query.$isSuccess,\n isError: query.$isError,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n hasNextPage: query.$hasNextPage,\n hasPreviousPage: query.$hasPreviousPage,\n isFetchingNextPage: query.$isFetchingNextPage,\n isFetchingPreviousPage: query.$isFetchingPreviousPage,\n isFetchNextPageError: query.$isFetchNextPageError,\n isFetchPreviousPageError: query.$isFetchPreviousPageError,\n })\n\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n const fetchNextPage = useUnit(query.fetchNextPage)\n const fetchPreviousPage = useUnit(query.fetchPreviousPage)\n\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n return { ...state, refresh, fetchNextPage, fetchPreviousPage }\n}\n\n// =============================================================================\n// useQueries — parallel reads across a static tuple of factories OR a family\n// produced by `createQueries({ source, query })`.\n// =============================================================================\n\ntype UseQueriesTuple = ReadonlyArray<QueryResult<any, any>>\n\n/**\n * Maps a tuple of `QueryResult<TData, TError>` to a tuple of\n * `UseQueryResult<TData, TError>`, preserving per-element types so\n * destructuring (`const [user, posts] = useQueries([...] as const)`)\n * yields fully-typed entries.\n */\nexport type UseQueriesTupleResult<T extends UseQueriesTuple> = {\n [K in keyof T]: T[K] extends QueryResult<infer D, infer E>\n ? UseQueryResult<D, E>\n : never\n}\n\nexport function useQueries<const T extends UseQueriesTuple>(\n queries: T,\n): UseQueriesTupleResult<T>\nexport function useQueries<TItem, TData, TError>(\n family: QueriesResult<TItem, TData, TError>,\n): ReadonlyArray<UseQueryResult<TData, TError>>\nexport function useQueries(\n arg: UseQueriesTuple | QueriesResult<unknown, unknown, unknown>,\n): UseQueriesTupleResult<UseQueriesTuple> | ReadonlyArray<UseQueryResult<unknown, unknown>> {\n if (Array.isArray(arg)) {\n return useQueriesTuple(arg)\n }\n return useQueriesFamily(arg as QueriesResult<unknown, unknown, unknown>)\n}\n\nfunction useQueriesTuple<T extends UseQueriesTuple>(\n queries: T,\n): UseQueriesTupleResult<T> {\n // Twelve `useUnit` calls — count is FIXED, independent of N. The\n // array argument may grow / shrink between renders; effector-react\n // re-subscribes the underlying stores transparently.\n //\n // Rules-of-hooks constraint: the SHAPE of the call list must be\n // stable, not the length of each input array. We satisfy this with a\n // fixed sequence of 9 state-store calls + 3 event-bind calls.\n const datas = useUnit(queries.map((q) => q.$data))\n const errors = useUnit(queries.map((q) => q.$error))\n const statuses = useUnit(queries.map((q) => q.$status))\n const isPendings = useUnit(queries.map((q) => q.$isPending))\n const isFetchings = useUnit(queries.map((q) => q.$isFetching))\n const isSuccesses = useUnit(queries.map((q) => q.$isSuccess))\n const isErrors = useUnit(queries.map((q) => q.$isError))\n const isPlaceholderDatas = useUnit(queries.map((q) => q.$isPlaceholderData))\n const fetchStatuses = useUnit(queries.map((q) => q.$fetchStatus))\n\n const mounts = useUnit(queries.map((q) => q.mounted))\n const unmounts = useUnit(queries.map((q) => q.unmounted))\n const refreshes = useUnit(queries.map((q) => q.refresh))\n\n React.useEffect(() => {\n for (const m of mounts) m()\n return () => {\n for (const u of unmounts) u()\n }\n // The dep on length re-runs mount/unmount when the consumer swaps\n // out the factory set (rare; most consumers pass a stable `as const`\n // literal). Function refs from `useUnit` are stable per (unit, scope)\n // — depending on their array identity would re-fire every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queries.length])\n\n return queries.map((_, i) => ({\n data: datas[i],\n error: errors[i],\n status: statuses[i],\n isPending: isPendings[i],\n isFetching: isFetchings[i],\n isSuccess: isSuccesses[i],\n isError: isErrors[i],\n isPlaceholderData: isPlaceholderDatas[i],\n fetchStatus: fetchStatuses[i],\n refresh: refreshes[i],\n })) as UseQueriesTupleResult<T>\n}\n\nfunction useQueriesFamily<TItem, TData, TError>(\n family: QueriesResult<TItem, TData, TError>,\n): ReadonlyArray<UseQueryResult<TData, TError>> {\n const items = useUnit(family.$items)\n const mount = useUnit(family.mounted)\n const unmount = useUnit(family.unmounted)\n const refreshOne = useUnit(family.refreshOne)\n\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n return items.map((it) => ({\n data: it.data,\n error: it.error,\n status: it.status,\n isPending: it.isPending,\n isFetching: it.isFetching,\n isSuccess: it.isSuccess,\n isError: it.isError,\n isPlaceholderData: it.isPlaceholderData,\n fetchStatus: it.fetchStatus,\n // Per-item refresh — routes through the family's `refreshOne(item)`\n // so the consumer doesn't have to thread the source manually.\n refresh: () => refreshOne(it.source),\n }))\n}\n\n// Suspense data path: read from a per-scope observer.\n//\n// The scope mount chain runs in useEffect, which is skipped while a component\n// is suspended — so on the very first render the scope's `$observer` may be\n// null. To get synchronous access to the observer's promise during suspense,\n// we construct a transient observer via the factory's hidden\n// `__createObserver(qc, { queryKey, enabled })` helper. The transient observer\n// reads from / writes to the same queryClient cache as the eventual scope\n// observer (which is created when mountFx runs after useEffect commits).\n//\n// The mount/unmount effect is still wired up so that other consumers reading\n// the same query through `useUnit` / `useQuery` see updates in scope state.\n\nfunction useObserverRerender(\n observer: { subscribe: (cb: () => void) => () => void } | null,\n): void {\n const [, forceRender] = React.useReducer((x: number) => x + 1, 0)\n React.useEffect(() => {\n if (!observer) return\n return observer.subscribe(forceRender)\n }, [observer])\n}\n\ninterface SuspenseFactory<TObserver> {\n __createObserver(\n qc: import('@tanstack/query-core').QueryClient,\n init: { queryKey: unknown; enabled: boolean },\n ): TObserver\n __resolvedKey: import('effector').Store<unknown>\n __enabled: import('effector').Store<boolean>\n}\n\nexport interface UseSuspenseQueryResult<TData, TError = Error> {\n /** Resolved query data — non-nullable inside the rendered subtree (Suspense\n * absorbed the pending state). */\n data: TData\n /** Always `null` past the Suspense gate; errors are thrown to the nearest\n * `<ErrorBoundary>`. Typed as `TError | null` for consistency with\n * `useQuery` so the same destructure works in both. */\n error: TError | null\n status: 'success'\n isPending: false\n isSuccess: true\n isError: false\n /** `true` while a background refetch is running. Use for refresh spinners. */\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n refresh: () => void\n}\n\n/**\n * Reads a query for use inside a `<Suspense>` boundary. While the query is\n * pending, throws an inflight promise (queryClient-deduplicated). On error,\n * throws the error — catch with `<ErrorBoundary>`. Returns the same shape as\n * `useQuery`, but with `data` narrowed to non-nullable `TData` since the\n * pending state is impossible past the Suspense gate.\n */\nexport function useSuspenseQuery<TData, TError = Error>(\n query: QueryResult<TData, TError>,\n): UseSuspenseQueryResult<TData, TError> {\n // Auto-mount lifecycle so concurrent consumers (useUnit / useQuery) reading\n // the same query through the effector scope stay in sync.\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n const observer = useSuspenseObserver(query)\n useObserverRerender(observer)\n\n // Store snapshot — always read so hook order is fixed across renders.\n // The observer path doesn't use it; the store-only path (server-RSC of\n // a scope rehydrated from `serialize`, where `$observer` and\n // `$queryClient` are both `null` because they're `serialize: 'ignore'`)\n // reads everything from here.\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isFetching: query.$isFetching,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n })\n\n // Observer path: `getOptimisticResult` reads from `QueryCache`\n // synchronously and reflects fetches/refetches the moment the observer\n // notifies. Used whenever we have an in-scope observer\n // (post-`mounted()`) or a transient one built from `$queryClient`.\n if (observer) {\n const result = observer.getOptimisticResult(observer.options as any)\n\n if (result.status === 'error') throw result.error\n if (result.status === 'pending') {\n throw observer.fetchOptimistic(observer.options as any)\n }\n\n return {\n data: result.data as TData,\n error: result.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: result.isFetching,\n isPlaceholderData: result.isPlaceholderData,\n fetchStatus: result.fetchStatus,\n refresh,\n }\n }\n\n // Store-only path: no observer materialisable. Trust `$status` —\n // populated by `prefetchQueries` before the scope was serialised. A\n // pending status here means there's no `QueryClient` and no prefetch\n // happened: can't deduplicate-throw a fetch promise, so surface the\n // misconfiguration as an error to `<ErrorBoundary>`.\n if (state.status === 'error') throw state.error\n if (state.status === 'pending') {\n throw new Error(\n '[@effector-tanstack-query/react] useSuspenseQuery: no QueryClient is set. ' +\n 'Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] }).',\n )\n }\n\n return {\n data: state.data as TData,\n error: state.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: state.isFetching,\n isPlaceholderData: state.isPlaceholderData,\n fetchStatus: state.fetchStatus,\n refresh,\n }\n}\n\nexport interface UseSuspenseInfiniteQueryResult<TData, TError = Error> {\n data: TData\n error: TError | null\n status: 'success'\n isPending: false\n isSuccess: true\n isError: false\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n refresh: () => void\n fetchNextPage: () => void\n fetchPreviousPage: () => void\n}\n\n/**\n * Suspense variant of {@link useInfiniteQuery}. Same shape as `useInfiniteQuery`,\n * with `data` narrowed to non-nullable.\n */\nexport function useSuspenseInfiniteQuery<\n TData,\n TError = Error,\n TPageParam = unknown,\n>(\n query: InfiniteQueryResult<TData, TError, TPageParam>,\n): UseSuspenseInfiniteQueryResult<TData, TError> {\n const mount = useUnit(query.mounted)\n const unmount = useUnit(query.unmounted)\n const refresh = useUnit(query.refresh)\n const fetchNextPage = useUnit(query.fetchNextPage)\n const fetchPreviousPage = useUnit(query.fetchPreviousPage)\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n const observer = useSuspenseObserver(query)\n useObserverRerender(observer)\n\n // See `useSuspenseQuery` for the observer-vs-stores dual path rationale.\n // Infinite queries carry pagination fields in separate effector stores\n // (`$hasNextPage`, `$isFetchingNextPage`, …), so the store snapshot has\n // to read those too.\n const state = useUnit({\n data: query.$data,\n error: query.$error,\n status: query.$status,\n isFetching: query.$isFetching,\n isPlaceholderData: query.$isPlaceholderData,\n fetchStatus: query.$fetchStatus,\n hasNextPage: query.$hasNextPage,\n hasPreviousPage: query.$hasPreviousPage,\n isFetchingNextPage: query.$isFetchingNextPage,\n isFetchingPreviousPage: query.$isFetchingPreviousPage,\n isFetchNextPageError: query.$isFetchNextPageError,\n isFetchPreviousPageError: query.$isFetchPreviousPageError,\n })\n\n if (observer) {\n const obs = observer\n const result = obs.getOptimisticResult(obs.options as any)\n\n if (result.status === 'error') throw result.error\n if (result.status === 'pending') {\n throw (\n obs as unknown as {\n fetchOptimistic: (options: typeof obs.options) => Promise<unknown>\n }\n ).fetchOptimistic(obs.options)\n }\n\n const r = result as typeof result & {\n hasNextPage: boolean\n hasPreviousPage: boolean\n isFetchingNextPage: boolean\n isFetchingPreviousPage: boolean\n isFetchNextPageError: boolean\n isFetchPreviousPageError: boolean\n }\n\n return {\n data: r.data as TData,\n error: r.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: r.isFetching,\n isPlaceholderData: r.isPlaceholderData,\n fetchStatus: r.fetchStatus,\n hasNextPage: r.hasNextPage,\n hasPreviousPage: r.hasPreviousPage,\n isFetchingNextPage: r.isFetchingNextPage,\n isFetchingPreviousPage: r.isFetchingPreviousPage,\n isFetchNextPageError: r.isFetchNextPageError,\n isFetchPreviousPageError: r.isFetchPreviousPageError,\n refresh,\n fetchNextPage,\n fetchPreviousPage,\n }\n }\n\n // Store-only path (server-RSC of a hydrated scope).\n if (state.status === 'error') throw state.error\n if (state.status === 'pending') {\n throw new Error(\n '[@effector-tanstack-query/react] useSuspenseInfiniteQuery: no QueryClient is set. ' +\n 'Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] }).',\n )\n }\n\n return {\n data: state.data as TData,\n error: state.error as TError | null,\n status: 'success',\n isPending: false,\n isSuccess: true,\n isError: false,\n isFetching: state.isFetching,\n isPlaceholderData: state.isPlaceholderData,\n fetchStatus: state.fetchStatus,\n hasNextPage: state.hasNextPage,\n hasPreviousPage: state.hasPreviousPage,\n isFetchingNextPage: state.isFetchingNextPage,\n isFetchingPreviousPage: state.isFetchingPreviousPage,\n isFetchNextPageError: state.isFetchNextPageError,\n isFetchPreviousPageError: state.isFetchPreviousPageError,\n refresh,\n fetchNextPage,\n fetchPreviousPage,\n }\n}\n\n/**\n * Resolves a per-scope observer for suspense usage. Prefers the scope's\n * `$observer` (set by mountFx); falls back to a transient observer\n * constructed via `__createObserver` so that the very first render — before\n * useEffect has fired — has a working observer. Both flavors read/write the\n * same queryClient cache, so the transient observer is a thin wrapper.\n */\nfunction useSuspenseObserver<\n TQuery extends {\n $observer: import('effector').Store<TObserver | null>\n $queryClient: import('effector').Store<\n import('@tanstack/query-core').QueryClient | null\n >\n },\n TObserver extends {\n options: { queryKey: unknown }\n setOptions(options: any): void\n subscribe(cb: () => void): () => void\n getOptimisticResult(options: any): {\n status: 'pending' | 'success' | 'error'\n data: unknown\n error: unknown\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n // Infinite-query result fields — present at runtime when the underlying\n // observer is an InfiniteQueryObserver; the suspense hooks narrow as\n // needed. Typed as `any` here to keep the constraint loose.\n hasNextPage?: any\n hasPreviousPage?: any\n isFetchingNextPage?: any\n isFetchingPreviousPage?: any\n isFetchNextPageError?: any\n isFetchPreviousPageError?: any\n }\n fetchOptimistic(options: any): Promise<unknown>\n },\n>(query: TQuery): TObserver | null {\n const factory = query as unknown as TQuery & SuspenseFactory<TObserver>\n const observerInScope = useUnit(query.$observer) as TObserver | null\n const qc = useUnit(query.$queryClient)\n const queryKey = useUnit(factory.__resolvedKey)\n const enabled = useUnit(factory.__enabled)\n\n // Memoize a transient observer keyed by qc, so it survives across renders\n // while the scope observer is null. Once observerInScope appears, we\n // switch — the transient one is unsubscribed and abandoned (it never\n // subscribed to queryCache, so there is nothing to leak).\n const transient = React.useMemo(() => {\n if (observerInScope || !qc) return null\n return factory.__createObserver(qc, { queryKey, enabled })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [observerInScope, qc, factory])\n\n // Keep the transient observer's options in sync with reactive key/enabled,\n // so re-suspending on key changes still works through it.\n React.useEffect(() => {\n if (!transient) return\n transient.setOptions({ ...transient.options, queryKey, enabled })\n }, [transient, queryKey, enabled])\n\n // Null is a legitimate return: server-RSC render of a scope built from\n // `serialize(scope)` has neither `$observer` nor `$queryClient` (both are\n // `serialize: 'ignore'` — instances can't ride through the RSC boundary).\n // Callers branch on `$status === 'success'` from the serialized stores;\n // they only error out when a pending state is unreachable without an\n // observer to throw `fetchOptimistic` on.\n return observerInScope ?? transient\n}\n\n// =============================================================================\n// useSuspenseQueries — Suspense variant of `useQueries`. Same two overloads:\n// static tuple of factories OR a family from `createQueries(...)`.\n// =============================================================================\n\ntype UseSuspenseQueriesTuple = ReadonlyArray<QueryResult<any, any>>\n\nexport type UseSuspenseQueriesTupleResult<T extends UseSuspenseQueriesTuple> = {\n [K in keyof T]: T[K] extends QueryResult<infer D, infer E>\n ? UseSuspenseQueryResult<D, E>\n : never\n}\n\nexport function useSuspenseQueries<const T extends UseSuspenseQueriesTuple>(\n queries: T,\n): UseSuspenseQueriesTupleResult<T>\nexport function useSuspenseQueries<TItem, TData, TError>(\n family: QueriesResult<TItem, TData, TError>,\n): ReadonlyArray<UseSuspenseQueryResult<TData, TError>>\nexport function useSuspenseQueries(\n arg: UseSuspenseQueriesTuple | QueriesResult<unknown, unknown, unknown>,\n):\n | UseSuspenseQueriesTupleResult<UseSuspenseQueriesTuple>\n | ReadonlyArray<UseSuspenseQueryResult<unknown, unknown>> {\n if (Array.isArray(arg)) {\n return useSuspenseQueriesTuple(arg)\n }\n return useSuspenseQueriesFamily(\n arg as QueriesResult<unknown, unknown, unknown>,\n )\n}\n\nfunction useSuspenseQueriesTuple<T extends UseSuspenseQueriesTuple>(\n queries: T,\n): UseSuspenseQueriesTupleResult<T> {\n // Mount lifecycle (same as `useQueriesTuple`).\n const mounts = useUnit(queries.map((q) => q.mounted))\n const unmounts = useUnit(queries.map((q) => q.unmounted))\n const refreshes = useUnit(queries.map((q) => q.refresh))\n React.useEffect(() => {\n for (const m of mounts) m()\n return () => {\n for (const u of unmounts) u()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queries.length])\n\n // Per-query state from stores — fixed hook count.\n const datas = useUnit(queries.map((q) => q.$data))\n const errors = useUnit(queries.map((q) => q.$error))\n const statuses = useUnit(queries.map((q) => q.$status))\n const isFetchings = useUnit(queries.map((q) => q.$isFetching))\n const isPlaceholderDatas = useUnit(queries.map((q) => q.$isPlaceholderData))\n const fetchStatuses = useUnit(queries.map((q) => q.$fetchStatus))\n\n // Observer / qc / key info per query — same fixed-count pattern.\n const observersInScope = useUnit(queries.map((q) => q.$observer))\n const qcs = useUnit(queries.map((q) => q.$queryClient))\n const resolvedKeys = useUnit(\n queries.map((q) => (q as unknown as SuspenseFactory<unknown>).__resolvedKey),\n )\n const enabledStates = useUnit(\n queries.map((q) => (q as unknown as SuspenseFactory<unknown>).__enabled),\n )\n\n // Transient observers per slot (null when an in-scope observer\n // exists or no qc is available). One useMemo across all queries —\n // hook-count stable.\n const transients = React.useMemo(() => {\n return queries.map((q, i) => {\n if (observersInScope[i]) return null\n const qc = qcs[i]\n if (!qc) return null\n return (q as unknown as SuspenseFactory<any>).__createObserver(qc, {\n queryKey: resolvedKeys[i],\n enabled: enabledStates[i] as boolean,\n })\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queries, ...observersInScope, ...qcs, ...resolvedKeys, ...enabledStates])\n\n type SuspendableObserver = {\n options: { queryKey: unknown }\n subscribe(cb: () => void): () => void\n fetchOptimistic(options: any): Promise<unknown>\n getOptimisticResult(options: any): {\n status: 'pending' | 'success' | 'error'\n data: unknown\n error: unknown\n isFetching: boolean\n isPlaceholderData: boolean\n fetchStatus: FetchStatus\n }\n }\n const observers = queries.map(\n (_, i) =>\n ((observersInScope[i] ?? transients[i]) ?? null) as\n | SuspendableObserver\n | null,\n )\n\n // Subscribe to every live observer in one effect so the consumer\n // re-renders when ANY of them notifies.\n const [, forceRender] = React.useReducer((x: number) => x + 1, 0)\n React.useEffect(() => {\n const unsubs = observers.map((obs) =>\n obs ? obs.subscribe(forceRender) : null,\n )\n return () => {\n for (const u of unsubs) u?.()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queries.length, ...observers])\n\n // Per-slot live result — from observer if available (synchronous\n // QueryCache read), otherwise null and we fall back to the\n // effector-store snapshot. Mirrors the dual path in\n // `useSuspenseQuery` so SSR scopes (`$observer` + `$queryClient`\n // both null) keep working.\n const liveResults = observers.map((obs) =>\n obs ? obs.getOptimisticResult(obs.options) : null,\n )\n\n // Errors first — first error wins.\n for (let i = 0; i < queries.length; i++) {\n const live = liveResults[i]\n if (live) {\n if (live.status === 'error') throw live.error\n } else if (statuses[i] === 'error') {\n throw errors[i]\n }\n }\n\n // Then pending — collect every pending query's inflight promise into\n // a single `Promise.all` thrown to Suspense. The store-only path has\n // no observer to fetch with: that's a misconfiguration (no QC, no\n // prefetch), throw a clear error.\n const pendingPromises: Array<Promise<unknown>> = []\n for (let i = 0; i < queries.length; i++) {\n const live = liveResults[i]\n const obs = observers[i]\n if (live) {\n if (live.status === 'pending' && obs) {\n pendingPromises.push(obs.fetchOptimistic(obs.options))\n }\n } else if (statuses[i] === 'pending') {\n throw new Error(\n '[@effector-tanstack-query/react] useSuspenseQueries: no QueryClient is set. ' +\n 'Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] }).',\n )\n }\n }\n if (pendingPromises.length > 0) throw Promise.all(pendingPromises)\n\n // All success — shape the result tuple. Prefer the observer's live\n // result when present (reflects in-flight refetches), fall back to\n // the store snapshot otherwise.\n return queries.map((_, i) => {\n const live = liveResults[i]\n return {\n data: (live ? live.data : datas[i]) as unknown,\n error: (live ? live.error : (errors[i] ?? null)) as unknown,\n status: 'success' as const,\n isPending: false as const,\n isSuccess: true as const,\n isError: false as const,\n isFetching: (live ? live.isFetching : isFetchings[i]) as boolean,\n isPlaceholderData: (live\n ? live.isPlaceholderData\n : isPlaceholderDatas[i]) as boolean,\n fetchStatus: (live ? live.fetchStatus : fetchStatuses[i]) as FetchStatus,\n refresh: refreshes[i] as () => void,\n }\n }) as UseSuspenseQueriesTupleResult<T>\n}\n\ninterface FamilyInternals<TItem> {\n __queryFor: (item: TItem) => {\n queryKey: ReadonlyArray<unknown>\n queryFn?: unknown\n }\n}\n\nfunction useSuspenseQueriesFamily<TItem, TData, TError>(\n family: QueriesResult<TItem, TData, TError>,\n): ReadonlyArray<UseSuspenseQueryResult<TData, TError>> {\n const mount = useUnit(family.mounted)\n const unmount = useUnit(family.unmounted)\n const refreshOne = useUnit(family.refreshOne)\n React.useEffect(() => {\n mount()\n return () => unmount()\n }, [mount, unmount])\n\n const items = useUnit(family.$items)\n const qc = useUnit(family.$queryClient)\n\n // Error wins over pending.\n for (const it of items) {\n if (it.status === 'error') throw it.error\n }\n\n const pending = items.filter((it) => it.status === 'pending')\n if (pending.length > 0) {\n if (!qc) {\n throw new Error(\n '[@effector-tanstack-query/react] useSuspenseQueries: no QueryClient is set. ' +\n 'Call setQueryClient(qc) or pass it to fork({ values: [[$queryClient, qc]] }).',\n )\n }\n const queryFor = (family as unknown as FamilyInternals<TItem>).__queryFor\n throw Promise.all(\n pending.map((it) =>\n qc.fetchQuery(queryFor(it.source) as any).catch(() => undefined),\n ),\n )\n }\n\n return items.map((it) => ({\n data: it.data as TData,\n error: it.error,\n status: 'success' as const,\n isPending: false as const,\n isSuccess: true as const,\n isError: false as const,\n isFetching: it.isFetching,\n isPlaceholderData: it.isPlaceholderData,\n fetchStatus: it.fetchStatus,\n refresh: () => refreshOne(it.source),\n }))\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effector-tanstack-query/react",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "React hooks for @effector-tanstack-query/core — useQuery, useMutation, useInfiniteQuery, useSuspenseQuery, useSuspenseInfiniteQuery",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "React hooks for @effector-tanstack-query/core — useQuery, useQueries, useMutation, useInfiniteQuery, useSuspenseQuery, useSuspenseQueries, useSuspenseInfiniteQuery",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ilya Agarkov <ilya.al.ag@gmail.com>",
|
|
7
7
|
"repository": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
],
|
|
56
56
|
"sideEffects": false,
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@effector-tanstack-query/core": "0.
|
|
58
|
+
"@effector-tanstack-query/core": "0.4.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@tanstack/react-query": "^5.0.0"
|