Skip to content

Commit b8b8edc

Browse files
committed
improve week component performance
1 parent 7a7dd7a commit b8b8edc

File tree

2 files changed

+25
-30
lines changed

2 files changed

+25
-30
lines changed

src/expandableCalendar/week.tsx

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import XDate from 'xdate';
2-
import React, {useRef, useMemo} from 'react';
2+
import React, {useRef, useMemo, useCallback} from 'react';
33
import {View} from 'react-native';
44

55
import {getPartialWeekDates, getWeekDates, sameMonth} from '../dateutils';
@@ -17,21 +17,19 @@ export type WeekProps = CalendarProps;
1717
const Week = (props: WeekProps) => {
1818
const {theme, current, firstDay, hideExtraDays, markedDates, onDayPress, onDayLongPress, style: propsStyle, numberOfDays = 1, timelineLeftInset} = props;
1919
const style = useRef(styleConstructor(theme));
20-
21-
const getWeek = (date?: string) => {
20+
const dayProps = extractDayProps(props);
21+
const currXdate = parseDate(current);
22+
const getWeek = useCallback((date?: string) => {
2223
if (date) {
2324
return getWeekDates(date, firstDay);
2425
}
25-
};
26+
}, [firstDay]);
2627

2728
// renderWeekNumber (weekNumber) {
2829
// return <BasicDay key={`week-${weekNumber}`} theme={this.props.theme} marking={{disableTouchEvent: true}} state='disabled'>{weekNumber}</BasicDay>;
2930
// }
3031

3132
const renderDay = (day: XDate, id: number) => {
32-
const dayProps = extractDayProps(props);
33-
const currXdate = parseDate(current);
34-
3533
// hide extra days
3634
if (current && hideExtraDays) {
3735
if (!sameMonth(day, currXdate)) {
@@ -55,23 +53,16 @@ const Week = (props: WeekProps) => {
5553

5654
const renderWeek = () => {
5755
const dates = numberOfDays > 1 ? getPartialWeekDates(current, numberOfDays) : getWeek(current);
58-
let week: any[] = [];
59-
56+
const week: JSX.Element[] = [];
57+
const todayIndex = dates?.indexOf(parseDate(new Date())) || -1;
58+
6059
if (dates) {
61-
dates.forEach((day: XDate, id: number) => {
60+
const datesToRender = numberOfDays > 1 && todayIndex > -1 ? dates.slice(todayIndex, numberOfDays) : dates;
61+
datesToRender.forEach((day: XDate, id: number) => {
6262
week.push(renderDay(day, id));
6363
}, this);
6464
}
65-
66-
// if (this.props.showWeekNumbers) {
67-
// week.unshift(this.renderWeekNumber(item[item.length - 1].getWeek()));
68-
// }
69-
70-
const todayIndex = dates?.indexOf(parseDate(new Date())) || -1;
7165

72-
if (numberOfDays > 1 && todayIndex > -1) {
73-
week = week.slice(todayIndex, numberOfDays);
74-
}
7566
return week;
7667
};
7768

src/infinite-list/index.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
4444
scrollViewProps,
4545
positionIndex = 0
4646
} = props;
47-
47+
4848
const dataProvider = useMemo(() => {
4949
return dataProviderMaker(data);
5050
}, [data]);
@@ -78,7 +78,7 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
7878
const onScroll = useCallback(
7979
(event, offsetX, offsetY) => {
8080
reloadPagesDebounce?.cancel();
81-
81+
8282
const {x, y} = event.nativeEvent.contentOffset;
8383
const newPageIndex = Math.round(isHorizontal ? x / pageWidth : y / pageHeight);
8484

@@ -106,7 +106,7 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
106106
onMomentumScrollEnd(event);
107107
}, 100);
108108
}
109-
109+
110110
pageIndex.current = newPageIndex;
111111
}
112112

@@ -125,7 +125,7 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
125125
reloadPagesDebounce?.(pageIndex.current);
126126
onReachNearEdge?.(pageIndex.current!);
127127
}
128-
128+
129129
scrollViewProps?.onMomentumScrollEnd?.(event);
130130
}
131131
},
@@ -136,6 +136,16 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
136136
scrolledByUser.current = true;
137137
}, []);
138138

139+
const scrollViewPropsMemo = useMemo(() => {
140+
return {
141+
pagingEnabled: isHorizontal,
142+
bounces: false,
143+
...scrollViewProps,
144+
onScrollBeginDrag,
145+
onMomentumScrollEnd
146+
};
147+
}, [onScrollBeginDrag, onMomentumScrollEnd, scrollViewProps, isHorizontal]);
148+
139149
const style = useMemo(() => {
140150
return {height: pageHeight};
141151
}, [pageHeight]);
@@ -153,13 +163,7 @@ const InfiniteList = (props: InfiniteListProps, ref: any) => {
153163
renderAheadOffset={5 * pageWidth}
154164
onScroll={onScroll}
155165
style={style}
156-
scrollViewProps={{
157-
pagingEnabled: isHorizontal,
158-
bounces: false,
159-
...scrollViewProps,
160-
onScrollBeginDrag,
161-
onMomentumScrollEnd
162-
}}
166+
scrollViewProps={scrollViewPropsMemo}
163167
/>
164168
);
165169
};

0 commit comments

Comments
 (0)