zarm
Version:
基于 React 的移动端UI库
185 lines (154 loc) • 7.01 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _bem = require("@zarm-design/bem");
var _dayjs = _interopRequireDefault(require("dayjs"));
var _react = _interopRequireWildcard(require("react"));
var _configProvider = require("../config-provider");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n.default = e, t && t.set(e, n), n; }
var CalendarMonthView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
var _globalLocal$Calendar;
var dateRender = props.dateRender,
min = props.min,
max = props.max,
disabledDate = props.disabledDate,
onDateClick = props.onDateClick,
dateMonth = props.dateMonth,
value = props.value,
mode = props.mode;
var _useContext = (0, _react.useContext)(_configProvider.ConfigContext),
prefixCls = _useContext.prefixCls,
globalLocal = _useContext.locale;
var weekStartsOn = globalLocal === null || globalLocal === void 0 ? void 0 : globalLocal.Calendar.weekStartsOn;
var bem = (0, _bem.createBEM)('calendar', {
prefixCls: prefixCls
});
var monthRef = (0, _react.useRef)();
var isDisabled = (0, _react.useCallback)(function (date) {
return (0, _dayjs.default)(date).isBefore((0, _dayjs.default)(min), 'day') || (0, _dayjs.default)(date).isAfter((0, _dayjs.default)(max), 'day') || typeof disabledDate === 'function' && disabledDate(date);
}, [min, max, disabledDate]);
var isSelected = (0, _react.useCallback)(function (date) {
var currentDate = (0, _dayjs.default)(date);
return mode === 'single' ? value[0] && currentDate.isSame((0, _dayjs.default)(value[0]), 'day') : value.some(function (item) {
return item ? currentDate.isSame((0, _dayjs.default)(item), 'day') : false;
});
}, [mode, value]);
var range = (0, _react.useCallback)(function (date) {
if (mode !== 'range') {
return '';
}
var currentDate = (0, _dayjs.default)(date);
var start = value[0];
var end = value[value.length - 1];
if (currentDate.isAfter((0, _dayjs.default)(start)) && currentDate.isBefore((0, _dayjs.default)(end))) {
return 'range';
}
if (value.length > 1 && !(0, _dayjs.default)(start).isSame((0, _dayjs.default)(end))) {
if (currentDate.isSame((0, _dayjs.default)(start), 'day') && start) {
return 'start';
}
if (currentDate.isSame((0, _dayjs.default)(end), 'day') && end) {
return 'end';
}
}
return '';
}, [mode, value]);
var hanlerDateClick = (0, _react.useCallback)(function (date) {
if (!isDisabled(date) && typeof onDateClick === 'function') {
onDateClick(date);
}
}, [onDateClick]);
var renderDay = function renderDay(day, year, month, firstDay) {
var date = new Date(year, month, day);
var dayjsDate = (0, _dayjs.default)(date);
var isToday = (0, _dayjs.default)().isSame(dayjsDate, 'day');
var text = '';
if (typeof dateRender === 'function') {
text = dateRender(date, value);
if ((0, _typeof2.default)(text) === 'object' && ! /*#__PURE__*/(0, _react.isValidElement)(text)) {
console.warn('dateRender函数返回数据类型错误,请返回基本数据类型或者reactNode');
text = '';
}
}
var style = day === 1 ? {
marginLeft: "".concat(14.28571 * firstDay, "%")
} : {};
var rangeStatus = range(date);
var className = bem('day', [{
disabled: isDisabled(date),
today: isToday,
selected: isSelected(date) && rangeStatus !== 'range',
range: rangeStatus === 'range',
d6: (day + firstDay) % 7 === 0 && !!rangeStatus,
d7: (day + firstDay) % 7 === 1 && !!rangeStatus,
start: rangeStatus === 'start',
end: rangeStatus === 'end',
last: rangeStatus === 'end' && (day === 1 || (day + firstDay) % 7 === 1),
first: rangeStatus === 'start' && (dayjsDate.daysInMonth() === day || (day + firstDay) % 7 === 0)
}]);
return /*#__PURE__*/_react.default.createElement("li", {
key: "".concat(year, "-").concat(month, "-").concat(day),
className: className,
style: style,
onClick: function onClick() {
return hanlerDateClick(date);
}
}, text && /*#__PURE__*/_react.default.createElement("div", {
className: bem('day__content')
}, text) || '');
};
var renderDays = function renderDays(year, month) {
var date = (0, _dayjs.default)().year(year).month(month).date(1);
var daysInMonth = date.daysInMonth();
var firstDay = date.day();
if (weekStartsOn !== 'Sunday') {
firstDay = firstDay === 0 ? firstDay + 6 : firstDay - 1;
}
var days = [];
var i = 1;
while (i <= daysInMonth) {
days.push(renderDay(i, year, month, firstDay));
i += 1;
}
return days;
};
(0, _react.useImperativeHandle)(ref, function () {
return {
el: function el() {
return monthRef.current;
}
};
});
var year = dateMonth.getFullYear();
var month = dateMonth.getMonth();
var monthKey = "".concat(year, "-").concat(month);
var title = (0, _dayjs.default)().year(year).month(month).format(globalLocal === null || globalLocal === void 0 ? void 0 : (_globalLocal$Calendar = globalLocal.Calendar) === null || _globalLocal$Calendar === void 0 ? void 0 : _globalLocal$Calendar.yearMonthFormat);
return /*#__PURE__*/_react.default.createElement("div", {
key: monthKey,
className: bem('month__wrapper'),
ref: monthRef,
title: title
}, /*#__PURE__*/_react.default.createElement("div", {
className: bem('month')
}, title), /*#__PURE__*/_react.default.createElement("ul", null, renderDays(year, month)));
});
CalendarMonthView.defaultProps = {
value: [],
dateMonth: new Date(),
min: new Date(),
max: new Date(),
dateRender: function dateRender(date) {
return date.getDate();
},
disabledDate: function disabledDate() {
return false;
}
};
var _default = /*#__PURE__*/_react.default.memo(CalendarMonthView);
exports.default = _default;
;