add additional props to ItemGrid

This commit is contained in:
jeffvli
2025-09-25 21:28:47 -07:00
parent 71e280061c
commit 18390443ff
@@ -13,12 +13,18 @@ import {
useRef, useRef,
useState, useState,
} from 'react'; } from 'react';
import { GridComponents, VirtuosoGrid, VirtuosoGridHandle } from 'react-virtuoso'; import {
GridComponents,
VirtuosoGrid,
VirtuosoGridHandle,
VirtuosoGridProps,
} from 'react-virtuoso';
import { ItemListItem, ItemListStateActions, useItemListState } from '../helpers/item-list-state'; import { ItemListItem, ItemListStateActions, useItemListState } from '../helpers/item-list-state';
import styles from './item-grid.module.css'; import styles from './item-grid.module.css';
import { ItemCard } from '/@/renderer/components/item-card/item-card'; import { ItemCard } from '/@/renderer/components/item-card/item-card';
import { LibraryItem } from '/@/shared/types/domain-types';
const gridComponents: GridComponents<any> = { const gridComponents: GridComponents<any> = {
Item: forwardRef< Item: forwardRef<
@@ -61,9 +67,10 @@ const gridComponents: GridComponents<any> = {
}; };
interface ItemContext { interface ItemContext {
actions: ItemListStateActions;
enableExpansion?: boolean; enableExpansion?: boolean;
enableSelection?: boolean; enableSelection?: boolean;
internalState: ItemListStateActions;
itemType: LibraryItem;
onItemClick?: (item: unknown, index: number) => void; onItemClick?: (item: unknown, index: number) => void;
onItemContextMenu?: (item: unknown, index: number) => void; onItemContextMenu?: (item: unknown, index: number) => void;
onItemDoubleClick?: (item: unknown, index: number) => void; onItemDoubleClick?: (item: unknown, index: number) => void;
@@ -73,9 +80,23 @@ interface ItemGridProps {
data: unknown[]; data: unknown[];
enableExpansion?: boolean; enableExpansion?: boolean;
enableSelection?: boolean; enableSelection?: boolean;
initialTopMostItemIndex?:
| number
| {
align: 'center' | 'end' | 'start';
behavior: 'auto' | 'smooth';
index: number;
offset?: number;
};
itemType: LibraryItem;
onEndReached?: (index: number) => void;
onIsScrolling?: VirtuosoGridProps<any, any>['isScrolling'];
onItemClick?: (item: unknown, index: number) => void; onItemClick?: (item: unknown, index: number) => void;
onItemContextMenu?: (item: unknown, index: number) => void; onItemContextMenu?: (item: unknown, index: number) => void;
onItemDoubleClick?: (item: unknown, index: number) => void; onItemDoubleClick?: (item: unknown, index: number) => void;
onRangeChanged?: (range: { endIndex: number; startIndex: number }) => void;
onScroll?: VirtuosoGridProps<any, any>['onScroll'];
onStartReached?: (index: number) => void;
ref: Ref<VirtuosoGridHandle>; ref: Ref<VirtuosoGridHandle>;
totalItemCount?: number; totalItemCount?: number;
} }
@@ -99,9 +120,16 @@ export const ItemGrid = ({
data, data,
enableExpansion = false, enableExpansion = false,
enableSelection = false, enableSelection = false,
initialTopMostItemIndex = 0,
itemType,
onEndReached,
onIsScrolling,
onItemClick, onItemClick,
onItemContextMenu, onItemContextMenu,
onItemDoubleClick, onItemDoubleClick,
onRangeChanged,
onScroll,
onStartReached,
ref, ref,
totalItemCount, totalItemCount,
}: ItemGridProps) => { }: ItemGridProps) => {
@@ -109,7 +137,7 @@ export const ItemGrid = ({
const [scroller, setScroller] = useState<HTMLElement | null>(null); const [scroller, setScroller] = useState<HTMLElement | null>(null);
const actions = useItemListState(); const internalState = useItemListState();
const [initialize, osInstance] = useOverlayScrollbars({ const [initialize, osInstance] = useOverlayScrollbars({
defer: true, defer: true,
@@ -141,24 +169,26 @@ export const ItemGrid = ({
const itemContext = useMemo( const itemContext = useMemo(
() => ({ () => ({
actions,
enableExpansion, enableExpansion,
enableSelection, enableSelection,
internalState,
itemType,
onItemClick, onItemClick,
onItemContextMenu, onItemContextMenu,
onItemDoubleClick, onItemDoubleClick,
}), }),
[ [
actions, internalState,
enableExpansion, enableExpansion,
enableSelection, enableSelection,
itemType,
onItemClick, onItemClick,
onItemDoubleClick, onItemDoubleClick,
onItemContextMenu, onItemContextMenu,
], ],
); );
const hasExpanded = actions.hasExpanded(); const hasExpanded = internalState.hasExpanded();
return ( return (
<div className={styles.itemGridContainer}> <div className={styles.itemGridContainer}>
@@ -171,10 +201,16 @@ export const ItemGrid = ({
components={gridComponents} components={gridComponents}
context={itemContext} context={itemContext}
data={data} data={data}
endReached={onEndReached}
increaseViewportBy={200} increaseViewportBy={200}
initialTopMostItemIndex={initialTopMostItemIndex}
isScrolling={onIsScrolling}
itemContent={itemContent} itemContent={itemContent}
onScroll={onScroll}
rangeChanged={onRangeChanged}
ref={ref} ref={ref}
scrollerRef={setScroller} scrollerRef={setScroller}
startReached={onStartReached}
totalCount={totalItemCount || data.length} totalCount={totalItemCount || data.length}
/> />
</div> </div>