mattermost-mobile/patches/react-native+0.67.4.patch
Daniel Espino García d1322e84ce
[Gekidou] Add performance and code improvements around post_list (#6113)
* Add performance and code improvements around post_list

* Fix test

* Move observers from utils to queries

* remove Flipper on iOS to fix CI build

* Fix observePermissionForChannel for DM/GM

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-04-04 08:14:55 -04:00

439 lines
16 KiB
Diff

diff --git a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
index b121da3..82c1c24 100644
--- a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
+++ b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
@@ -1777,9 +1777,15 @@ class ScrollView extends React.Component<Props, State> {
// 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]},
<NativeDirectionalScrollView
{...props}
style={StyleSheet.compose(baseStyle, inner)}
diff --git a/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js b/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js
index ea21ce2..05e0def 100644
--- a/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js
+++ b/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js
@@ -170,7 +170,9 @@ class ScrollViewStickyHeader extends React.Component<Props, State> {
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 5e49715..88f8896 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<ItemT> = {|
/**
@@ -141,6 +142,10 @@ type OptionalProps<ItemT> = {|
* See `ScrollView` for flow type and further documentation.
*/
fadingEdgeLength?: ?number,
+ /**
+ * Enable an optimization to memoize the item renderer to prevent unnecessary rerenders.
+ */
+ strictMode?: boolean,
|};
/**
@@ -579,9 +584,14 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
};
}
- _renderer = () => {
- const {ListItemComponent, renderItem, columnWrapperStyle} = this.props;
- const numColumns = numColumnsOrDefault(this.props.numColumns);
+ _renderer = (
+ ListItemComponent: ?(React.ComponentType<any> | React.Element<any>),
+ renderItem: ?RenderItemType<ItemT>,
+ columnWrapperStyle: ?ViewStyleProp,
+ numColumns: ?number,
+ extraData: ?any,
+ ) => {
+ const cols = numColumnsOrDefault(numColumns);
let virtualizedListRenderKey = ListItemComponent
? 'ListItemComponent'
@@ -606,7 +616,7 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, 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<ItemT>) => {
- if (numColumns > 1) {
+ if (cols > 1) {
const {item, index} = info;
invariant(
Array.isArray(item),
@@ -617,7 +627,7 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, void> {
{item.map((it, kk) => {
const element = renderer({
item: it,
- index: index * numColumns + kk,
+ index: index * cols + kk,
separators: info.separators,
});
return element != null ? (
@@ -633,14 +643,19 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, 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 (
<VirtualizedList
{...restProps}
@@ -652,7 +667,13 @@ class FlatList<ItemT> extends React.PureComponent<Props<ItemT>, 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 2648cc3..fa2511d 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,
@@ -794,12 +796,17 @@ class VirtualizedList extends React.PureComponent<Props, State> {
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);
@@ -814,27 +821,30 @@ class VirtualizedList extends React.PureComponent<Props, State> {
<CellRenderer
CellRendererComponent={CellRendererComponent}
ItemSeparatorComponent={ii < end ? ItemSeparatorComponent : undefined}
+ ListItemComponent={ListItemComponent}
cellKey={key}
+ debug={debug}
fillRateHelper={this._fillRateHelper}
+ getItemLayout={getItemLayout}
horizontal={horizontal}
index={ii}
inversionStyle={inversionStyle}
item={item}
key={key}
prevCellKey={prevCellKey}
+ onCellLayout={this._onCellLayout}
onUpdateSeparators={this._onUpdateSeparators}
- onLayout={e => 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<?string>, newProps: Object) => {
keys.forEach(key => {
const ref = key != null && this._cellRefs[key];
@@ -1269,7 +1279,7 @@ class VirtualizedList extends React.PureComponent<Props, State> {
}
};
- _onCellLayout(e, cellKey, index) {
+ _onCellLayout = (e: LayoutEvent, cellKey: string, index: number): void => {
const layout = e.nativeEvent.layout;
const next = {
offset: this._selectOffset(layout),
@@ -1302,7 +1312,7 @@ class VirtualizedList extends React.PureComponent<Props, State> {
this._computeBlankness();
this._updateViewableItems(this.props.data);
- }
+ };
_onCellUnmount = (cellKey: string) => {
const curr = this._frames[cellKey];
@@ -1381,7 +1391,7 @@ class VirtualizedList extends React.PureComponent<Props, State> {
}
}
- _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
@@ -1396,7 +1406,7 @@ class VirtualizedList extends React.PureComponent<Props, State> {
this._maybeCallOnEndReached();
};
- _onLayoutEmpty = e => {
+ _onLayoutEmpty = (e: LayoutEvent) => {
this.props.onLayout && this.props.onLayout(e);
};
@@ -1404,12 +1414,12 @@ class VirtualizedList extends React.PureComponent<Props, State> {
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);
};
@@ -1898,32 +1908,29 @@ type CellRendererProps = {
ItemSeparatorComponent: ?React.ComponentType<
any | {highlighted: boolean, leadingItem: ?Item},
>,
+ ListItemComponent?: ?(React.ComponentType<any> | React.Element<any>),
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<?string>, props: Object) => void,
- parentProps: {
- // e.g. height, y,
- getItemLayout?: (
- data: any,
- index: number,
- ) => {
- length: number,
- offset: number,
- index: number,
- ...
- },
- renderItem?: ?RenderItemType<Item>,
- ListItemComponent?: ?(React.ComponentType<any> | React.Element<any>),
- ...
- },
prevCellKey: ?string,
+ renderItem?: ?RenderItemType<Item>,
...
};
@@ -1935,7 +1942,7 @@ type CellRendererState = {
...
};
-class CellRenderer extends React.Component<
+class CellRenderer extends React.PureComponent<
CellRendererProps,
CellRendererState,
> {
@@ -1950,12 +1957,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
@@ -1992,6 +2003,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(
@@ -2032,14 +2052,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,
@@ -2048,12 +2070,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 && (
@@ -2119,7 +2139,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 2aefa12..dea1771 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -88,7 +88,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"]
@@ -102,7 +102,7 @@ def hermesFlagsForVariant = config.hermesFlagsForVariant ?: {
// 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 {
@@ -173,7 +173,7 @@ afterEvaluate {
// Set up dev mode
def devEnabled = !(config."devDisabledIn${targetName}"
- || targetName.toLowerCase().contains("release"))
+ || targetName.toLowerCase().contains("release") || targetName.toLowerCase().contains("unsigned"))
def extraArgs = []
@@ -237,7 +237,7 @@ afterEvaluate {
? config."bundleIn${targetName}"
: config."bundleIn${variant.buildType.name.capitalize()}" != null
? config."bundleIn${variant.buildType.name.capitalize()}"
- : targetName.toLowerCase().contains("release")
+ : (targetName.toLowerCase().contains("release") || targetName.toLowerCase().contains("unsigned"))
}
// Expose a minimal interface on the application variant and the task itself: