import type { Ref } from 'react'; import debounce from 'lodash/debounce'; import memoize from 'memoize-one'; import type { FixedSizeListProps } from 'react-window'; import { FixedSizeList } from 'react-window'; import styled from 'styled-components'; import { GridCard } from '/@/renderer/components/virtual-grid/grid-card'; import type { CardRow, LibraryItem, ListDisplayType, CardRoute, PlayQueueAddOptions, } from '/@/renderer/types'; import { Album, AlbumArtist, Artist } from '/@/renderer/api/types'; const createItemData = memoize( ( cardRows, columnCount, display, itemCount, itemData, itemGap, itemHeight, itemType, itemWidth, route, handlePlayQueueAdd, ) => ({ cardRows, columnCount, display, handlePlayQueueAdd, itemCount, itemData, itemGap, itemHeight, itemType, itemWidth, route, }), ); const createScrollHandler = memoize((onScroll) => debounce(onScroll, 250)); export const VirtualGridWrapper = ({ refInstance, cardRows, itemGap, itemType, itemWidth, display, itemHeight, itemCount, columnCount, rowCount, initialScrollOffset, handlePlayQueueAdd, itemData, route, onScroll, ...rest }: Omit & { cardRows: CardRow[]; columnCount: number; display: ListDisplayType; handlePlayQueueAdd?: (options: PlayQueueAddOptions) => void; itemData: any[]; itemGap: number; itemHeight: number; itemType: LibraryItem; itemWidth: number; refInstance: Ref; route?: CardRoute; rowCount: number; }) => { const memoizedItemData = createItemData( cardRows, columnCount, display, itemCount, itemData, itemGap, itemHeight, itemType, itemWidth, route, handlePlayQueueAdd, ); const memoizedOnScroll = createScrollHandler(onScroll); return ( {GridCard} ); }; VirtualGridWrapper.defaultProps = { route: undefined, }; export const VirtualGridContainer = styled.div` display: flex; flex-direction: column; height: 100%; `; export const VirtualGridAutoSizerContainer = styled.div` flex: 1; `;