2022-08-09 10:43:24 +00:00
|
|
|
import React, { memo, useCallback, useEffect, useRef } from "react";
|
2022-07-15 08:58:58 +00:00
|
|
|
import AutoSizer from "react-virtualized-auto-sizer";
|
|
|
|
import InfiniteLoader from "react-window-infinite-loader";
|
|
|
|
import { FixedSizeList as List, areEqual } from "react-window";
|
2022-08-09 10:43:24 +00:00
|
|
|
//import Scroll from "./Scroll";
|
2022-08-09 06:49:28 +00:00
|
|
|
import Loaders from "@docspace/common/components/Loaders";
|
2022-07-15 08:58:58 +00:00
|
|
|
import { StyledTableLoader, StyledRowLoader } from "./StyledInfiniteLoader";
|
|
|
|
|
|
|
|
const ListComponent = ({
|
|
|
|
viewAs,
|
|
|
|
hasMoreFiles,
|
|
|
|
filesLength,
|
|
|
|
itemCount,
|
|
|
|
loadMoreItems,
|
|
|
|
itemSize,
|
|
|
|
onScroll,
|
|
|
|
columnStorageName,
|
2022-08-09 10:43:24 +00:00
|
|
|
selectedFolderId,
|
2022-07-15 08:58:58 +00:00
|
|
|
children,
|
|
|
|
className,
|
2022-08-09 10:43:24 +00:00
|
|
|
listRef,
|
2022-07-15 08:58:58 +00:00
|
|
|
}) => {
|
2022-08-09 10:43:24 +00:00
|
|
|
const listComponentRef = useRef(null);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
//TODO: inf-scroll it is slow
|
|
|
|
|
|
|
|
listComponentRef?.current?.resetAfterIndex(0);
|
|
|
|
}, [selectedFolderId]);
|
|
|
|
|
2022-07-15 08:58:58 +00:00
|
|
|
const renderRow = memo(({ index, style }) => {
|
|
|
|
const isLoaded = isItemLoaded(index + 1);
|
|
|
|
if (!isLoaded) return getLoader(style);
|
|
|
|
|
|
|
|
return <div style={style}>{children[index]}</div>;
|
|
|
|
}, areEqual);
|
|
|
|
|
|
|
|
const isItemLoaded = useCallback(
|
|
|
|
(index) => !hasMoreFiles || index < filesLength,
|
|
|
|
[filesLength, hasMoreFiles]
|
|
|
|
);
|
|
|
|
|
|
|
|
const renderTable = memo(({ index, style }) => {
|
|
|
|
const storageSize = localStorage.getItem(columnStorageName);
|
|
|
|
|
|
|
|
const isLoaded = isItemLoaded(index + 1);
|
|
|
|
if (!isLoaded) return getLoader(style);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div
|
|
|
|
className="table-row-list-item"
|
|
|
|
style={{
|
|
|
|
...style,
|
|
|
|
display: "grid",
|
|
|
|
gridTemplateColumns: storageSize,
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{children[index]}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}, areEqual);
|
|
|
|
|
|
|
|
const getLoader = (style) => {
|
|
|
|
switch (viewAs) {
|
|
|
|
case "table":
|
|
|
|
return (
|
|
|
|
<StyledTableLoader
|
|
|
|
style={style}
|
|
|
|
className="table-container_body-loader"
|
|
|
|
>
|
|
|
|
<Loaders.TableLoader count={2} />
|
|
|
|
</StyledTableLoader>
|
|
|
|
);
|
|
|
|
case "row":
|
|
|
|
return (
|
|
|
|
<StyledRowLoader style={style} className="row-loader">
|
|
|
|
<Loaders.Rows count={2} />
|
|
|
|
</StyledRowLoader>
|
|
|
|
);
|
|
|
|
default:
|
|
|
|
return <></>;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-08-09 10:43:24 +00:00
|
|
|
const renderList = ({ height, width }) => {
|
|
|
|
return (
|
|
|
|
<InfiniteLoader
|
|
|
|
isItemLoaded={isItemLoaded}
|
|
|
|
itemCount={itemCount}
|
|
|
|
loadMoreItems={loadMoreItems}
|
|
|
|
>
|
|
|
|
{({ onItemsRendered, ref }) => (
|
|
|
|
<List
|
|
|
|
onScroll={onScroll}
|
|
|
|
className={className}
|
|
|
|
height={height}
|
|
|
|
width={width}
|
|
|
|
itemCount={children.length}
|
|
|
|
itemSize={itemSize}
|
|
|
|
onItemsRendered={onItemsRendered}
|
|
|
|
ref={(refList) => {
|
|
|
|
ref(listRef);
|
|
|
|
listComponentRef.current = refList;
|
|
|
|
listRef.current = refList;
|
|
|
|
}}
|
|
|
|
style={{ height: "100% !important" }}
|
|
|
|
//outerElementType={Scroll}
|
|
|
|
>
|
|
|
|
{viewAs === "table" ? renderTable : renderRow}
|
|
|
|
</List>
|
|
|
|
)}
|
|
|
|
</InfiniteLoader>
|
|
|
|
);
|
|
|
|
};
|
2022-07-15 08:58:58 +00:00
|
|
|
|
|
|
|
return <AutoSizer>{renderList}</AutoSizer>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ListComponent;
|