1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.Async = exports.Status = void 0;
|
4 | const React = require("react");
|
5 | const prop_types_1 = require("prop-types");
|
6 | const assert_1 = require("./assert");
|
7 | const FieldFeedbacks_1 = require("./FieldFeedbacks");
|
8 | const FormWithConstraints_1 = require("./FormWithConstraints");
|
9 | const withValidateFieldEventEmitter_1 = require("./withValidateFieldEventEmitter");
|
10 | var Status;
|
11 | (function (Status) {
|
12 | Status[Status["None"] = 0] = "None";
|
13 | Status[Status["Pending"] = 1] = "Pending";
|
14 | Status[Status["Rejected"] = 2] = "Rejected";
|
15 | Status[Status["Resolved"] = 3] = "Resolved";
|
16 | })(Status = exports.Status || (exports.Status = {}));
|
17 | class AsyncComponent extends React.PureComponent {
|
18 | }
|
19 | class Async extends (0, withValidateFieldEventEmitter_1.withValidateFieldEventEmitter)(AsyncComponent) {
|
20 | constructor() {
|
21 | super(...arguments);
|
22 | this.state = {
|
23 | status: Status.None
|
24 | };
|
25 | this.validate = (input) => {
|
26 | const { form, fieldFeedbacks } = this.context;
|
27 | let validations;
|
28 | const field = form.fieldsStore.getField(input.name);
|
29 | if ((fieldFeedbacks.props.stop === 'first' && field.hasFeedbacks(fieldFeedbacks.key)) ||
|
30 | (fieldFeedbacks.props.stop === 'first-error' && field.hasErrors(fieldFeedbacks.key)) ||
|
31 | (fieldFeedbacks.props.stop === 'first-warning' && field.hasWarnings(fieldFeedbacks.key)) ||
|
32 | (fieldFeedbacks.props.stop === 'first-info' && field.hasInfos(fieldFeedbacks.key))) {
|
33 | this.setState({ status: Status.None });
|
34 | }
|
35 | else {
|
36 | validations = this._validate(input);
|
37 | }
|
38 | return validations;
|
39 | };
|
40 | }
|
41 | getChildContext() {
|
42 | return {
|
43 | async: this
|
44 | };
|
45 | }
|
46 | componentDidMount() {
|
47 | this.context.fieldFeedbacks.addValidateFieldEventListener(this.validate);
|
48 | }
|
49 | componentWillUnmount() {
|
50 | this.context.fieldFeedbacks.removeValidateFieldEventListener(this.validate);
|
51 | }
|
52 | async setStateSync(state) {
|
53 | return new Promise(resolve => {
|
54 | this.setState(state, resolve);
|
55 | });
|
56 | }
|
57 | async _validate(input) {
|
58 | let state = {
|
59 | status: Status.Pending
|
60 | };
|
61 | this.setState(state);
|
62 | try {
|
63 | const value = await this.props.promise(input.value);
|
64 | state = { status: Status.Resolved, value };
|
65 | }
|
66 | catch (e) {
|
67 | state = { status: Status.Rejected, value: e };
|
68 | }
|
69 | await this.setStateSync(state);
|
70 | return this.emitValidateFieldEvent(input);
|
71 | }
|
72 | render() {
|
73 | const { props, state } = this;
|
74 | let element = null;
|
75 | switch (state.status) {
|
76 | case Status.None:
|
77 | break;
|
78 | case Status.Pending:
|
79 | if (props.pending)
|
80 | element = props.pending;
|
81 | break;
|
82 | case Status.Resolved:
|
83 | if (props.then)
|
84 | element = props.then(state.value);
|
85 | break;
|
86 | case Status.Rejected:
|
87 | if (props.catch)
|
88 | element = props.catch(state.value);
|
89 | break;
|
90 | default:
|
91 | (0, assert_1.assert)(false, `Unknown status: '${state.status}'`);
|
92 | }
|
93 | return element;
|
94 | }
|
95 | }
|
96 | exports.Async = Async;
|
97 | Async.contextTypes = {
|
98 | form: (0, prop_types_1.instanceOf)(FormWithConstraints_1.FormWithConstraints).isRequired,
|
99 | fieldFeedbacks: (0, prop_types_1.instanceOf)(FieldFeedbacks_1.FieldFeedbacks).isRequired
|
100 | };
|
101 | Async.childContextTypes = {
|
102 | async: (0, prop_types_1.instanceOf)(Async).isRequired
|
103 | };
|