import XDate from 'xdate'; import React, { useRef, useMemo, useCallback } from 'react'; import { Text } from 'react-native'; import { Theme } from '../types'; import { toMarkingFormat } from '../interface'; import { extractCalendarProps } from '../componentUpdater'; import styleConstructor from './style'; import Calendar, { CalendarProps } from '../calendar'; export type CalendarListItemProps = CalendarProps & { item: any; calendarWidth?: number; calendarHeight?: number; horizontal?: boolean; theme?: Theme; scrollToMonth?: (date: XDate) => void; visible?: boolean; }; const CalendarListItem = React.memo((props: CalendarListItemProps) => { const { item, theme, scrollToMonth, horizontal, calendarHeight, calendarWidth, style: propsStyle, headerStyle, onPressArrowLeft, onPressArrowRight, visible, } = props; const style = useRef(styleConstructor(theme)); const calendarProps = extractCalendarProps(props); const dateString = toMarkingFormat(item); const calendarStyle = useMemo(() => { return [ { width: calendarWidth, minHeight: calendarHeight, }, style.current.calendar, propsStyle, ]; }, [calendarWidth, calendarHeight, propsStyle]); const textStyle = useMemo(() => { return [calendarStyle, style.current.placeholderText]; }, [calendarStyle]); const _onPressArrowLeft = useCallback( (method: () => void, month?: XDate) => { const monthClone = month?.clone(); if (monthClone) { if (onPressArrowLeft) { onPressArrowLeft(method, monthClone); } else if (scrollToMonth) { const currentMonth = monthClone.getMonth(); monthClone.addMonths(-1); // Make sure we actually get the previous month, not just 30 days before currentMonth. while (monthClone.getMonth() === currentMonth) { monthClone.setDate(monthClone.getDate() - 1); } scrollToMonth(monthClone); } } }, [onPressArrowLeft, scrollToMonth] ); const _onPressArrowRight = useCallback( (method: () => void, month?: XDate) => { const monthClone = month?.clone(); if (monthClone) { if (onPressArrowRight) { onPressArrowRight(method, monthClone); } else if (scrollToMonth) { monthClone.addMonths(1); scrollToMonth(monthClone); } } }, [onPressArrowRight, scrollToMonth] ); if (!visible) { return {dateString}; } return ( ); }); export default CalendarListItem; CalendarListItem.displayName = 'CalendarListItem';