The response of my paginated code looks something like –
Page 1
0: {title: '2024-07-11', data: Array(3)}
1: {title: '2024-07-12', data: Array(1)}
2: {title: '2024-07-15', data: Array(2)}
3: {title: '2024-07-16', data: Array(1)}
4: {title: '2024-07-17', data: Array(1)}
5: {title: '2024-07-19', data: Array(3)}
6: {title: '2024-07-20', data: Array(2)}
7: {title: '2024-07-22', data: Array(2)}
8: {title: '2024-07-23', data: Array(4)}
9: {title: '2024-07-24', data: Array(1)}
length: 10
Page 2
0: {title: '2024-07-11', data: Array(3)}
1: {title: '2024-07-12', data: Array(1)}
2: {title: '2024-07-15', data: Array(2)}
3: {title: '2024-07-16', data: Array(1)}
4: {title: '2024-07-17', data: Array(1)}
5: {title: '2024-07-19', data: Array(3)}
6: {title: '2024-07-20', data: Array(2)}
7: {title: '2024-07-22', data: Array(2)}
8: {title: '2024-07-23', data: Array(4)}
9: {title: '2024-07-24', data: Array(1)}
10: {title: '2024-07-24', data: Array(3)}
11: {title: '2024-07-11', data: Array(3)}
12: {title: '2024-07-12', data: Array(1)}
13: {title: '2024-07-15', data: Array(2)}
14: {title: '2024-07-16', data: Array(2)}
15: {title: '2024-07-18', data: Array(2)}
16: {title: '2024-07-19', data: Array(3)}
17: {title: '2024-07-22', data: Array(2)}
18: {title: '2024-07-23', data: Array(2)}
length: 19
Page 3
0: {title: '2024-07-11', data: Array(3)}
1: {title: '2024-07-12', data: Array(1)}
2: {title: '2024-07-15', data: Array(2)}
3: {title: '2024-07-16', data: Array(1)}
4: {title: '2024-07-17', data: Array(1)}
5: {title: '2024-07-19', data: Array(3)}
6: {title: '2024-07-20', data: Array(2)}
7: {title: '2024-07-22', data: Array(2)}
8: {title: '2024-07-23', data: Array(4)}
9: {title: '2024-07-24', data: Array(1)}
10: {title: '2024-07-24', data: Array(3)}
11: {title: '2024-07-11', data: Array(3)}
12: {title: '2024-07-12', data: Array(1)}
13: {title: '2024-07-15', data: Array(2)}
14: {title: '2024-07-16', data: Array(2)}
15: {title: '2024-07-18', data: Array(2)}
16: {title: '2024-07-19', data: Array(3)}
17: {title: '2024-07-22', data: Array(2)}
18: {title: '2024-07-23', data: Array(2)}
19: {title: '2024-07-24', data: Array(1)}
20: {title: '2024-07-25', data: Array(5)}
21: {title: '2024-07-11', data: Array(2)}
22: {title: '2024-07-12', data: Array(4)}
23: {title: '2024-07-15', data: Array(1)}
24: {title: '2024-07-17', data: Array(2)}
25: {title: '2024-07-18', data: Array(1)}
26: {title: '2024-07-20', data: Array(1)}
27: {title: '2024-07-22', data: Array(1)}
length: 28
I am using react-query’s useInifiniteQuery and page values are flattened.
When the third and the final page is fetched and rendered, I see the following glitch –
import format from 'date-fns/format';
import { useCallback } from 'react';
import { RefreshControl, SectionList, View } from 'react-native';
import { BookableAppointment } from '@app-types/appointments';
import {
AppointmentCard,
AppointmentListLoader,
} from '@components/app-specific';
import { CircularLoader, Typography } from '@components/core';
import { createUseStyle } from '@theme';
import { useGetAppointmentBooking } from '../../hooks/get-appointment-booking';
export const useBookableAppointmentsStyle = createUseStyle(t => ({
listEmptyContainer: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
header: {
backgroundColor: t.palette.background.main,
},
contentContainer: {
gap: 16,
paddingVertical: t.moderateVerticalScale(10, 1),
flexGrow: 1,
},
}));
export const BookableAppointments = () => {
const styles = useBookableAppointmentsStyle();
const {
data,
isLoading,
isFetchingNextPage,
loadMore,
isRefetching,
refetch,
} = useGetAppointmentBooking();
const renderBookableAppointment = useCallback(
({ item }: { item: BookableAppointment }) => {
return (
<AppointmentCard
key={item.EndDateTime.toString()}
appointment={{
EndDateTime: item.EndDateTime,
Id: item.Id,
LocationName: item.LocationName,
StartDateTime: item.StartDateTime,
}}
/>
);
},
[],
);
const onPullToRefresh = useCallback(async () => {
await refetch();
}, [refetch]);
if (isLoading && !data.length) {
return <AppointmentListLoader />;
}
const ListEmptyComponent = !isLoading ? (
<View style={styles.listEmptyContainer}>
<Typography variant="body1" color="description" align="center">
Unfortunately, there are no available appointments for the selected date
range.
</Typography>
</View>
) : null;
const renderSectionHeader = ({
section: { title },
}: {
section: { title: string };
}) => (
<View style={styles.header}>
<Typography variant="h4" weight="bold">
{format(new Date(title), 'EEEE, dd MMMM yyyy')}
</Typography>
</View>
);
return (
<SectionList
keyExtractor={item => item.EndDateTime.toString()}
sections={data}
renderItem={renderBookableAppointment}
refreshControl={
<RefreshControl refreshing={isRefetching} onRefresh={onPullToRefresh} />
}
onEndReached={loadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={
isFetchingNextPage && data.length ? <CircularLoader /> : null
}
ListEmptyComponent={ListEmptyComponent}
renderSectionHeader={renderSectionHeader}
contentContainerStyle={styles.contentContainer}
/>
);
};
I have tried adding initialNumToRender
, maxToRenderPerBatch
, etc for additional performance gains but things became worse.
I am not sure why things render perfectly on the 2nd page but I see this glitch when the 3rd page renders