react-native-lunar-calendars
Version:
React Native Calendar Components with Lunar Calendar Support - Fork of react-native-calendars with Vietnamese lunar calendar functionality
85 lines (72 loc) • 2.01 kB
text/typescript
import {parseDate} from '../interface';
import XDate from 'xdate';
interface UpdateResult {
update: boolean;
field?: string;
}
interface CalendarProps {
selected?: string[];
markedDates?: any;
hideExtraDays?: boolean;
minDate?: string;
maxDate?: string;
current?: string;
[key: string]: any;
}
interface CalendarState {
currentMonth: string;
}
export default function shouldComponentUpdate(
nextProps: CalendarProps,
nextState: CalendarState,
currentProps: CalendarProps,
currentState: CalendarState
): boolean {
let shouldUpdate: UpdateResult = {update: false};
// Check selected dates
const nextSelected = nextProps.selected || [];
const currentSelected = currentProps.selected || [];
for (let i = 0; i < nextSelected.length; i++) {
const next = nextSelected[i];
const current = currentSelected[i];
if (!current || !next || parseDate(current)?.getTime() !== parseDate(next)?.getTime()) {
shouldUpdate = {
update: true,
field: 'selected'
};
break;
}
}
// Check markedDates and hideExtraDays
['markedDates', 'hideExtraDays'].forEach(prop => {
if (!shouldUpdate.update && nextProps[prop] !== currentProps[prop]) {
shouldUpdate = {
update: true,
field: prop
};
}
});
// Check date-related props
['minDate', 'maxDate', 'current'].forEach(prop => {
if (shouldUpdate.update) return;
const prevDate = currentProps[prop] ? parseDate(currentProps[prop]) : null;
const nextDate = nextProps[prop] ? parseDate(nextProps[prop]) : null;
if (prevDate !== nextDate) {
if (prevDate && nextDate && prevDate.getTime() === nextDate.getTime()) {
return;
}
shouldUpdate = {
update: true,
field: prop
};
}
});
// Check current month
if (nextState.currentMonth !== currentState.currentMonth) {
shouldUpdate = {
update: true,
field: 'current'
};
}
return shouldUpdate.update;
}