@emeryld/rrroutes-client 2.2.7 → 2.2.8

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 CHANGED
@@ -68,19 +68,9 @@ var defaultFetcher = async (req) => {
68
68
  };
69
69
 
70
70
  // src/routesV3.client.index.ts
71
+ var import_react = require("react");
71
72
  var import_react_query = require("@tanstack/react-query");
72
73
  var import_rrroutes_contract = require("@emeryld/rrroutes-contract");
73
- function splitUseEndpointArgs(useArgs, expectsArgs) {
74
- if (useArgs.length === 0) return { args: void 0, options: void 0 };
75
- if (!expectsArgs) {
76
- return { args: void 0, options: useArgs[0] };
77
- }
78
- const [maybeArgs, maybeOptions] = useArgs;
79
- return {
80
- args: maybeArgs,
81
- options: useArgs.length > 1 ? maybeOptions : void 0
82
- };
83
- }
84
74
  var toUpper = (m) => m.toUpperCase();
85
75
  function zParse(value, schema) {
86
76
  return schema ? schema.parse(value) : value;
@@ -332,14 +322,31 @@ function createRouteClient(opts) {
332
322
  };
333
323
  if (isGet && isFeed) {
334
324
  const useEndpoint2 = (...useArgs) => {
335
- const { args, options } = splitUseEndpointArgs(useArgs, expectsArgs);
325
+ const args = useArgs[0];
336
326
  emit({ type: "useEndpoint", leaf: leafLabel, variant: "infiniteGet" });
337
327
  const tuple = toArgsTuple(args);
338
328
  const params = args?.params;
339
329
  const query = args?.query;
340
330
  const buildOptions = rqOpts ?? {};
331
+ const listenersRef = (0, import_react.useRef)(/* @__PURE__ */ new Set());
332
+ const notifyOnReceive = (0, import_react.useCallback)(
333
+ (data) => {
334
+ buildOptions?.onReceive?.(data);
335
+ listenersRef.current.forEach((listener) => listener(data));
336
+ },
337
+ []
338
+ );
339
+ const registerOnReceive = (0, import_react.useCallback)(
340
+ (listener) => {
341
+ listenersRef.current.add(listener);
342
+ return () => {
343
+ listenersRef.current.delete(listener);
344
+ };
345
+ },
346
+ []
347
+ );
341
348
  const { normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);
342
- return (0, import_react_query.useInfiniteQuery)({
349
+ const queryResult = (0, import_react_query.useInfiniteQuery)({
343
350
  ...buildOptions,
344
351
  queryKey: getQueryKeys(...tuple),
345
352
  initialPageParam: void 0,
@@ -352,14 +359,12 @@ function createRouteClient(opts) {
352
359
  };
353
360
  return fetchEndpoint(tuple, {
354
361
  queryOverride: pageQuery,
355
- onReceive: (data) => {
356
- buildOptions?.onReceive?.(data);
357
- options?.onReceive?.(data);
358
- }
362
+ onReceive: notifyOnReceive
359
363
  });
360
364
  }
361
365
  // NOTE: TData is InfiniteData<T>, so we don't need a select here.
362
366
  }, queryClient);
367
+ return { ...queryResult, onReceive: registerOnReceive };
363
368
  };
364
369
  return {
365
370
  getQueryKeys,
@@ -371,24 +376,39 @@ function createRouteClient(opts) {
371
376
  }
372
377
  if (isGet) {
373
378
  const useEndpoint2 = (...useArgs) => {
374
- const { args, options } = splitUseEndpointArgs(useArgs, expectsArgs);
379
+ const args = useArgs[0];
375
380
  emit({ type: "useEndpoint", leaf: leafLabel, variant: "get" });
376
381
  const tuple = toArgsTuple(args);
377
382
  const params = args?.params;
378
383
  const query = args?.query;
379
384
  const buildOptions = rqOpts ?? {};
385
+ const listenersRef = (0, import_react.useRef)(/* @__PURE__ */ new Set());
386
+ const notifyOnReceive = (0, import_react.useCallback)(
387
+ (data) => {
388
+ buildOptions?.onReceive?.(data);
389
+ listenersRef.current.forEach((listener) => listener(data));
390
+ },
391
+ []
392
+ );
393
+ const registerOnReceive = (0, import_react.useCallback)(
394
+ (listener) => {
395
+ listenersRef.current.add(listener);
396
+ return () => {
397
+ listenersRef.current.delete(listener);
398
+ };
399
+ },
400
+ []
401
+ );
380
402
  buildUrl(leaf, baseUrl, params, query);
381
- return (0, import_react_query.useQuery)({
403
+ const queryResult = (0, import_react_query.useQuery)({
382
404
  ...buildOptions,
383
405
  queryKey: getQueryKeys(...tuple),
384
406
  placeholderData: import_react_query.keepPreviousData,
385
407
  queryFn: () => fetchEndpoint(tuple, {
386
- onReceive: (data) => {
387
- buildOptions?.onReceive?.(data);
388
- options?.onReceive?.(data);
389
- }
408
+ onReceive: notifyOnReceive
390
409
  })
391
410
  }, queryClient);
411
+ return { ...queryResult, onReceive: registerOnReceive };
392
412
  };
393
413
  return {
394
414
  getQueryKeys,
@@ -414,18 +434,29 @@ function createRouteClient(opts) {
414
434
  return result;
415
435
  };
416
436
  const useEndpoint = (...useArgs) => {
417
- const { args, options } = splitUseEndpointArgs(useArgs, expectsArgs);
437
+ const args = useArgs[0];
418
438
  emit({ type: "useEndpoint", leaf: leafLabel, variant: "mutation" });
419
439
  const tuple = toArgsTuple(args);
420
- return (0, import_react_query.useMutation)({
440
+ const listenersRef = (0, import_react.useRef)(/* @__PURE__ */ new Set());
441
+ const notifyListeners = (0, import_react.useCallback)((data) => {
442
+ listenersRef.current.forEach((listener) => listener(data));
443
+ }, []);
444
+ const registerOnReceive = (0, import_react.useCallback)((listener) => {
445
+ listenersRef.current.add(listener);
446
+ return () => {
447
+ listenersRef.current.delete(listener);
448
+ };
449
+ }, []);
450
+ const mutationResult = (0, import_react_query.useMutation)({
421
451
  ...mutationBuildOptions,
422
452
  mutationKey: getQueryKeys(...tuple),
423
453
  mutationFn: async (body) => {
424
454
  const result = await fetchMutation(...[...tuple, body]);
425
- options?.onReceive?.(result);
455
+ notifyListeners(result);
426
456
  return result;
427
457
  }
428
458
  }, queryClient);
459
+ return { ...mutationResult, onReceive: registerOnReceive };
429
460
  };
430
461
  return {
431
462
  getQueryKeys,