UNPKG

3.76 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.Async = exports.Status = void 0;
4const React = require("react");
5const prop_types_1 = require("prop-types");
6const assert_1 = require("./assert");
7const FieldFeedbacks_1 = require("./FieldFeedbacks");
8const FormWithConstraints_1 = require("./FormWithConstraints");
9const withValidateFieldEventEmitter_1 = require("./withValidateFieldEventEmitter");
10var 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 = {}));
17class AsyncComponent extends React.PureComponent {
18}
19class 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}
96exports.Async = Async;
97Async.contextTypes = {
98 form: (0, prop_types_1.instanceOf)(FormWithConstraints_1.FormWithConstraints).isRequired,
99 fieldFeedbacks: (0, prop_types_1.instanceOf)(FieldFeedbacks_1.FieldFeedbacks).isRequired
100};
101Async.childContextTypes = {
102 async: (0, prop_types_1.instanceOf)(Async).isRequired
103};