/
ReactControlledValuePropTypes.js
81 lines (73 loc) · 2.14 KB
/
ReactControlledValuePropTypes.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import checkPropTypes from 'prop-types/checkPropTypes';
import ReactSharedInternals from 'shared/ReactSharedInternals';
let ReactDebugCurrentFrame = null;
const ReactControlledValuePropTypes = {
checkPropTypes: null,
};
if (__DEV__) {
ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
const hasReadOnlyValue = {
button: true,
checkbox: true,
image: true,
hidden: true,
radio: true,
reset: true,
submit: true,
};
const propTypes = {
value: function(props, propName, componentName) {
if (
hasReadOnlyValue[props.type] ||
props.onChange ||
props.readOnly ||
props.disabled ||
props[propName] == null
) {
return null;
}
return new Error(
'You provided a `value` prop to a form field without an ' +
'`onChange` handler. This will render a read-only field. If ' +
'the field should be mutable use `defaultValue`. Otherwise, ' +
'set either `onChange` or `readOnly`.',
);
},
checked: function(props, propName, componentName) {
if (
props.onChange ||
props.readOnly ||
props.disabled ||
props[propName] == null
) {
return null;
}
return new Error(
'You provided a `checked` prop to a form field without an ' +
'`onChange` handler. This will render a read-only field. If ' +
'the field should be mutable use `defaultChecked`. Otherwise, ' +
'set either `onChange` or `readOnly`.',
);
},
};
/**
* Provide a linked `value` attribute for controlled forms. You should not use
* this outside of the ReactDOM controlled form components.
*/
ReactControlledValuePropTypes.checkPropTypes = function(tagName, props) {
checkPropTypes(
propTypes,
props,
'prop',
tagName,
ReactDebugCurrentFrame.getStackAddendum,
);
};
}
export default ReactControlledValuePropTypes;