UNPKG

rn-select-date-range

Version:

A simple and fully customizable React Native date range picker component

128 lines (127 loc) 6.52 kB
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, } });