txend-react-native-ui-datepicker
Version:
Customizable multi-date range datetime picker for React Native
121 lines • 4.23 kB
JavaScript
import React, { useMemo, useCallback } from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { useCalendarContext } from '../CalendarContext';
import Day, { EmptyDay } from './Day';
import { getParsedDate, getMonthDays, getWeekdaysMin, areDatesOnSameDay, getDate, getFormated, swapTime } from '../utils';
import moment from 'moment';
const DaySelector = () => {
var _getWeekdaysMin;
const {
currentDate,
selectedDate,
selectedDateTo,
onSelectDate,
onSelectDateTo,
displayFullDays,
minimumDate,
maximumDate,
firstDayOfWeek,
theme
} = useCalendarContext();
const {
year,
month,
hour,
minute
} = getParsedDate(new Date());
const daysGrid = useMemo(() => {
const today = new Date();
return getMonthDays(currentDate, displayFullDays, minimumDate, maximumDate, firstDayOfWeek).map(day => {
return day ? {
...day,
isToday: areDatesOnSameDay(day.date, today),
isSelected: areDatesOnSameDay(day.date, selectedDate),
isSelectedTo: areDatesOnSameDay(day.date, selectedDateTo)
} : null;
});
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[month, year, displayFullDays, minimumDate, maximumDate, selectedDate, selectedDateTo]);
const handleSelectDate = useCallback(date => {
const newDate = getDate(date).hour(hour).minute(minute + getDate(date).utcOffset());
const currentDateToday = moment().format('YYYY-MM-DD h:mm');
const newDateString = moment(date).format('YYYY-MM-DD h:mm');
const swappedDate = swapTime(newDateString, currentDateToday);
if (selectedDate === null && selectedDateTo === null) {
onSelectDate(swappedDate);
} else if (selectedDate != null && selectedDateTo === null) {
if (newDate.isBefore(selectedDate)) {
onSelectDate(swappedDate);
onSelectDateTo(selectedDate, swappedDate);
} else {
onSelectDateTo(swappedDate, selectedDate);
}
} else if (selectedDate != null && selectedDateTo != null && selectedDate !== selectedDateTo) {
onSelectDate(swappedDate);
onSelectDateTo(null, null);
} else if (getFormated(selectedDate) === getFormated(selectedDateTo)) {
onSelectDate(swappedDate);
onSelectDateTo(null, null);
} else {}
}, [onSelectDate, onSelectDateTo, hour, minute, selectedDate, selectedDateTo]);
return /*#__PURE__*/React.createElement(View, {
style: styles.container,
testID: "day-selector"
}, /*#__PURE__*/React.createElement(View, {
style: [styles.weekDaysContainer, theme === null || theme === void 0 ? void 0 : theme.weekDaysContainerStyle],
testID: "week-days"
}, (_getWeekdaysMin = getWeekdaysMin(firstDayOfWeek)) === null || _getWeekdaysMin === void 0 ? void 0 : _getWeekdaysMin.map((item, index) => /*#__PURE__*/React.createElement(View, {
key: index,
style: styles.weekDayCell
}, /*#__PURE__*/React.createElement(Text, {
style: theme === null || theme === void 0 ? void 0 : theme.weekDaysTextStyle
}, item)))), /*#__PURE__*/React.createElement(View, {
style: styles.daysContainer,
testID: "days"
}, daysGrid === null || daysGrid === void 0 ? void 0 : daysGrid.map((day, index) => {
return day ? /*#__PURE__*/React.createElement(Day, {
key: index,
date: day.date,
text: day.text,
disabled: day.disabled,
isCurrentMonth: day.isCurrentMonth,
theme: theme,
isToday: day.isToday,
isSelected: day.isSelected,
isSelectedTo: day.isSelectedTo,
onSelectDate: handleSelectDate
}) : /*#__PURE__*/React.createElement(EmptyDay, {
key: index
});
})));
};
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 1,
width: '100%'
},
weekDaysContainer: {
width: '100%',
flexDirection: 'row',
paddingBottom: 15,
paddingTop: 10,
alignItems: 'center'
},
weekDayCell: {
width: '14.2%',
alignItems: 'center',
justifyContent: 'center'
},
daysContainer: {
flex: 1,
width: '100%',
height: '100%',
flexWrap: 'wrap',
flexDirection: 'row',
alignContent: 'flex-start'
}
});
export default DaySelector;
//# sourceMappingURL=DaySelector.js.map