Skip to content

Commit

Permalink
fix: Prevent FlatList slow update on huge dataset (#78)
Browse files Browse the repository at this point in the history
  • Loading branch information
jwallet committed May 22, 2023
1 parent 95842d2 commit c2a8f68
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 18 deletions.
14 changes: 13 additions & 1 deletion src/NetworkRequestInfo.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import BlobFileReader from 'react-native/Libraries/Blob/FileReader';
import { Headers, RequestMethod } from './types';
import { Headers, NetworkRequestInfoRow, RequestMethod } from './types';
import fromEntries from './utils/fromEntries';

export default class NetworkRequestInfo {
Expand Down Expand Up @@ -82,6 +82,18 @@ export default class NetworkRequestInfo {
return JSON.stringify(this.parseData(data), null, 2);
}

public toRow(): NetworkRequestInfoRow {
return {
url: this.url,
gqlOperation: this.gqlOperation,
id: this.id,
method: this.method,
status: this.status,
duration: this.duration,
startTime: this.startTime,
};
}

getRequestBody(replaceEscaped = false) {
const body = this.stringifyFormat(this.dataSent);

Expand Down
12 changes: 8 additions & 4 deletions src/components/NetworkLogger.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect, useState, useCallback } from 'react';
import React, { useEffect, useState, useCallback, useMemo } from 'react';
import { Alert, View, StyleSheet, BackHandler, Share } from 'react-native';
import logger from '../loggerSingleton';
import NetworkRequestInfo from '../NetworkRequestInfo';
Expand Down Expand Up @@ -96,6 +96,10 @@ const NetworkLogger: React.FC<Props> = ({ theme = 'light', sort = 'desc' }) => {
]);
};

const requestsInfo = useMemo(() => {
return requests.map((r) => r.toRow());
}, [requests]);

return (
<ThemeContext.Provider value={theme}>
<View style={styles.visible}>
Expand All @@ -112,11 +116,11 @@ const NetworkLogger: React.FC<Props> = ({ theme = 'light', sort = 'desc' }) => {
<Unmounted />
) : (
<RequestList
requests={requests}
requestsInfo={requestsInfo}
onShowMore={showMore}
showDetails={showDetails && !!request}
onPressItem={(item) => {
setRequest(item);
onPressItem={(id) => {
setRequest(requests.find((r) => r.id === id));
setShowDetails(true);
}}
/>
Expand Down
20 changes: 9 additions & 11 deletions src/components/RequestList.tsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,38 @@
import React, { useEffect, useState } from 'react';
import React, { useMemo, useState } from 'react';
import { View, StyleSheet, FlatList } from 'react-native';
import NetworkRequestInfo from '../NetworkRequestInfo';
import { useThemedStyles, Theme } from '../theme';
import ResultItem from './ResultItem';
import Button from './Button';
import SearchBar from './SearchBar';
import { NetworkRequestInfoRow } from '../types';

interface Props {
requests: NetworkRequestInfo[];
onPressItem: (item: NetworkRequestInfo) => void;
requestsInfo: NetworkRequestInfoRow[];
onPressItem: (item: NetworkRequestInfo['id']) => void;
onShowMore: () => void;
showDetails: boolean;
}

const RequestList: React.FC<Props> = ({
requests,
requestsInfo,
onPressItem,
onShowMore,
showDetails,
}) => {
const styles = useThemedStyles(themedStyles);

const [searchValue, onChangeSearchText] = useState('');
const [filteredRequests, setFilteredRequests] = useState(requests);

useEffect(() => {
const filtered = requests.filter((request) => {
const filteredRequests = useMemo(() => {
return requestsInfo.filter((request) => {
const value = searchValue.toLowerCase().trim();
return (
request.url.toLowerCase().includes(value) ||
request.gqlOperation?.toLowerCase().includes(value)
);
});

setFilteredRequests(filtered);
}, [requests, searchValue]);
}, [requestsInfo, searchValue]);

return (
<View style={styles.container}>
Expand All @@ -51,7 +49,7 @@ const RequestList: React.FC<Props> = ({
)}
data={filteredRequests}
renderItem={({ item }) => (
<ResultItem request={item} onPress={() => onPressItem(item)} />
<ResultItem request={item} onPress={() => onPressItem(item.id)} />
)}
/>
</View>
Expand Down
4 changes: 2 additions & 2 deletions src/components/ResultItem.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React from 'react';
import { View, TouchableOpacity, Text, StyleSheet } from 'react-native';
import NetworkRequestInfo from '../NetworkRequestInfo';
import { Theme, useThemedStyles, useTheme } from '../theme';
import { backHandlerSet } from '../backHandler';
import { NetworkRequestInfoRow } from '../types';

interface Props {
request: NetworkRequestInfo;
request: NetworkRequestInfoRow;
onPress?(): void;
style?: any;
}
Expand Down
7 changes: 7 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import NetworkRequestInfo from './NetworkRequestInfo';

export type Headers = { [header: string]: string };

export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
Expand Down Expand Up @@ -25,6 +27,11 @@ export type StartNetworkLoggingOptions = {
forceEnable?: boolean;
};

export type NetworkRequestInfoRow = Pick<
NetworkRequestInfo,
'url' | 'gqlOperation' | 'id' | 'method' | 'status' | 'duration' | 'startTime'
>;

export type DeepPartial<T> = {
[P in keyof T]?: DeepPartial<T[P]>;
};

0 comments on commit c2a8f68

Please sign in to comment.