Skip to content

Commit 48e636b

Browse files
authored
refactor(AnalyticalTable): memoize selectedFlatRows computation (#8485)
1 parent 2da0205 commit 48e636b

1 file changed

Lines changed: 15 additions & 9 deletions

File tree

packages/main/src/components/AnalyticalTable/hooks/useRowSelect.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback } from 'react';
1+
import { useCallback, useMemo } from 'react';
22
import { actions, makePropGetter, ensurePluginOrder, useGetLatest, useMountedLayoutEffect } from 'react-table';
33
import { AnalyticalTableSelectionMode } from '../../../enums/AnalyticalTableSelectionMode.js';
44
import type { ReactTableHooks, RowType, TableInstance } from '../types/index.js';
@@ -22,7 +22,7 @@ const emptyArray: RowType[] = [];
2222
* This is a fork of react-table's `useRowSelect` with performance optimizations:
2323
* - Early exit when `selectionMode` is 'None'
2424
* - Skips `selectedFlatRows` computation, `isAllRowsSelected` checks, and `prepareRow` overhead when selection is disabled
25-
* - `isAllRowsSelected` computation is memoized
25+
* - `selectedFlatRows` computation is memoized
2626
* - Uses stable noop references when disabled
2727
* - Fixes select-all indeterminate state considering filtered-out rows (now only visible rows are considered)
2828
*
@@ -250,23 +250,29 @@ function useInstance(instance: TableInstance) {
250250

251251
ensurePluginOrder(plugins, ['useFilters', 'useGroupBy', 'useSortBy', 'useExpanded', 'usePagination'], 'useRowSelect');
252252

253-
// UI5WCR: early exit when selection disabled
254-
let selectedFlatRows: RowType[] = emptyArray;
255-
let isAllRowsSelected = false;
256-
let isAllPageRowsSelected = false;
253+
// UI5WCR: memoized computation with early exit when selection disabled.
254+
const selectedFlatRows = useMemo(() => {
255+
if (!isSelectionEnabled) {
256+
return emptyArray;
257+
}
257258

258-
if (isSelectionEnabled) {
259-
selectedFlatRows = [];
259+
const result: RowType[] = [];
260260
rows.forEach((row) => {
261261
const isSelected = selectSubRows ? getRowIsSelected(row, selectedRowIds, getSubRows) : !!selectedRowIds[row.id];
262262
row.isSelected = !!isSelected;
263263
row.isSomeSelected = isSelected === null;
264264

265265
if (isSelected) {
266-
selectedFlatRows.push(row);
266+
result.push(row);
267267
}
268268
});
269+
return result;
270+
}, [rows, selectSubRows, selectedRowIds, getSubRows, isSelectionEnabled]);
269271

272+
let isAllRowsSelected = false;
273+
let isAllPageRowsSelected = false;
274+
275+
if (isSelectionEnabled) {
270276
// isAllRowsSelected
271277
const rowIds = Object.keys(nonGroupedRowsById);
272278
const selectedIds = Object.keys(selectedRowIds);

0 commit comments

Comments
 (0)