react-native-full-calendars
Version:
React Native Full Calendar (RNFC) is an intuitive and powerful calendar component library designed for React Native.
77 lines (76 loc) • 2.28 kB
JavaScript
;
import { addMonths, differenceInCalendarMonths, startOfMonth } from 'date-fns';
import React, { useCallback, useContext, useImperativeHandle, useMemo, useRef } from 'react';
import { StyleSheet, View } from 'react-native';
import Swiper from '../../swiper/components/Swiper';
import { useCalendarController } from '../hooks/useCalendarController';
import { CalendarContext, WithWrappedProvider } from '../store';
import { Month } from './month/Month';
import { jsx as _jsx } from "react/jsx-runtime";
const Calendar = /*#__PURE__*/React.forwardRef((_, ref) => {
const {
onPageChange,
buffer,
minDate,
maxDate,
theme,
initialDate
} = useContext(CalendarContext);
const swiperRef = useRef(null);
const minSwiperIndex = useMemo(() => {
if (!minDate) {
return -Infinity;
}
return differenceInCalendarMonths(initialDate, minDate) * -1;
}, [minDate, initialDate]);
const maxSwiperIndex = useMemo(() => {
if (!maxDate) {
return Infinity;
}
return differenceInCalendarMonths(initialDate, maxDate) * -1;
}, [maxDate, initialDate]);
const onPageChangeRef = useRef(onPageChange);
onPageChangeRef.current = onPageChange;
const {
goToDatePage,
goToNextPage,
goToPrevPage
} = useCalendarController({
swiperRef,
initialDate
});
useImperativeHandle(ref, () => ({
goToDatePage,
goToNextPage,
goToPrevPage
}));
const onMonthChange = useCallback(pg => {
const offsetDate = addMonths(initialDate, pg);
const startDateOfMonth = startOfMonth(offsetDate);
onPageChangeRef.current?.(startDateOfMonth);
}, [initialDate]);
return /*#__PURE__*/_jsx(View, {
style: [styleSheet.flex, theme.style],
children: /*#__PURE__*/_jsx(Swiper, {
ref: swiperRef,
renderPage: ({
index
}) => /*#__PURE__*/_jsx(Month, {
index: index
}),
buffer: buffer,
onPageChange: onMonthChange,
minIndex: minSwiperIndex,
maxIndex: maxSwiperIndex,
pageWrapperStyle: [styleSheet.flex, theme.containerStyle],
style: styleSheet.flex
})
});
});
export default WithWrappedProvider(Calendar);
const styleSheet = StyleSheet.create({
flex: {
flex: 1
}
});
//# sourceMappingURL=Calendar.js.map