rn-select-date-range
Version:
A simple and fully customizable React Native date range picker component
128 lines (127 loc) • 6.52 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import React, { useState } from "react";
import { View, Text, StyleSheet, Pressable, } from "react-native";
import moment from "moment";
import Month from "./Month";
import Button from "./Button";
require("moment/min/locales.min");
var DateRangePicker = function (_a) {
var onSelectDateRange = _a.onSelectDateRange, responseFormat = _a.responseFormat, maxDate = _a.maxDate, minDate = _a.minDate, blockSingleDateSelection = _a.blockSingleDateSelection, font = _a.font, selectedDateContainerStyle = _a.selectedDateContainerStyle, selectedDateStyle = _a.selectedDateStyle, _b = _a.ln, ln = _b === void 0 ? "en" : _b, onConfirm = _a.onConfirm, onClear = _a.onClear, _c = _a.clearBtnTitle, clearBtnTitle = _c === void 0 ? "Clear" : _c, _d = _a.confirmBtnTitle, confirmBtnTitle = _d === void 0 ? "OK" : _d;
var _e = useState(moment()), selectedDate = _e[0], setSelectedDate = _e[1];
var _f = useState(null), firstDate = _f[0], setFirstDate = _f[1];
var _g = useState(null), secondDate = _g[0], setSecondDate = _g[1];
var lastMonth = selectedDate.clone().subtract(1, "months");
var lastYear = selectedDate.clone().subtract(1, "years");
var nextMonth = selectedDate.clone().add(1, "months");
var nextYear = selectedDate.clone().add(1, "years");
moment.locale(ln);
var returnSelectedRange = function (fd, ld) {
var isWrongSide = ld === null || ld === void 0 ? void 0 : ld.isBefore(fd);
if (responseFormat) {
onSelectDateRange({
firstDate: isWrongSide
? ld.format(responseFormat)
: fd.format(responseFormat),
secondDate: isWrongSide
? fd.format(responseFormat)
: ld.format(responseFormat),
});
}
else {
onSelectDateRange({
firstDate: isWrongSide ? ld : fd,
secondDate: isWrongSide ? fd : ld,
});
}
};
var onSelectDate = function (date) {
if (blockSingleDateSelection &&
((firstDate === null || firstDate === void 0 ? void 0 : firstDate.isSame(date, "dates")) || (secondDate === null || secondDate === void 0 ? void 0 : secondDate.isSame(date, "dates")))) {
return;
}
if (!firstDate) {
setFirstDate(date);
}
else {
if (!secondDate) {
setSecondDate(date);
returnSelectedRange(firstDate, date);
}
else {
setFirstDate(secondDate);
setSecondDate(date);
returnSelectedRange(secondDate, date);
}
}
};
var onPressClear = function () {
setFirstDate(null);
setSecondDate(null);
onSelectDateRange({
firstDate: "",
secondDate: "",
});
if (onClear) {
onClear();
}
};
var onPressConfirm = function () {
if (onConfirm) {
onConfirm();
}
};
var isDateSelected = function () { return firstDate === null || secondDate === null; };
return (React.createElement(View, null,
React.createElement(View, { style: styles.titleRow },
React.createElement(Button, { font: font, disabled: minDate ? lastYear.isBefore(minDate, "months") : false, label: "< ".concat(lastYear.format("YYYY")), onPress: function () { return setSelectedDate(lastYear); } }),
React.createElement(Text, { style: __assign(__assign({}, styles.title), { fontFamily: font }) }, selectedDate.format("YYYY")),
React.createElement(Button, { font: font, disabled: maxDate ? nextYear.isAfter(maxDate, "months") : false, label: "".concat(nextYear.format("YYYY"), " >"), onPress: function () { return setSelectedDate(nextYear); }, align: "right" })),
React.createElement(View, { style: styles.titleRow },
React.createElement(Button, { font: font, disabled: minDate ? lastMonth.isBefore(minDate, "months") : false, label: "< ".concat(lastMonth.locale(ln).format("MMM")), onPress: function () { return setSelectedDate(lastMonth); } }),
React.createElement(Text, { style: __assign(__assign({}, styles.title), { fontFamily: font }) }, selectedDate.locale(ln).format("MMMM")),
React.createElement(Button, { font: font, disabled: maxDate ? nextMonth.isAfter(maxDate, "months") : false, label: "".concat(nextMonth.locale(ln).format("MMM"), " >"), onPress: function () { return setSelectedDate(nextMonth); }, align: "right" })),
React.createElement(Month, { font: font, selectedDate: selectedDate, onSelectDate: onSelectDate, firstDate: firstDate, secondDate: secondDate, maxDate: maxDate, minDate: minDate, selectedDateContainerStyle: selectedDateContainerStyle, selectedDateStyle: selectedDateStyle }),
React.createElement(View, { style: styles.actionButtonsContainer },
confirmBtnTitle ? React.createElement(View, null,
React.createElement(Pressable, { onPress: onPressConfirm, style: [styles.actionBtn] },
React.createElement(Text, { style: { fontFamily: font } }, confirmBtnTitle))) : null,
clearBtnTitle ? React.createElement(View, null,
React.createElement(Pressable, { disabled: isDateSelected(), onPress: onPressClear, style: [styles.actionBtn, { opacity: isDateSelected() ? 0.3 : 1 }] },
React.createElement(Text, { style: { fontFamily: font } }, clearBtnTitle))) : null)));
};
export default DateRangePicker;
var styles = StyleSheet.create({
titleRow: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
backgroundColor: "#EEE",
marginBottom: 5,
padding: 5,
borderRadius: 5,
},
title: {
fontSize: 20,
flex: 1,
textAlign: "center",
},
actionBtn: {
paddingVertical: 3,
paddingHorizontal: 10,
},
actionButtonsContainer: {
flexDirection: "row",
justifyContent: "space-between",
paddingVertical: 5,
}
});