mobile-more
Version:
基于 antd-mobile v5 扩展移动端 UI 组件
215 lines • 9.84 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import React, { useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';
import { isBrowser, mergeObject, tryit } from 'ut2';
import tinycolor from 'tinycolor2';
import { useControllableValue, useLatest } from 'rc-hooks';
import classNames from 'classnames';
import { CheckCircle } from 'doly-icons';
import { Steps } from 'antd-mobile';
import StepForm from './StepForm';
import Submitter from './Submitter';
import StepsFormContext from './StepsFormContext';
import { prefixClass } from '../../../config';
import "./index.css";
import StepFormContext from './StepFormContext';
import { getTimestampString } from '../../../utils/utils';
var Step = Steps.Step;
var prefixCls = "".concat(prefixClass, "-steps-form");
var BizStepsForm = function BizStepsForm(props) {
var _mergedCurrentItem$st, _mergedCurrentItem$st2, _mergedCurrentItem$su;
var _props$defaultCurrent = props.defaultCurrent,
defaultCurrent = _props$defaultCurrent === void 0 ? 0 : _props$defaultCurrent,
_props$changedStepScr = props.changedStepScrollToTop,
changedStepScrollToTop = _props$changedStepScr === void 0 ? true : _props$changedStepScr,
_props$items = props.items,
items = _props$items === void 0 ? [] : _props$items,
_props$showFooter = props.showFooter,
showFooter = _props$showFooter === void 0 ? true : _props$showFooter,
stepsRender = props.stepsRender,
formContentRender = props.formContentRender,
submitterRender = props.submitterRender,
actionRef = props.actionRef,
stepsProps = props.stepsProps,
stepProps = props.stepProps,
submitterProps = props.submitterProps,
formProps = props.formProps,
onPrev = props.onPrev,
onNext = props.onNext,
onFinish = props.onFinish,
className = props.className,
style = props.style,
styles = props.styles;
var _useControllableValue = useControllableValue(props, {
defaultValue: defaultCurrent,
defaultValuePropName: 'defaultCurrent',
valuePropName: 'current',
trigger: 'onCurrentChange'
}),
_useControllableValue2 = _slicedToArray(_useControllableValue, 2),
current = _useControllableValue2[0],
setCurrent = _useControllableValue2[1];
var latestCurrent = useLatest(current);
var uid = useMemo(function () {
return getTimestampString('stepsForm');
}, []);
var rootRef = useRef(null);
var contentRef = useRef(null);
var _useState = useState(),
_useState2 = _slicedToArray(_useState, 2),
colorLight = _useState2[0],
setColorLight = _useState2[1];
var formArrayRef = useRef([]);
var formDataRef = useRef({});
var mergedCurrentItem = _objectSpread({
showFooter: showFooter,
stepsRender: stepsRender,
formContentRender: formContentRender,
submitterRender: submitterRender
}, items[current]);
var handlePrev = function handlePrev() {
var newCurrent = latestCurrent.current > 0 ? latestCurrent.current - 1 : 0;
setCurrent(newCurrent);
onPrev === null || onPrev === void 0 ? void 0 : onPrev();
};
var handleNext = function handleNext() {
formArrayRef.current[latestCurrent.current].submit();
};
// 表单提交验证成功后修改步骤
var next = function next() {
var newCurrent = latestCurrent.current < items.length - 1 ? latestCurrent.current + 1 : latestCurrent.current;
setCurrent(newCurrent);
onNext === null || onNext === void 0 ? void 0 : onNext();
};
var getFormValues = function getFormValues() {
return Object.values(formDataRef.current).reduce(function (pre, cur) {
return mergeObject(pre, cur);
}, {});
};
// 最后一步表单验证成功后提交全部数据
var submit = /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var values;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(typeof onFinish === 'function')) {
_context.next = 4;
break;
}
values = getFormValues();
_context.next = 4;
return tryit(onFinish)(values);
case 4:
case "end":
return _context.stop();
}
}, _callee);
}));
return function submit() {
return _ref.apply(this, arguments);
};
}();
var onFormFinish = function onFormFinish(name, values) {
formDataRef.current[name] = values;
};
useImperativeHandle(actionRef, function () {
return {
get forms() {
return formArrayRef.current;
},
prev: function prev() {
handlePrev();
},
next: function next() {
handleNext();
},
reset: function reset() {
setCurrent(defaultCurrent);
formDataRef.current = {};
formArrayRef.current.forEach(function (item) {
item.resetFields();
});
},
getFormValues: getFormValues
};
});
useEffect(function () {
if (changedStepScrollToTop && contentRef.current) {
contentRef.current.scrollTo({
top: 0
});
}
}, [changedStepScrollToTop, current]);
var stepsDom = /*#__PURE__*/React.createElement(Steps, _objectSpread(_objectSpread(_objectSpread({}, stepsProps), mergedCurrentItem.stepsProps), {}, {
className: classNames("".concat(prefixCls, "-steps"), stepsProps === null || stepsProps === void 0 ? void 0 : stepsProps.className, (_mergedCurrentItem$st = mergedCurrentItem.stepsProps) === null || _mergedCurrentItem$st === void 0 ? void 0 : _mergedCurrentItem$st.className),
style: _objectSpread(_objectSpread(_objectSpread({}, styles === null || styles === void 0 ? void 0 : styles.steps), stepsProps === null || stepsProps === void 0 ? void 0 : stepsProps.style), (_mergedCurrentItem$st2 = mergedCurrentItem.stepsProps) === null || _mergedCurrentItem$st2 === void 0 ? void 0 : _mergedCurrentItem$st2.style),
current: current
}), items.map(function (item, index) {
var _item$stepProps;
return /*#__PURE__*/React.createElement(Step, _objectSpread(_objectSpread(_objectSpread({
key: uid + index,
title: item.title,
icon: index < current ? /*#__PURE__*/React.createElement(CheckCircle, null) : index + 1
}, stepProps), item.stepProps), {}, {
style: _objectSpread(_objectSpread(_objectSpread({}, styles === null || styles === void 0 ? void 0 : styles.step), stepProps === null || stepProps === void 0 ? void 0 : stepProps.style), (_item$stepProps = item.stepProps) === null || _item$stepProps === void 0 ? void 0 : _item$stepProps.style)
}));
}));
var formContentDom = /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-content-main"),
style: styles === null || styles === void 0 ? void 0 : styles.contentMain
}, items.map(function (item, index) {
var name = uid + index;
return /*#__PURE__*/React.createElement("div", {
key: name,
className: classNames("".concat(prefixCls, "-content-item"), _defineProperty({}, "".concat(prefixCls, "-content-item-active"), current === index))
}, /*#__PURE__*/React.createElement(StepFormContext.Provider, {
value: {
name: name,
step: index,
total: items.length - 1
}
}, item.children));
}));
var submitterDom = mergedCurrentItem.showFooter ? (/*#__PURE__*/React.createElement(Submitter, _objectSpread(_objectSpread(_objectSpread({}, submitterProps), mergedCurrentItem.submitterProps), {}, {
total: items.length,
current: current + 1,
onPrev: handlePrev,
onNext: handleNext,
onSubmit: handleNext,
style: _objectSpread(_objectSpread(_objectSpread({}, styles === null || styles === void 0 ? void 0 : styles.submitter), submitterProps === null || submitterProps === void 0 ? void 0 : submitterProps.style), (_mergedCurrentItem$su = mergedCurrentItem.submitterProps) === null || _mergedCurrentItem$su === void 0 ? void 0 : _mergedCurrentItem$su.style)
}))) : null;
useLayoutEffect(function () {
if (isBrowser && rootRef.current) {
var colorPrimary = getComputedStyle(rootRef.current).getPropertyValue('--color-primary');
setColorLight(tinycolor(colorPrimary).lighten(27.5).toString());
}
}, []);
return /*#__PURE__*/React.createElement(StepsFormContext.Provider, {
value: {
formArrayRef: formArrayRef,
next: next,
submit: submit,
onFormFinish: onFormFinish,
formProps: formProps
}
}, /*#__PURE__*/React.createElement("div", {
className: classNames(prefixCls, className),
style: _objectSpread({
'--color-primary-light': colorLight
}, style),
ref: rootRef
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-content"),
style: styles === null || styles === void 0 ? void 0 : styles.content,
ref: contentRef
}, mergedCurrentItem.stepsRender ? mergedCurrentItem.stepsRender(stepsDom) : stepsDom, mergedCurrentItem.formContentRender ? mergedCurrentItem.formContentRender(formContentDom) : formContentDom), mergedCurrentItem.showFooter && (/*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-footer"),
style: styles === null || styles === void 0 ? void 0 : styles.footer
}, mergedCurrentItem.submitterRender ? mergedCurrentItem.submitterRender(submitterDom) : submitterDom))));
};
BizStepsForm.StepForm = StepForm;
export default BizStepsForm;