import XDate from 'xdate';
import values from 'lodash/values';
import PropTypes from 'prop-types';
import React, { Fragment, useCallback, useRef } from 'react';
import { TouchableOpacity, Text, View, ViewProps, ViewStyle } 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 [simple/period/multi-dot/multi-period]. Default = 'simple' */
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?: any;
/** 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;
children?: any,
fromDate?: any,
toDate?: any,
txtStyle?: ViewStyle
}
const BasicDay = (props: BasicDayProps) => {
const {
theme,
date,
onPress,
onLongPress,
markingType,
marking,
state,
disableAllTouchEventsForDisabledDays,
disableAllTouchEventsForInactiveDays,
accessibilityLabel,
children,
testID,
fromDate,
toDate,
txtStyle
} = props;
const style = useRef(styleConstructor(theme));
const _marking = marking || {};
const isSelected = _marking.selected || state === 'selected';
const isSelectedBetween = state === "inactive"
const isDisabled = typeof _marking.disabled !== 'undefined' ? _marking.disabled : state === 'disabled' || state === "disableToday";
const isInactive = _marking?.inactive;
const isToday = state === 'today' || state === "disableToday";
const isCustom = markingType === Marking.markings.CUSTOM;
const dateData = date ? xdateToData(new XDate(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 (isSelectedBetween) {
styles.push(style.current.selectedBetween);
} 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, txtStyle && txtStyle];
if (isSelected) {
styles.push(style.current.selectedText);
if (selectedTextColor) {
styles.push({ color: selectedTextColor })
}
} else if (isDisabled) {
styles.push(style.current.disabledText);
txtStyle && styles.push(txtStyle);
} 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 getfillersRightStyle = () => {
if (fromDate && toDate) {
const dateCurrent = new XDate(date, true).setHours(0)
let fromDateSelect = new XDate(fromDate, true).setHours(0)
let toDateSelect = new XDate(toDate, true).setHours(0)
if (dateCurrent >= fromDateSelect && dateCurrent < toDateSelect) {
return style.current.selectedBetween
}
}
return null
}
const getfillersLeftStyle = () => {
if (fromDate && toDate) {
const dateCurrent = new XDate(date, true).setHours(0)
let fromDateSelect = new XDate(fromDate, true).setHours(0)
let toDateSelect = new XDate(toDate, true).setHours(0)
if (dateCurrent > fromDateSelect && dateCurrent <= toDateSelect) {
return style.current.selectedBetween
}
}
return null
}
const getViewDisableStyle = () => {
const styles = []
if (isDisabled) {
styles.push([style.current.lineTextDisable, txtStyle && { backgroundColor: "#FFFFFF" }]);
}
return styles;
};
const checkDisableBtn = () => {
if (isDisabled) return true
return false
}
const _onPress = useCallback(() => {
onPress?.(dateData);
}, [onPress, date]);
const _onLongPress = useCallback(() => {
onLongPress?.(dateData);
}, [onLongPress, date]);
const renderText = () => {
return (
{String(children)}
);
};
const renderContent = () => {
return (
{renderText()}
{/* {renderMarking()} */}
);
};
const renderContainer = () => {
const { activeOpacity } = _marking;
return (
<>
{renderContent()}
>
);
};
const renderPeriodsContainer = () => {
return (
{renderContainer()}
{/* {renderMarking()} */}
);
};
return renderPeriodsContainer()
};
export default BasicDay;
BasicDay.displayName = 'BasicDay';
BasicDay.propTypes = {
state: PropTypes.oneOf(['selected', 'disabled', 'inactive', 'today', '']),
marking: PropTypes.any,
markingType: PropTypes.oneOf(values(Marking.markings)),
theme: PropTypes.object,
onPress: PropTypes.func,
onLongPress: PropTypes.func,
date: PropTypes.string,
disableAllTouchEventsForDisabledDays: PropTypes.bool,
disableAllTouchEventsForInactiveDays: PropTypes.bool
};