diff --git a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js index 7cee521..e490d09 100644 --- a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js +++ b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js @@ -1784,9 +1784,15 @@ class ScrollView extends React.Component { // Note: we should split props.style on the inner and outer props // however, the ScrollView still needs the baseStyle to be scrollable const {outer, inner} = splitLayoutProps(flattenStyle(props.style)); + let inverted; + if (inner.scaleY) { + inverted = {scaleY: -1}; + delete inner['scaleY'] + } + return React.cloneElement( refreshControl, - {style: StyleSheet.compose(baseStyle, outer)}, + {style: [baseStyle, outer, inverted]}, { this.props.onLayout(event); const child = React.Children.only(this.props.children); - if (child.props.onLayout) { + if (child.props.onCellLayout) { + child.props.onCellLayout(event, child.props.cellKey, child.props.index); + } else if (child.props.onLayout) { child.props.onLayout(event); } }; diff --git a/node_modules/react-native/Libraries/Lists/FlatList.js b/node_modules/react-native/Libraries/Lists/FlatList.js index f78ca22..8e81037 100644 --- a/node_modules/react-native/Libraries/Lists/FlatList.js +++ b/node_modules/react-native/Libraries/Lists/FlatList.js @@ -26,6 +26,7 @@ import type { } from './ViewabilityHelper'; import type {RenderItemType, RenderItemProps} from './VirtualizedList'; import {keyExtractor as defaultKeyExtractor} from './VirtualizeUtils'; +import memoizeOne from 'memoize-one'; type RequiredProps = {| /** @@ -141,6 +142,10 @@ type OptionalProps = {| * See `ScrollView` for flow type and further documentation. */ fadingEdgeLength?: ?number, + /** + * Enable an optimization to memoize the item renderer to prevent unnecessary rerenders. + */ + strictMode?: boolean, |}; /** @@ -578,9 +583,14 @@ class FlatList extends React.PureComponent, void> { }; } - _renderer = () => { - const {ListItemComponent, renderItem, columnWrapperStyle} = this.props; - const numColumns = numColumnsOrDefault(this.props.numColumns); + _renderer = ( + ListItemComponent: ?(React.ComponentType | React.Element), + renderItem: ?RenderItemType, + columnWrapperStyle: ?ViewStyleProp, + numColumns: ?number, + extraData: ?any, + ) => { + const cols = numColumnsOrDefault(numColumns); let virtualizedListRenderKey = ListItemComponent ? 'ListItemComponent' @@ -605,7 +615,7 @@ class FlatList extends React.PureComponent, void> { * This comment suppresses an error found when Flow v0.111 was deployed. * To see the error, delete this comment and run Flow. */ [virtualizedListRenderKey]: (info: RenderItemProps) => { - if (numColumns > 1) { + if (cols > 1) { const {item, index} = info; invariant( Array.isArray(item), @@ -616,7 +626,7 @@ class FlatList extends React.PureComponent, void> { {item.map((it, kk) => { const element = renderer({ item: it, - index: index * numColumns + kk, + index: index * cols + kk, separators: info.separators, }); return element != null ? ( @@ -632,14 +642,19 @@ class FlatList extends React.PureComponent, void> { }; }; + _memoizedRenderer = memoizeOne(this._renderer); + render(): React.Node { const { numColumns, columnWrapperStyle, removeClippedSubviews: _removeClippedSubviews, + strictMode = false, ...restProps } = this.props; + const renderer = strictMode ? this._memoizedRenderer : this._renderer; + return ( extends React.PureComponent, void> { removeClippedSubviews={removeClippedSubviewsOrDefault( _removeClippedSubviews, )} - {...this._renderer()} + {...renderer( + this.props.ListItemComponent, + this.props.renderItem, + columnWrapperStyle, + numColumns, + this.props.extraData, + )} /> ); } diff --git a/node_modules/react-native/Libraries/Lists/VirtualizedList.js b/node_modules/react-native/Libraries/Lists/VirtualizedList.js index 6de43b7..2c18c92 100644 --- a/node_modules/react-native/Libraries/Lists/VirtualizedList.js +++ b/node_modules/react-native/Libraries/Lists/VirtualizedList.js @@ -16,6 +16,7 @@ const ScrollView = require('../Components/ScrollView/ScrollView'); const StyleSheet = require('../StyleSheet/StyleSheet'); const View = require('../Components/View/View'); const ViewabilityHelper = require('./ViewabilityHelper'); +const Platform = require('../Utilities/Platform'); const flattenStyle = require('../StyleSheet/flattenStyle'); const infoLog = require('../Utilities/infoLog'); @@ -34,6 +35,7 @@ import type { ViewToken, ViewabilityConfigCallbackPair, } from './ViewabilityHelper'; +import type {LayoutEvent} from '../Types/CoreEventTypes'; import { VirtualizedListCellContextProvider, VirtualizedListContext, @@ -796,12 +798,17 @@ class VirtualizedList extends React.PureComponent { const { CellRendererComponent, ItemSeparatorComponent, + ListHeaderComponent, + ListItemComponent, data, + debug, getItem, getItemCount, + getItemLayout, horizontal, + renderItem, } = this.props; - const stickyOffset = this.props.ListHeaderComponent ? 1 : 0; + const stickyOffset = ListHeaderComponent ? 1 : 0; const end = getItemCount(data) - 1; let prevCellKey; last = Math.min(end, last); @@ -816,27 +823,30 @@ class VirtualizedList extends React.PureComponent { this._onCellLayout(e, key, ii)} onUnmount={this._onCellUnmount} - parentProps={this.props} ref={ref => { this._cellRefs[key] = ref; }} + renderItem={renderItem} />, ); prevCellKey = key; } } - +1 _onUpdateSeparators = (keys: Array, newProps: Object) => { keys.forEach(key => { const ref = key != null && this._cellRefs[key]; @@ -1268,7 +1278,7 @@ class VirtualizedList extends React.PureComponent { } }; - _onCellLayout(e, cellKey, index) { + _onCellLayout = (e: LayoutEvent, cellKey: string, index: number): void => { const layout = e.nativeEvent.layout; const next = { offset: this._selectOffset(layout), @@ -1301,7 +1311,7 @@ class VirtualizedList extends React.PureComponent { this._computeBlankness(); this._updateViewableItems(this.props.data); - } + }; _onCellUnmount = (cellKey: string) => { const curr = this._frames[cellKey]; @@ -1380,7 +1390,7 @@ class VirtualizedList extends React.PureComponent { } } - _onLayout = (e: Object) => { + _onLayout = (e: LayoutEvent) => { if (this._isNestedWithSameOrientation()) { // Need to adjust our scroll metrics to be relative to our containing // VirtualizedList before we can make claims about list item viewability @@ -1395,7 +1405,7 @@ class VirtualizedList extends React.PureComponent { this._maybeCallOnEndReached(); }; - _onLayoutEmpty = e => { + _onLayoutEmpty = (e: LayoutEvent) => { this.props.onLayout && this.props.onLayout(e); }; @@ -1403,12 +1413,12 @@ class VirtualizedList extends React.PureComponent { return this._getCellKey() + '-footer'; } - _onLayoutFooter = e => { + _onLayoutFooter = (e: LayoutEvent) => { this._triggerRemeasureForChildListsInCell(this._getFooterCellKey()); this._footerLength = this._selectLength(e.nativeEvent.layout); }; - _onLayoutHeader = e => { + _onLayoutHeader = (e: LayoutEvent) => { this._headerLength = this._selectLength(e.nativeEvent.layout); }; @@ -1888,32 +1898,29 @@ type CellRendererProps = { ItemSeparatorComponent: ?React.ComponentType< any | {highlighted: boolean, leadingItem: ?Item}, >, + ListItemComponent?: ?(React.ComponentType | React.Element), cellKey: string, + debug?: ?boolean, fillRateHelper: FillRateHelper, + getItemLayout?: ( + data: any, + index: number, + ) => { + length: number, + offset: number, + index: number, + ... + }, horizontal: ?boolean, index: number, inversionStyle: ViewStyleProp, item: Item, // This is extracted by ScrollViewStickyHeader - onLayout: (event: Object) => void, + onCellLayout: (event: Object, cellKey: string, index: number) => void, onUnmount: (cellKey: string) => void, onUpdateSeparators: (cellKeys: Array, props: Object) => void, - parentProps: { - // e.g. height, y, - getItemLayout?: ( - data: any, - index: number, - ) => { - length: number, - offset: number, - index: number, - ... - }, - renderItem?: ?RenderItemType, - ListItemComponent?: ?(React.ComponentType | React.Element), - ... - }, prevCellKey: ?string, + renderItem?: ?RenderItemType, ... }; @@ -1925,7 +1932,7 @@ type CellRendererState = { ... }; -class CellRenderer extends React.Component< +class CellRenderer extends React.PureComponent< CellRendererProps, CellRendererState, > { @@ -1940,12 +1947,16 @@ class CellRenderer extends React.Component< props: CellRendererProps, prevState: CellRendererState, ): ?CellRendererState { - return { - separatorProps: { - ...prevState.separatorProps, - leadingItem: props.item, - }, - }; + if (prevState.separatorProps.leadingItem !== props.item) { + return { + separatorProps: { + ...prevState.separatorProps, + leadingItem: props.item, + }, + }; + } else { + return prevState; + } } // TODO: consider factoring separator stuff out of VirtualizedList into FlatList since it's not @@ -1982,6 +1993,15 @@ class CellRenderer extends React.Component< this.props.onUnmount(this.props.cellKey); } + _onLayout = (nativeEvent: LayoutEvent): void => { + this.props.onCellLayout && + this.props.onCellLayout( + nativeEvent, + this.props.cellKey, + this.props.index, + ); + }; + _renderElement(renderItem, ListItemComponent, item, index) { if (renderItem && ListItemComponent) { console.warn( @@ -2022,14 +2042,16 @@ class CellRenderer extends React.Component< const { CellRendererComponent, ItemSeparatorComponent, + ListItemComponent, + debug, fillRateHelper, + getItemLayout, horizontal, item, index, inversionStyle, - parentProps, + renderItem, } = this.props; - const {renderItem, getItemLayout, ListItemComponent} = parentProps; const element = this._renderElement( renderItem, ListItemComponent, @@ -2038,12 +2060,10 @@ class CellRenderer extends React.Component< ); const onLayout = - /* $FlowFixMe[prop-missing] (>=0.68.0 site=react_native_fb) This comment - * suppresses an error found when Flow v0.68 was deployed. To see the - * error delete this comment and run Flow. */ - getItemLayout && !parentProps.debug && !fillRateHelper.enabled() + (getItemLayout && !debug && !fillRateHelper.enabled()) || + !this.props.onCellLayout ? undefined - : this.props.onLayout; + : this._onLayout; // NOTE: that when this is a sticky header, `onLayout` will get automatically extracted and // called explicitly by `ScrollViewStickyHeader`. const itemSeparator = ItemSeparatorComponent && ( @@ -2109,7 +2129,14 @@ function describeNestedLists(childList: { const styles = StyleSheet.create({ verticallyInverted: { - transform: [{scaleY: -1}], + ...Platform.select({ + android: { + scaleY: -1, + }, + ios: { + transform: [{scaleY: -1}], + }, + }), }, horizontallyInverted: { transform: [{scaleX: -1}], diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle index d876b13..142c59b 100644 --- a/node_modules/react-native/react.gradle +++ b/node_modules/react-native/react.gradle @@ -112,7 +112,7 @@ def enableHermesForVariant = config.enableHermesForVariant ?: { def hermesFlagsForVariant = config.hermesFlagsForVariant ?: { def variant -> def hermesFlags; - if (variant.name.toLowerCase().contains("release")) { + if (variant.name.toLowerCase().contains("release") || variant.name.toLowerCase().contains("unsigned")) { // Can't use ?: since that will also substitute valid empty lists hermesFlags = config.hermesFlagsRelease if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"] @@ -128,7 +128,7 @@ def hermesFlagsForVariant = config.hermesFlagsForVariant ?: { def disableDevForVariant = config.disableDevForVariant ?: { def variant -> config."devDisabledIn${variant.name.capitalize()}" || - variant.name.toLowerCase().contains("release") + variant.name.toLowerCase().contains("release") || variant.name.toLowerCase().contains("unsigned") } // Set bundleForVariant to a function to configure per variant, @@ -137,13 +137,13 @@ def bundleForVariant = config.bundleForVariant ?: { def variant -> config."bundleIn${variant.name.capitalize()}" || config."bundleIn${variant.buildType.name.capitalize()}" || - variant.name.toLowerCase().contains("release") + variant.name.toLowerCase().contains("release") || variant.name.toLowerCase().contains("unsigned") } // Set deleteDebugFilesForVariant to a function to configure per variant, // defaults to True for Release variants and False for debug variants def deleteDebugFilesForVariant = config.deleteDebugFilesForVariant ?: { - def variant -> variant.name.toLowerCase().contains("release") + def variant -> variant.name.toLowerCase().contains("release") || variant.name.toLowerCase().contains("unsigned") } android {