zent
Version:
一套前端设计语言和基于React的实现
122 lines (121 loc) • 3.88 kB
JavaScript
import { __extends } from "tslib";
import { jsx as _jsx } from "react/jsx-runtime";
import { FormContext } from './formulr';
import { combineLatest, merge } from 'rxjs';
import { map } from 'rxjs/operators';
import { FormError } from './Error';
import { Component } from 'react';
function equal(a, b) {
if (a === b) {
return true;
}
if (a.length !== b.length) {
return false;
}
for (var i = 0; i < a.length; i += 1) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
function pickError(errors) {
for (var i = 0; i < errors.length; i += 1) {
var error = errors[i];
if (error) {
return error;
}
}
return null;
}
var CombineErrors = (function (_super) {
__extends(CombineErrors, _super);
function CombineErrors() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.$ = null;
_this.$parent = null;
_this.state = {
error: null,
};
_this.parentChildrenChange = function (name) {
var names = _this.props.names;
if (!names || !names.includes(name)) {
return;
}
_this.unsubscribe();
_this.subscribe();
};
_this.setError = function (error) {
_this.setState({
error: error,
});
};
return _this;
}
CombineErrors.prototype.subscribe = function () {
var parent = this.context.parent;
var _a = this.props, models = _a.models, names = _a.names;
var fields = [];
if (names) {
for (var i = 0; i < names.length; i += 1) {
var name_1 = names[i];
var model = parent.get(name_1);
if (model) {
fields.push(model);
}
}
}
if (models) {
for (var i = 0; i < models.length; i += 1) {
fields.push(models[i]);
}
}
this.$ = combineLatest(fields.map(function (it) { return it.error$; }))
.pipe(map(pickError))
.subscribe(this.setError);
};
CombineErrors.prototype.unsubscribe = function () {
if (this.$) {
this.$.unsubscribe();
this.$ = null;
}
};
CombineErrors.prototype.shouldComponentUpdate = function (nextProps, nextState) {
return nextProps !== this.props || nextState.error !== this.state.error;
};
CombineErrors.prototype.componentDidMount = function () {
var parent = this.context.parent;
this.subscribe();
this.$parent = merge(parent.childRegister$, parent.childRemove$).subscribe(this.parentChildrenChange);
};
CombineErrors.prototype.componentDidUpdate = function (prevProps) {
if (this.props !== prevProps) {
if (!equal(prevProps.models || [], this.props.models || []) ||
!equal(prevProps.names || [], this.props.names || [])) {
this.unsubscribe();
this.subscribe();
}
}
};
CombineErrors.prototype.componentWillUnmount = function () {
this.unsubscribe();
if (this.$parent) {
this.$parent.unsubscribe();
this.$parent = null;
}
};
CombineErrors.prototype.render = function () {
var children = this.props.children;
var error = this.state.error;
if (children) {
return children(error);
}
if (error === null) {
return null;
}
return _jsx(FormError, { children: error === null || error === void 0 ? void 0 : error.message }, void 0);
};
CombineErrors.contextType = FormContext;
return CombineErrors;
}(Component));
export { CombineErrors };