import React, { memo, useCallback, useMemo } from 'react'; import { Image, ImageStyle, Pressable, StyleSheet, useColorScheme, View, } from 'react-native'; import { useCalendarContext } from '../../calendar-context'; import { YEAR_PAGE_SIZE } from '../../utils'; import { ClassNames, Styles } from '../../types'; import { UI } from '../../ui'; import { isEqual } from 'lodash'; import { COLORS } from '../../theme'; const arrow_right = require('../../assets/images/arrow_right.png'); type NextButtonProps = { style?: Styles[UI.button_next]; imageStyle?: Styles[UI.button_next_image]; className?: ClassNames[UI.button_next]; imageClassName?: ClassNames[UI.button_next_image]; }; const NextButton = ({ style, imageStyle, className, imageClassName, }: NextButtonProps) => { const { currentYear, onChangeMonth, onChangeYear, calendarView, components = {}, isRTL, } = useCalendarContext(); const colorScheme = useColorScheme(); const theme = colorScheme ?? 'light'; const defaultStyles = useMemo(() => createDefaultStyles(isRTL), [isRTL]); const onPress = useCallback(() => { switch (calendarView) { case 'day': return onChangeMonth(1); case 'month': return onChangeYear(currentYear + 1); case 'year': return onChangeYear(currentYear + YEAR_PAGE_SIZE); default: return {}; } }, [calendarView, currentYear, onChangeMonth, onChangeYear]); const iconStyle: ImageStyle = useMemo( () => ({ ...defaultStyles.icon, tintColor: COLORS[theme].foreground, ...(imageStyle as ImageStyle), }), [imageStyle, theme, defaultStyles.icon] ); return ( {components.IconNext || ( )} ); }; const customComparator = ( prev: Readonly, next: Readonly ) => { const areEqual = prev.className === next.className && isEqual(prev.style, next.style) && isEqual(prev.imageStyle, next.imageStyle) && isEqual(prev.imageClassName, next.imageClassName); return areEqual; }; export default memo(NextButton, customComparator); const createDefaultStyles = (isRTL: boolean) => StyleSheet.create({ iconContainer: { padding: 4, }, next: { marginLeft: isRTL ? 0 : 3, marginRight: isRTL ? 3 : 0, }, icon: { width: 14, height: 14, transform: [{ rotate: isRTL ? '180deg' : '0deg' }], }, });