react-native-full-calendars
Version:
React Native Full Calendar (RNFC) is an intuitive and powerful calendar component library designed for React Native.
92 lines (91 loc) • 2.71 kB
JavaScript
;
import React, { useCallback, useContext, useImperativeHandle, useState } from 'react';
import { View } from 'react-native';
import { GestureDetector } from 'react-native-gesture-handler';
import { useDerivedValue, useSharedValue } from 'react-native-reanimated';
import { usePanGesture } from '../hooks/usePanGesture';
import { useSwiperController } from '../hooks/useSwiperController';
import { SwiperContext, WithWrappedProvider } from '../store';
import { Page } from './Page';
import { jsx as _jsx } from "react/jsx-runtime";
const Swiper = /*#__PURE__*/React.forwardRef((_, ref) => {
const {
props
} = useContext(SwiperContext);
const {
vertical,
buffer,
style,
pageWrapperStyle,
width,
height,
initialIndex
} = props;
const pageWidth = useSharedValue(width || 0);
const pageHeight = useSharedValue(height || 0);
const viewSize = vertical ? pageHeight : pageWidth;
const [pageLayout, setPageLayout] = useState(0);
const translate = useSharedValue(0);
const pageAnim = useSharedValue(initialIndex);
useDerivedValue(() => {
if (viewSize.value) {
pageAnim.value = initialIndex + translate.value / viewSize.value * -1;
}
}, [viewSize, pageAnim, translate, initialIndex]);
const {
setPage,
prevPage,
nextPage,
getCurrIndex
} = useSwiperController({
layoutPage: pageLayout,
viewSize,
translate,
pageAnim
});
useImperativeHandle(ref, () => ({
setPage,
nextPage,
prevPage,
getCurrIndex
}));
const curIndex = getCurrIndex();
const pageIndices = [...Array(buffer * 2 + 1)].map((_, i) => {
const bufferIndex = i - buffer;
return curIndex - bufferIndex;
});
const panGesture = usePanGesture({
curIndex,
translate,
viewSize
});
const handleLayout = useCallback(e => {
const {
height: layoutHeight,
width: layoutWidth
} = e.nativeEvent.layout;
pageWidth.value = layoutWidth;
pageHeight.value = layoutHeight;
setPageLayout(vertical ? layoutHeight : layoutWidth);
}, [vertical, pageWidth, pageHeight]);
return /*#__PURE__*/_jsx(GestureDetector, {
gesture: panGesture,
children: /*#__PURE__*/_jsx(View, {
style: [style],
onLayout: handleLayout,
children: pageIndices.map(pageIndex => {
return /*#__PURE__*/_jsx(Page, {
pageAnim: pageAnim,
index: pageIndex,
pageWidth: pageWidth,
pageHeight: pageHeight,
viewSize: viewSize,
isActive: pageIndex === curIndex,
style: pageWrapperStyle
}, pageIndex);
})
})
});
});
export default WithWrappedProvider(Swiper);
//# sourceMappingURL=Swiper.js.map