@trackunit/react-components 2.2.2-alpha-0af54c028ac.0 → 2.2.3

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/index.cjs.js CHANGED
@@ -13118,17 +13118,29 @@ const useRelayPagination = ({ onReset, pageSize, initialCursor } = { pageSize: d
13118
13118
  const { hasNextPage, endCursor, hasPreviousPage, startCursor } = pageInfo ?? {};
13119
13119
  const nextPage = react.useCallback(() => {
13120
13120
  if (hasNextPage === true) {
13121
- setVariables({
13122
- after: endCursor === null ? undefined : endCursor,
13123
- first: pageSize,
13121
+ const after = endCursor === null ? undefined : endCursor;
13122
+ setVariables(prev => {
13123
+ // Idempotent: when the resolved variables are unchanged (e.g. the
13124
+ // backend keeps reporting `hasNextPage: true` without advancing the
13125
+ // cursor), return the same reference so React skips the re-render.
13126
+ // Without this bail-out the forward auto-load in `useBidirectionalScroll`
13127
+ // re-runs every render and calls `nextPage` again, causing an infinite
13128
+ // update loop.
13129
+ if (prev.after === after && prev.first === pageSize && prev.before === undefined && prev.last === undefined) {
13130
+ return prev;
13131
+ }
13132
+ return { after, first: pageSize };
13124
13133
  });
13125
13134
  }
13126
13135
  }, [hasNextPage, endCursor, pageSize]);
13127
13136
  const previousPage = react.useCallback(() => {
13128
13137
  if (hasPreviousPage === true) {
13129
- setVariables({
13130
- before: startCursor === null ? undefined : startCursor,
13131
- last: pageSize,
13138
+ const before = startCursor === null ? undefined : startCursor;
13139
+ setVariables(prev => {
13140
+ if (prev.before === before && prev.last === pageSize && prev.after === undefined && prev.first === undefined) {
13141
+ return prev;
13142
+ }
13143
+ return { before, last: pageSize };
13132
13144
  });
13133
13145
  }
13134
13146
  }, [hasPreviousPage, startCursor, pageSize]);
package/index.esm.js CHANGED
@@ -13116,17 +13116,29 @@ const useRelayPagination = ({ onReset, pageSize, initialCursor } = { pageSize: d
13116
13116
  const { hasNextPage, endCursor, hasPreviousPage, startCursor } = pageInfo ?? {};
13117
13117
  const nextPage = useCallback(() => {
13118
13118
  if (hasNextPage === true) {
13119
- setVariables({
13120
- after: endCursor === null ? undefined : endCursor,
13121
- first: pageSize,
13119
+ const after = endCursor === null ? undefined : endCursor;
13120
+ setVariables(prev => {
13121
+ // Idempotent: when the resolved variables are unchanged (e.g. the
13122
+ // backend keeps reporting `hasNextPage: true` without advancing the
13123
+ // cursor), return the same reference so React skips the re-render.
13124
+ // Without this bail-out the forward auto-load in `useBidirectionalScroll`
13125
+ // re-runs every render and calls `nextPage` again, causing an infinite
13126
+ // update loop.
13127
+ if (prev.after === after && prev.first === pageSize && prev.before === undefined && prev.last === undefined) {
13128
+ return prev;
13129
+ }
13130
+ return { after, first: pageSize };
13122
13131
  });
13123
13132
  }
13124
13133
  }, [hasNextPage, endCursor, pageSize]);
13125
13134
  const previousPage = useCallback(() => {
13126
13135
  if (hasPreviousPage === true) {
13127
- setVariables({
13128
- before: startCursor === null ? undefined : startCursor,
13129
- last: pageSize,
13136
+ const before = startCursor === null ? undefined : startCursor;
13137
+ setVariables(prev => {
13138
+ if (prev.before === before && prev.last === pageSize && prev.after === undefined && prev.first === undefined) {
13139
+ return prev;
13140
+ }
13141
+ return { before, last: pageSize };
13130
13142
  });
13131
13143
  }
13132
13144
  }, [hasPreviousPage, startCursor, pageSize]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/react-components",
3
- "version": "2.2.2-alpha-0af54c028ac.0",
3
+ "version": "2.2.3",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "migrations": "./migrations.json",
@@ -14,17 +14,17 @@
14
14
  "@floating-ui/react": "^0.26.25",
15
15
  "string-ts": "^2.0.0",
16
16
  "tailwind-merge": "^2.0.0",
17
- "@trackunit/ui-design-tokens": "1.13.60-alpha-0af54c028ac.0",
18
- "@trackunit/css-class-variance-utilities": "1.13.61-alpha-0af54c028ac.0",
19
- "@trackunit/shared-utils": "1.15.64-alpha-0af54c028ac.0",
20
- "@trackunit/ui-icons": "1.13.62-alpha-0af54c028ac.0",
17
+ "@trackunit/ui-design-tokens": "1.13.60",
18
+ "@trackunit/css-class-variance-utilities": "1.13.61",
19
+ "@trackunit/shared-utils": "1.15.64",
20
+ "@trackunit/ui-icons": "1.13.62",
21
21
  "es-toolkit": "^1.39.10",
22
22
  "@tanstack/react-virtual": "^3.14.3",
23
23
  "dequal": "^2.0.3",
24
24
  "fflate": "^0.8.2",
25
25
  "superjson": "^2.2.6",
26
26
  "zod": "^3.25.76",
27
- "@trackunit/i18n-library-translation": "2.1.2-alpha-0af54c028ac.0"
27
+ "@trackunit/i18n-library-translation": "2.1.2"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "react": "^19.0.0",