import React, { Fragment, useCallback, useRef } from 'react'; import { TouchableOpacity, Text, View, ViewProps } from 'react-native'; import { xdateToData } from '../../../interface'; import { Theme, DayState, MarkingTypes, DateData } from '../../../types'; import styleConstructor from './style'; import Marking, { MarkingProps } from '../marking'; export interface BasicDayProps extends ViewProps { state?: DayState; /** The marking object */ marking?: MarkingProps; /** Date marking style [dot/multi-dot/period/multi-period]. Default = 'dot' */ markingType?: MarkingTypes; /** Theme object */ theme?: Theme; /** onPress callback */ onPress?: (date?: DateData) => void; /** onLongPress callback */ onLongPress?: (date?: DateData) => void; /** The date to return from press callbacks */ date?: string; /** Disable all touch events for disabled days. can be override with disableTouchEvent in markedDates*/ disableAllTouchEventsForDisabledDays?: boolean; /** Disable all touch events for inactive days. can be override with disableTouchEvent in markedDates*/ disableAllTouchEventsForInactiveDays?: boolean; /** Test ID */ testID?: string; /** Accessibility label */ accessibilityLabel?: string; } const BasicDay = (props: BasicDayProps) => { const { theme, date, onPress, onLongPress, markingType, marking, state, disableAllTouchEventsForDisabledDays, disableAllTouchEventsForInactiveDays, accessibilityLabel, children, testID, } = props; const style = useRef(styleConstructor(theme)); const _marking = marking || {}; const isSelected = _marking.selected || state === 'selected'; const isDisabled = typeof _marking.disabled !== 'undefined' ? _marking.disabled : state === 'disabled'; const isInactive = _marking?.inactive; const isToday = state === 'today'; const isMultiDot = markingType === Marking.markings.MULTI_DOT; const isMultiPeriod = markingType === Marking.markings.MULTI_PERIOD; const isCustom = markingType === Marking.markings.CUSTOM; const dateData = date ? xdateToData(date) : undefined; const shouldDisableTouchEvent = () => { const { disableTouchEvent } = _marking; let disableTouch = false; if (typeof disableTouchEvent === 'boolean') { disableTouch = disableTouchEvent; } else if ( typeof disableAllTouchEventsForDisabledDays === 'boolean' && isDisabled ) { disableTouch = disableAllTouchEventsForDisabledDays; } else if ( typeof disableAllTouchEventsForInactiveDays === 'boolean' && isInactive ) { disableTouch = disableAllTouchEventsForInactiveDays; } return disableTouch; }; const getContainerStyle = () => { const { customStyles, selectedColor } = _marking; const styles = [style.current.base]; if (isSelected) { styles.push(style.current.selected); if (selectedColor) { styles.push({ backgroundColor: selectedColor }); } } else if (isToday) { styles.push(style.current.today); } //Custom marking type if (isCustom && customStyles && customStyles.container) { if (customStyles.container.borderRadius === undefined) { customStyles.container.borderRadius = 16; } styles.push(customStyles.container); } return styles; }; const getTextStyle = () => { const { customStyles, selectedTextColor } = _marking; const styles = [style.current.text]; if (isSelected) { styles.push(style.current.selectedText); if (selectedTextColor) { styles.push({ color: selectedTextColor }); } } else if (isDisabled) { styles.push(style.current.disabledText); } else if (isToday) { styles.push(style.current.todayText); } else if (isInactive) { styles.push(style.current.inactiveText); } //Custom marking type if (isCustom && customStyles && customStyles.text) { styles.push(customStyles.text); } return styles; }; const _onPress = useCallback(() => { onPress?.(dateData); }, [onPress, date]); const _onLongPress = useCallback(() => { onLongPress?.(dateData); }, [onLongPress, date]); const renderMarking = () => { const { marked, dotColor, dots, periods } = _marking; return ( ); }; const renderText = () => { return ( {String(children)} ); }; const renderContent = () => { return ( {renderText()} {renderMarking()} ); }; const renderContainer = () => { const { activeOpacity } = _marking; return ( {isMultiPeriod ? renderText() : renderContent()} ); }; const renderPeriodsContainer = () => { return ( {renderContainer()} {renderMarking()} ); }; return isMultiPeriod ? renderPeriodsContainer() : renderContainer(); }; export default BasicDay; BasicDay.displayName = 'BasicDay';