vantui-edit
Version:
一套适用于Taro3及React的vantui组件库
390 lines (341 loc) • 13.6 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
var _excluded = ["value", "filter", "type", "showToolbar", "formatter", "minDate", "maxDate", "minHour", "maxHour", "minMinute", "maxMinute", "title", "itemHeight", "visibleItemCount", "confirmButtonText", "cancelButtonText", "onInput", "onChange", "onCancel", "onConfirm"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { useState, useCallback, useRef, useLayoutEffect, forwardRef, useImperativeHandle } from 'react';
import { nextTick } from '@tarojs/taro';
import VanPicker from '../picker/index';
import * as utils from '../wxs/utils';
import { defaultFormatter, getMonthEndDay, getTrueValue, times, padZero, range, isValidDate, currentYear } from './wxs';
import { jsx as _jsx } from "react/jsx-runtime";
export function DatetimePicker(props, ref) {
var _props$value = props.value,
value = _props$value === void 0 ? null : _props$value,
filter = props.filter,
_props$type = props.type,
type = _props$type === void 0 ? 'datetime' : _props$type,
_props$showToolbar = props.showToolbar,
showToolbar = _props$showToolbar === void 0 ? true : _props$showToolbar,
_props$formatter = props.formatter,
formatter = _props$formatter === void 0 ? defaultFormatter : _props$formatter,
_props$minDate = props.minDate,
minDate = _props$minDate === void 0 ? new Date(currentYear - 10, 0, 1).getTime() : _props$minDate,
_props$maxDate = props.maxDate,
maxDate = _props$maxDate === void 0 ? new Date(currentYear + 10, 11, 31).getTime() : _props$maxDate,
_props$minHour = props.minHour,
minHour = _props$minHour === void 0 ? 0 : _props$minHour,
_props$maxHour = props.maxHour,
maxHour = _props$maxHour === void 0 ? 23 : _props$maxHour,
_props$minMinute = props.minMinute,
minMinute = _props$minMinute === void 0 ? 0 : _props$minMinute,
_props$maxMinute = props.maxMinute,
maxMinute = _props$maxMinute === void 0 ? 59 : _props$maxMinute,
title = props.title,
itemHeight = props.itemHeight,
visibleItemCount = props.visibleItemCount,
confirmButtonText = props.confirmButtonText,
cancelButtonText = props.cancelButtonText,
onInput = props.onInput,
onChange = props.onChange,
onCancel = props.onCancel,
_onConfirm = props.onConfirm,
others = _objectWithoutProperties(props, _excluded);
var PickRef = useRef({});
var _useState = useState(Date.now()),
_useState2 = _slicedToArray(_useState, 2),
innerValue = _useState2[0],
setInnerValue = _useState2[1];
var _useState3 = useState([]),
_useState4 = _slicedToArray(_useState3, 2),
columns = _useState4[0],
setColumns = _useState4[1];
var minHour_ = minHour;
var maxHour_ = maxHour;
var minMinute_ = minMinute;
var maxMinute_ = maxMinute;
var getPicker = useCallback(function () {
if (PickRef.current) {
var setColumnValues = PickRef.current.setColumnValues;
PickRef.current.setColumnValues = function () {
return (// @ts-ignore
setColumnValues.apply(PickRef.current, [arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2], false])
);
};
}
return PickRef.current;
}, []);
var getBoundary = useCallback(function (type, innerValue) {
var _ref;
var value = new Date(innerValue);
var yearDate = "".concat(type, "Date") === 'maxDate' ? maxDate : minDate;
var boundary = new Date(yearDate);
var year = boundary.getFullYear();
var month = 1;
var date = 1;
var hour = 0;
var minute = 0;
if (type === 'max') {
month = 12;
date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
hour = 23;
minute = 59;
}
if (value.getFullYear() === year) {
month = boundary.getMonth() + 1;
if (value.getMonth() + 1 === month) {
date = boundary.getDate();
if (value.getDate() === date) {
hour = boundary.getHours();
if (value.getHours() === hour) {
minute = boundary.getMinutes();
}
}
}
}
return _ref = {}, _defineProperty(_ref, "".concat(type, "Year"), year), _defineProperty(_ref, "".concat(type, "Month"), month), _defineProperty(_ref, "".concat(type, "Date"), date), _defineProperty(_ref, "".concat(type, "Hour"), hour), _defineProperty(_ref, "".concat(type, "Minute"), minute), _ref;
}, [maxDate, minDate]);
var getRanges = useCallback(function (nowValue) {
var res = [{
type: 'hour',
range: [minHour_, maxHour_]
}, {
type: 'minute',
range: [minMinute_, maxMinute_]
}];
if (type === 'time') {
return res;
}
var _getBoundary = getBoundary('max', nowValue || innerValue),
maxYear = _getBoundary.maxYear,
maxDate = _getBoundary.maxDate,
maxMonth = _getBoundary.maxMonth,
maxHour = _getBoundary.maxHour,
maxMinute = _getBoundary.maxMinute;
var _getBoundary2 = getBoundary('min', nowValue || innerValue),
minYear = _getBoundary2.minYear,
minDate = _getBoundary2.minDate,
minMonth = _getBoundary2.minMonth,
minHour = _getBoundary2.minHour,
minMinute = _getBoundary2.minMinute;
var result = [{
type: 'year',
range: [minYear, maxYear]
}, {
type: 'month',
range: [minMonth, maxMonth]
}, {
type: 'day',
range: [minDate, maxDate]
}, {
type: 'hour',
range: [minHour, maxHour]
}, {
type: 'minute',
range: [minMinute, maxMinute]
}];
if (type === 'date') result.splice(3, 2);
if (type === 'year-month') result.splice(2, 3);
return result;
}, [getBoundary, innerValue, maxHour_, maxMinute_, minHour_, minMinute_, type]);
var getOriginColumns = useCallback(function (nowValue) {
var results = getRanges(nowValue).map(function (_ref2) {
var type = _ref2.type,
range = _ref2.range;
var values = times(range[1] - range[0] + 1, function (index) {
var value = range[0] + index;
return type === 'year' ? "".concat(value) : padZero(value);
});
if (filter) {
values = filter(type, values);
}
return {
type: type,
values: values
};
});
return results;
}, [filter, getRanges]);
var updateColumns = useCallback(function (nowValue) {
var results = getOriginColumns(nowValue).map(function (column) {
return {
values: column.values.map(function (value) {
return formatter(column.type, value);
})
};
});
return setColumns(results);
}, [formatter, getOriginColumns]);
var updateColumnValue = useCallback(function (value) {
var values = [];
var picker = getPicker();
if (type === 'time') {
var pair = value.split(':');
values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
} else {
var date = new Date(value);
values = [formatter('year', "".concat(date.getFullYear())), formatter('month', padZero(date.getMonth() + 1))];
if (type === 'date') {
values.push(formatter('day', padZero(date.getDate())));
}
if (type === 'datetime') {
values.push(formatter('day', padZero(date.getDate())), formatter('hour', padZero(date.getHours())), formatter('minute', padZero(date.getMinutes())));
}
}
updateColumns(value);
nextTick(function () {
setInnerValue(value);
});
return new Promise(function (resolve) {
setTimeout(function () {
nextTick(function () {
picker.setValues(values);
resolve("".concat(value));
});
}, 6);
});
}, [formatter, getPicker, type, updateColumns]);
var correctValue = useCallback(function (value) {
// validate value
var isDateType = type !== 'time';
if (isDateType && !isValidDate(value)) {
value = minDate;
} else if (!isDateType && !value) {
value = "".concat(padZero(minHour), ":00");
} // time type
if (!isDateType) {
var _value$split = value.split(':'),
_value$split2 = _slicedToArray(_value$split, 2),
hour = _value$split2[0],
minute = _value$split2[1];
hour = padZero(range(hour, minHour, maxHour));
minute = padZero(range(minute, minMinute, maxMinute));
return "".concat(hour, ":").concat(minute);
} // date type
value = Math.max(value, minDate);
value = Math.min(value, maxDate);
return value;
}, [maxDate, maxHour, maxMinute, minDate, minHour, minMinute, type]); // useLayoutEffect(
// function () {
// const val = correctValue(value)
// updateColumnValue(val)
// },
// // eslint-disable-next-line react-hooks/exhaustive-deps
// [correctValue],
// )
useLayoutEffect(function () {
var val = correctValue(value);
var isEqual = val === innerValue;
if (!isEqual) {
updateColumnValue(val).then(function () {
if (onInput) {
onInput({
detail: val,
currentTarget: {
dataset: {
type: type
}
}
});
}
});
}
}, // eslint-disable-next-line react-hooks/exhaustive-deps
[type, minDate, maxDate, minHour, maxHour, minMinute, maxMinute]);
var onChange_ = function onChange_(e) {
var valueArr = e.detail.value;
var value;
var picker = getPicker();
if (type === 'datetime') {
value = new Date("".concat(valueArr[0], "-").concat(valueArr[1], "-").concat(valueArr[2], " ").concat(valueArr[3], ":").concat(valueArr[4])).getTime();
} else if (type === 'date') {
value = new Date("".concat(valueArr[0], "-").concat(valueArr[1], "-").concat(valueArr[2])).getTime();
} else if (type === 'time') {
value = new Date("".concat(valueArr[0], ":").concat(valueArr[1])).getTime();
} else if (type === 'year-month') {
value = new Date("".concat(valueArr[0], "-").concat(valueArr[1])).getTime();
}
var originColumns = getOriginColumns(value);
if (type === 'time') {
var indexes = picker.getIndexes();
value = "".concat(+originColumns[0].values[indexes[0]], ":").concat(+originColumns[1].values[indexes[1]]);
} else {
var _indexes = picker.getIndexes();
var values = _indexes.map(function (value, index) {
return originColumns[index].values[value];
});
var year = getTrueValue(values[0]);
var month = getTrueValue(values[1]);
var _maxDate = getMonthEndDay(year, month);
var date = getTrueValue(values[2]);
if (type === 'year-month') {
date = 1;
}
date = date > _maxDate ? _maxDate : date;
var hour = 0;
var minute = 0;
if (type === 'datetime') {
hour = getTrueValue(values[3]);
minute = getTrueValue(values[4]);
}
value = new Date(year, month - 1, date, hour, minute);
}
value = correctValue(value);
updateColumnValue(value).then(function () {
if (onInput) onInput({
detail: value,
currentTarget: {
dataset: {
type: type
}
}
});
if (onChange) {
var _e = {
detail: {
datetimePicker: {
columns: columns,
setColumns: setColumns,
innerValue: innerValue,
updateColumnValue: updateColumnValue
}
}
};
onChange(_e);
}
});
};
useImperativeHandle(ref, function () {
return {
pickerInstance: PickRef.current,
columns: columns,
setColumns: setColumns,
innerValue: innerValue,
updateColumnValue: updateColumnValue
};
});
return /*#__PURE__*/_jsx(VanPicker, {
ref: PickRef,
className: "van-datetime-picker column-class ".concat(others.className || ''),
style: utils.style([others.style]),
title: title,
columns: columns,
itemHeight: itemHeight,
showToolbar: showToolbar,
visibleItemCount: visibleItemCount,
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButtonText,
onChange: onChange_,
onConfirm: function onConfirm(event) {
if (_onConfirm) _onConfirm({
detail: _objectSpread(_objectSpread({}, event.detail), {}, {
value: innerValue
})
});
},
onCancel: onCancel
});
}
export default /*#__PURE__*/forwardRef(DatetimePicker);