@legendapp/list
Version:
Legend List is a drop-in replacement for FlatList with much better performance and supporting dynamically sized items.
227 lines (220 loc) • 9.28 kB
TypeScript
import * as React from 'react';
import { ScrollViewComponent, ScrollResponderMixin, Insets as Insets$1 } from 'react-native';
import { ScrollEvent, ScrollHandlerProcessed } from 'react-native-reanimated';
import { AnimatedLegendListProps } from '@legendapp/list/reanimated';
interface MaintainVisibleContentPositionNormalized<ItemT = any> {
data: boolean;
size: boolean;
shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
}
type ListenerType = "activeStickyIndex" | "anchoredEndSpaceSize" | "debugComputedScroll" | "debugRawScroll" | "extraData" | "footerSize" | "headerSize" | "lastItemKeys" | "lastPositionUpdate" | "maintainVisibleContentPosition" | "numColumns" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "scrollAdjust" | "scrollAdjustPending" | "scrollAdjustUserOffset" | "scrollSize" | "snapToOffsets" | "stylePaddingTop" | "totalSize" | "isAtEnd" | "isAtStart" | "isNearEnd" | "isNearStart" | "isWithinMaintainScrollAtEndThreshold" | `containerColumn${number}` | `containerSpan${number}` | `containerItemData${number}` | `containerItemKey${number}` | `containerPosition${number}` | `containerSticky${number}`;
type LegendListListenerType = Extract<ListenerType, "activeStickyIndex" | "anchoredEndSpaceSize" | "footerSize" | "headerSize" | "isAtEnd" | "isAtStart" | "isNearEnd" | "isNearStart" | "isWithinMaintainScrollAtEndThreshold" | "lastItemKeys" | "lastPositionUpdate" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "snapToOffsets" | "totalSize">;
type ListenerTypeValueMap = {
activeStickyIndex: number;
anchoredEndSpaceSize: number;
animatedScrollY: any;
debugComputedScroll: number;
debugRawScroll: number;
extraData: any;
footerSize: number;
headerSize: number;
isAtEnd: boolean;
isAtStart: boolean;
isNearEnd: boolean;
isNearStart: boolean;
isWithinMaintainScrollAtEndThreshold: boolean;
lastItemKeys: string[];
lastPositionUpdate: number;
maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
numColumns: number;
numContainers: number;
numContainersPooled: number;
otherAxisSize: number;
readyToRender: boolean;
scrollAdjust: number;
scrollAdjustPending: number;
scrollAdjustUserOffset: number;
scrollSize: {
width: number;
height: number;
};
snapToOffsets: number[];
stylePaddingTop: number;
totalSize: number;
} & {
[K in ListenerType as K extends `containerItemKey${number}` ? K : never]: string;
} & {
[K in ListenerType as K extends `containerItemData${number}` ? K : never]: any;
} & {
[K in ListenerType as K extends `containerPosition${number}` ? K : never]: number;
} & {
[K in ListenerType as K extends `containerColumn${number}` ? K : never]: number;
} & {
[K in ListenerType as K extends `containerSpan${number}` ? K : never]: number;
} & {
[K in ListenerType as K extends `containerSticky${number}` ? K : never]: boolean;
};
interface Insets {
top: number;
left: number;
bottom: number;
right: number;
}
interface LegendListAverageItemSize {
average: number;
count: number;
}
type LegendListState = {
activeStickyIndex: number;
contentLength: number;
data: readonly any[];
elementAtIndex: (index: number) => any;
end: number;
endBuffered: number;
isAtEnd: boolean;
isAtStart: boolean;
isNearEnd: boolean;
isNearStart: boolean;
isEndReached: boolean;
isStartReached: boolean;
isWithinMaintainScrollAtEndThreshold: boolean;
getAverageItemSizes: () => Record<string, LegendListAverageItemSize>;
listen: <T extends LegendListListenerType>(listenerType: T, callback: (value: ListenerTypeValueMap[T]) => void) => () => void;
listenToPosition: (key: string, callback: (value: number) => void) => () => void;
positionAtIndex: (index: number) => number;
positionByKey: (key: string) => number | undefined;
scroll: number;
scrollLength: number;
scrollVelocity: number;
sizeAtIndex: (index: number) => number;
sizes: Map<string, number>;
start: number;
startBuffered: number;
};
type LegendListRef$1 = {
/**
* Displays the scroll indicators momentarily.
*/
flashScrollIndicators(): void;
/**
* Returns the native ScrollView component reference.
*/
getNativeScrollRef(): any;
/**
* Returns the scroll responder instance for handling scroll events.
*/
getScrollableNode(): any;
/**
* Returns the ScrollResponderMixin for advanced scroll handling.
*/
getScrollResponder(): any;
/**
* Returns the internal state of the scroll virtualization.
*/
getState(): LegendListState;
/**
* Scrolls a specific index into view.
* @param params - Parameters for scrolling.
* @param params.animated - If true, animates the scroll. Default: true.
* @param params.index - The index to scroll to.
*/
scrollIndexIntoView(params: {
animated?: boolean | undefined;
index: number;
}): Promise<void>;
/**
* Scrolls a specific index into view.
* @param params - Parameters for scrolling.
* @param params.animated - If true, animates the scroll. Default: true.
* @param params.item - The item to scroll to.
*/
scrollItemIntoView(params: {
animated?: boolean | undefined;
item: any;
}): Promise<void>;
/**
* Scrolls to the end of the list.
* @param options - Options for scrolling.
* @param options.animated - If true, animates the scroll. Default: true.
* @param options.viewOffset - Offset from the target position.
*/
scrollToEnd(options?: {
animated?: boolean | undefined;
viewOffset?: number | undefined;
}): Promise<void>;
/**
* Scrolls to a specific index in the list.
* @param params - Parameters for scrolling.
* @param params.animated - If true, animates the scroll. Default: true.
* @param params.index - The index to scroll to.
* @param params.viewOffset - Offset from the target position.
* @param params.viewPosition - Position of the item in the viewport (0 to 1).
*/
scrollToIndex(params: {
animated?: boolean | undefined;
index: number;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}): Promise<void>;
/**
* Scrolls to a specific item in the list.
* @param params - Parameters for scrolling.
* @param params.animated - If true, animates the scroll. Default: true.
* @param params.item - The item to scroll to.
* @param params.viewOffset - Offset from the target position.
* @param params.viewPosition - Position of the item in the viewport (0 to 1).
*/
scrollToItem(params: {
animated?: boolean | undefined;
item: any;
viewOffset?: number | undefined;
viewPosition?: number | undefined;
}): Promise<void>;
/**
* Scrolls to a specific offset in pixels.
* @param params - Parameters for scrolling.
* @param params.offset - The pixel offset to scroll to.
* @param params.animated - If true, animates the scroll. Default: true.
*/
scrollToOffset(params: {
offset: number;
animated?: boolean | undefined;
}): Promise<void>;
/**
* Sets or adds to the offset of the visible content anchor.
* @param value - The offset to set or add.
* @param animated - If true, uses Animated to animate the change.
*/
setVisibleContentAnchorOffset(value: number | ((val: number) => number)): void;
/**
* Sets whether scroll processing is enabled.
* @param enabled - If true, scroll processing is enabled.
*/
setScrollProcessingEnabled(enabled: boolean): void;
/**
* Clears internal virtualization caches.
* @param options - Cache clearing options.
* @param options.mode - `sizes` clears measurement caches. `full` also clears key/position caches.
*/
clearCaches(options?: {
mode?: "sizes" | "full";
}): void;
/**
* Reports an externally measured content inset. Pass null/undefined to clear.
* Values are merged on top of props/animated/native insets.
*/
reportContentInset(inset?: Partial<Insets> | null): void;
};
type LegendListRef = Omit<LegendListRef$1, "getNativeScrollRef" | "getScrollResponder" | "reportContentInset"> & {
getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
getScrollResponder(): ScrollResponderMixin;
reportContentInset(inset?: Partial<Insets$1> | null): void;
};
type KeyboardOnScrollCallback = (event: ScrollEvent) => void;
type KeyboardOnScrollHandler = KeyboardOnScrollCallback | ScrollHandlerProcessed<Record<string, unknown>>;
declare const KeyboardAvoidingLegendList: <ItemT>(props: Omit<AnimatedLegendListProps<ItemT>, "onScroll" | "automaticallyAdjustContentInsets" | "contentInset"> & {
onScroll?: KeyboardOnScrollHandler;
contentInset?: Insets$1 | undefined;
safeAreaInsetBottom?: number;
} & React.RefAttributes<LegendListRef>) => React.ReactElement | null;
export { KeyboardAvoidingLegendList };