@fruits-chain/react-native-xiaoshu
Version:
🌈 React Native UI library
155 lines (146 loc) • 5.24 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _index = require("../hooks/index.js");
var _index2 = _interopRequireDefault(require("../locale/index.js"));
var _helper = require("./helper.js");
var _useDateMinMax = _interopRequireDefault(require("./useDateMinMax.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const buildColumnData = (mode, start, end, renderLabel
// eslint-disable-next-line max-params
) => {
const items = [];
for (let index = start; index <= end; index++) {
items.push({
value: index,
label: renderLabel(mode, index)
});
}
return items;
};
const useDatePicker = ({
mode,
value,
onChange,
min,
max,
renderLabel
}) => {
const locale = _index2.default.useLocale().DatePickerView;
const modes = (0, _react.useMemo)(() => (0, _helper.serializeMode)(mode.split('-')), [mode]);
const [minDate, maxDate] = (0, _useDateMinMax.default)(mode, min, max);
const renderLabelPersistFn = (0, _index.usePersistFn)((t, n) => {
if (renderLabel) {
return renderLabel(t, n);
}
switch (t) {
case 'Y':
return `${n}${locale.labelYear}`;
case 'M':
return `${n}${locale.labelMonth}`;
case 'D':
return `${n}${locale.labelDay}`;
case 'h':
return `${n}${locale.labelHour}`;
case 'm':
return `${n}${locale.labelMinute}`;
case 's':
return `${n}${locale.labelSecond}`;
default:
return `${n}`;
}
});
const [pickerValues, pickerColumns] = (0, _react.useMemo)(() => {
const _columns = [];
const _values = [];
const boundary = (0, _helper.getDateBoundary)(value, modes, {
defaultMin: minDate,
defaultMax: maxDate,
min,
max
});
const valueDateObject = (0, _helper.toDateObject)(value);
// 根据格式化方式挑选值
_helper.COLUMN_SERIALIZE_TYPES.forEach(key => {
const ab = boundary[key];
const a = key === 'M' ? ab[0] + 1 : ab[0];
const b = key === 'M' ? ab[1] + 1 : ab[1];
const v = key === 'M' ? valueDateObject[key] + 1 : valueDateObject[key];
_values.push(v);
_columns.push(buildColumnData(key, a, b, renderLabelPersistFn));
});
// 挑选值
const _pickerColumns = [];
const _pickerValues = [];
modes.forEach(key => {
const keyIndex = _helper.COLUMN_SERIALIZE_TYPES.findIndex(cst => cst === key);
_pickerColumns.push(_columns[keyIndex]);
_pickerValues.push(_values[keyIndex]);
});
return [_pickerValues, _pickerColumns];
}, [max, maxDate, min, minDate, modes, renderLabelPersistFn, value]);
const onChangePicker = (0, _index.usePersistFn)(v => {
// console.log('values =>>>> ', v)
const newValue = new Date(value);
modes.forEach((key, index) => {
const num = v[index];
switch (key) {
case 'Y':
newValue.setFullYear(num);
break;
case 'M':
{
// 对 D 进行修正
const days = (0, _helper.getMonthDays)(newValue.getFullYear(), num);
const valueDays = newValue.getDate();
newValue.setMonth(num - 1, valueDays > days ? days : valueDays);
break;
}
case 'D':
{
// 对 D 进行修正
const days = (0, _helper.getMonthDays)(newValue.getFullYear(), newValue.getMonth() + 1);
newValue.setDate(num > days ? days : num);
break;
}
case 'h':
newValue.setHours(num);
break;
case 'm':
newValue.setMinutes(num);
break;
case 's':
newValue.setSeconds(num);
break;
default:
break;
}
});
// console.log('newValue???? => ', toDateObject(newValue))
// // 最后边界值判断
// const _minDate = isDate(min) ? min : defaultMinDate
// const _maxDate = isDate(max) ? max : defaultMaxDate
const finallyValue = newValue.getTime() >= minDate.getTime() && newValue.getTime() <= maxDate.getTime() ? newValue : newValue.getTime() < minDate.getTime() ? minDate : maxDate;
// console.log('_minDate => ', toDateObject(_minDate))
// console.log('_maxDate => ', toDateObject(_maxDate))
// console.log('newValue => ', toDateObject(newValue))
// console.log('_minDate t => ', _minDate.getTime())
// console.log('_maxDate t => ', _maxDate.getTime())
// console.log('newValue t => ', newValue.getTime())
// console.log('finallyValue => ', toDateObject(finallyValue))
// console.log(
// newValue.getTime() >= _minDate.getTime() &&
// newValue.getTime() <= _maxDate.getTime(),
// )
// console.log(newValue.getTime() < _minDate.getTime())
// console.log('finallyValue =>>>> ', finallyValue.toString())
// console.log('finallyValue =========>>>>>>>>>>>>>>>>>>>>>>>>>')
onChange(finallyValue);
});
return [pickerValues, pickerColumns, onChangePicker, minDate, maxDate];
};
var _default = exports.default = useDatePicker;
//# sourceMappingURL=useDatePicker.js.map
;