amis-rpc-design/node_modules/rc-field-form/lib/useWatch.js
2023-10-07 19:42:30 +08:00

97 lines
3.8 KiB
JavaScript

"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.stringify = stringify;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
var _react = require("react");
var _FieldContext = _interopRequireWildcard(require("./FieldContext"));
var _typeUtil = require("./utils/typeUtil");
var _valueUtil = require("./utils/valueUtil");
function stringify(value) {
try {
return JSON.stringify(value);
} catch (err) {
return Math.random();
}
}
var useWatchWarning = process.env.NODE_ENV !== 'production' ? function (namePath) {
var fullyStr = namePath.join('__RC_FIELD_FORM_SPLIT__');
var nameStrRef = (0, _react.useRef)(fullyStr);
(0, _warning.default)(nameStrRef.current === fullyStr, '`useWatch` is not support dynamic `namePath`. Please provide static instead.');
} : function () {};
function useWatch() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _args$ = args[0],
dependencies = _args$ === void 0 ? [] : _args$,
_args$2 = args[1],
_form = _args$2 === void 0 ? {} : _args$2;
var options = (0, _typeUtil.isFormInstance)(_form) ? {
form: _form
} : _form;
var form = options.form;
var _useState = (0, _react.useState)(),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var valueStr = (0, _react.useMemo)(function () {
return stringify(value);
}, [value]);
var valueStrRef = (0, _react.useRef)(valueStr);
valueStrRef.current = valueStr;
var fieldContext = (0, _react.useContext)(_FieldContext.default);
var formInstance = form || fieldContext;
var isValidForm = formInstance && formInstance._init;
// Warning if not exist form instance
if (process.env.NODE_ENV !== 'production') {
(0, _warning.default)(args.length === 2 ? form ? isValidForm : true : isValidForm, 'useWatch requires a form instance since it can not auto detect from context.');
}
var namePath = (0, _valueUtil.getNamePath)(dependencies);
var namePathRef = (0, _react.useRef)(namePath);
namePathRef.current = namePath;
useWatchWarning(namePath);
(0, _react.useEffect)(function () {
// Skip if not exist form instance
if (!isValidForm) {
return;
}
var getFieldsValue = formInstance.getFieldsValue,
getInternalHooks = formInstance.getInternalHooks;
var _getInternalHooks = getInternalHooks(_FieldContext.HOOK_MARK),
registerWatch = _getInternalHooks.registerWatch;
var cancelRegister = registerWatch(function (values, allValues) {
var newValue = (0, _valueUtil.getValue)(options.preserve ? allValues : values, namePathRef.current);
var nextValueStr = stringify(newValue);
// Compare stringify in case it's nest object
if (valueStrRef.current !== nextValueStr) {
valueStrRef.current = nextValueStr;
setValue(newValue);
}
});
// TODO: We can improve this perf in future
var initialValue = (0, _valueUtil.getValue)(options.preserve ? getFieldsValue(true) : getFieldsValue(), namePathRef.current);
// React 18 has the bug that will queue update twice even the value is not changed
// ref: https://github.com/facebook/react/issues/27213
if (value !== initialValue) {
setValue(initialValue);
}
return cancelRegister;
},
// We do not need re-register since namePath content is the same
// eslint-disable-next-line react-hooks/exhaustive-deps
[isValidForm]);
return value;
}
var _default = useWatch;
exports.default = _default;