Bin
2025-12-16 9e0b2ba2c317b1a86212f24cbae3195ad1f3dbfa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { type FC, forwardRef, type ForwardedRef } from "react";
import AutoSizer from "react-virtualized-auto-sizer";
import InfiniteLoader from "react-window-infinite-loader";
import { VariableSizeList } from "react-window";
import clsx from "clsx";
 
export interface AutoSizerTableProps {
  totalCount: number;
  loadMore: (startIndex: number, stopIndex: number) => Promise<void>;
  isItemLoaded: (index: number) => boolean;
  itemData: any;
  itemSize: (index: number) => number;
  initialScrollOffset?: (height: number) => number;
  className?: string;
  children: FC<any>;
  heightAdjustment?: number;
}
 
export const AutoSizerTable = forwardRef<VariableSizeList, AutoSizerTableProps>(
  (
    {
      totalCount,
      loadMore,
      isItemLoaded,
      itemData,
      itemSize,
      initialScrollOffset,
      className,
      children: ItemWrapper,
      heightAdjustment = 0,
      ...rest
    },
    ref: ForwardedRef<VariableSizeList>,
  ) => {
    return (
      <AutoSizer className={clsx(className)}>
        {({ width, height }) => {
          const adjustedHeight = Math.max(0, height - heightAdjustment);
 
          return (
            <InfiniteLoader
              itemCount={totalCount}
              loadMoreItems={loadMore}
              isItemLoaded={isItemLoaded}
              threshold={5}
              minimumBatchSize={30}
              ref={ref}
            >
              {({
                onItemsRendered,
                ref: infiniteLoaderRef,
              }: { onItemsRendered: (params: { startIndex: number; stopIndex: number }) => void; ref: any }) => {
                return (
                  <VariableSizeList
                    ref={infiniteLoaderRef}
                    width={width}
                    height={adjustedHeight}
                    itemCount={totalCount}
                    itemData={itemData}
                    itemSize={itemSize}
                    onItemsRendered={onItemsRendered}
                    initialScrollOffset={initialScrollOffset?.(adjustedHeight) ?? 0}
                    {...rest}
                  >
                    {ItemWrapper}
                  </VariableSizeList>
                );
              }}
            </InfiniteLoader>
          );
        }}
      </AutoSizer>
    );
  },
);
 
AutoSizerTable.displayName = "AutoSizerTable";
 
export default AutoSizerTable;