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';