From f58487efc970aac2662eda6c186e7f2beaa61a5d Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Fri, 8 Dec 2023 01:26:18 +0000 Subject: [PATCH] More FlatList parity --- src/view/com/util/Views.web.tsx | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx index 6627c84a03..9b37b20142 100644 --- a/src/view/com/util/Views.web.tsx +++ b/src/view/com/util/Views.web.tsx @@ -52,6 +52,7 @@ export function CenteredView({ export const FlatList = React.forwardRef(function FlatListImpl( { data, + extraData, contentOffset, keyExtractor, renderItem, @@ -60,6 +61,8 @@ export const FlatList = React.forwardRef(function FlatListImpl( onEndReached, onEndReachedThreshold, onScroll, + ListHeaderComponent, + ListFooterComponent, ...props }: React.PropsWithChildren & AddedProps>, ref: React.Ref>, @@ -85,6 +88,7 @@ export const FlatList = React.forwardRef(function FlatListImpl( paddingTop: Math.abs(contentOffset.y), }) } + const nativeRef = React.useRef(null) React.useImperativeHandle( ref, @@ -134,21 +138,44 @@ export const FlatList = React.forwardRef(function FlatListImpl( }) }, [onEndReachedThreshold, onEndReached]) + let header = null + if (ListHeaderComponent != null) { + if (typeof ListHeaderComponent === 'object') { + header = ListHeaderComponent + } else if (typeof ListHeaderComponent === 'function') { + // @ts-ignore We aren't using classes so it's a render function. + header = ListHeaderComponent() + } + } + + let footer = null + if (ListFooterComponent != null) { + if (typeof ListFooterComponent === 'object') { + footer = ListFooterComponent + } else if (typeof ListFooterComponent === 'function') { + // @ts-ignore We aren't using classes so it's a render function. + footer = ListFooterComponent() + } + } + return ( + {header} {(data as Array).map((item, index) => ( key={keyExtractor!(item, index)} item={item} index={index} renderItem={renderItem} + extraData={extraData} /> ))} {onEndReached && ( )} + {footer} ) @@ -158,6 +185,7 @@ let Row = function RowImpl({ item, index, renderItem, + extraData: _unused, }: { item: ItemT index: number @@ -165,6 +193,7 @@ let Row = function RowImpl({ | null | undefined | ((data: {index: number; item: any; separators: any}) => React.ReactNode) + extraData: any }): React.ReactNode { if (!renderItem) { return null