@@ -88,7 +88,9 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
8888 @override
8989 @Deprecated ('4.0.0' )
9090 Map copyUnconsumedProps () {
91- var consumedPropKeys = consumedProps? .map ((ConsumedProps consumedProps) => consumedProps.keys) ?? const [];
91+ var consumedPropKeys = consumedProps
92+ ? .map ((ConsumedProps consumedProps) => consumedProps.keys) ??
93+ const [];
9294
9395 return copyProps (keySetsToOmit: consumedPropKeys);
9496 }
@@ -127,7 +129,9 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
127129 @override
128130 @Deprecated ('4.0.0' )
129131 Map copyUnconsumedDomProps () {
130- var consumedPropKeys = consumedProps? .map ((ConsumedProps consumedProps) => consumedProps.keys) ?? const [];
132+ var consumedPropKeys = consumedProps
133+ ? .map ((ConsumedProps consumedProps) => consumedProps.keys) ??
134+ const [];
131135
132136 return copyProps (onlyCopyDomProps: true , keySetsToOmit: consumedPropKeys);
133137 }
@@ -152,17 +156,20 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
152156 forwardUnconsumedProps (this .props, propsToUpdate: props, keySetsToOmit:
153157 consumedPropKeys, onlyCopyDomProps: true );
154158 }
155-
159+
156160 /// Returns a copy of this component's props with React props optionally omitted, and
157161 /// with the specified [keysToOmit] and [keySetsToOmit] omitted.
158162 @override
159- Map copyProps ({bool omitReservedReactProps: true , bool onlyCopyDomProps: false , Iterable keysToOmit, Iterable <Iterable > keySetsToOmit}) {
163+ Map copyProps (
164+ {bool omitReservedReactProps: true ,
165+ bool onlyCopyDomProps: false ,
166+ Iterable keysToOmit,
167+ Iterable <Iterable > keySetsToOmit}) {
160168 return getPropsToForward (this .props,
161169 omitReactProps: omitReservedReactProps,
162170 onlyCopyDomProps: onlyCopyDomProps,
163171 keysToOmit: keysToOmit,
164- keySetsToOmit: keySetsToOmit
165- );
172+ keySetsToOmit: keySetsToOmit);
166173 }
167174
168175 /// Throws a [PropError] if [appliedProps] are invalid.
@@ -181,24 +188,21 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
181188 /// throw new PropError.value(tProps.items, 'items', 'must have an even number of items, because reasons');
182189 /// }
183190 /// }
191+ /// __Deprecated.__ Use [propTypes] instead. Will be removed in the `4.0.0` release.
192+ @Deprecated ('4.0.0' )
184193 @mustCallSuper
185194 @override
186195 void validateProps (Map appliedProps) {
187- validateRequiredProps (appliedProps );
196+ throw UnsupportedError ( '[validateProps] is not supported in Component2, use [propTypes] instead.' );
188197 }
189198
190199 /// Validates that props with the `@requiredProp` annotation are present.
200+ /// __Deprecated.__ Use [propTypes] instead. Will be removed in the `4.0.0` release.
201+ @Deprecated ('4.0.0' )
202+ @mustCallSuper
191203 @override
192204 void validateRequiredProps (Map appliedProps) {
193- consumedProps? .forEach ((ConsumedProps consumedProps) {
194- consumedProps.props.forEach ((PropDescriptor prop) {
195- if (! prop.isRequired) return ;
196- if (prop.isNullable && appliedProps.containsKey (prop.key)) return ;
197- if (! prop.isNullable && appliedProps[prop.key] != null ) return ;
198-
199- throw new PropError .required (prop.key, prop.errorMessage);
200- });
201- });
205+ throw UnsupportedError ('[validateRequiredProps] is not supported in Component2, use [propTypes] instead.' );
202206 }
203207
204208 /// Returns a new ClassNameBuilder with className and blacklist values added from [CssClassPropsMixin.className] and
@@ -270,6 +274,32 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
270274 // END Typed props helpers
271275 // ----------------------------------------------------------------------
272276 // ----------------------------------------------------------------------
277+
278+ /// Allows usage of PropValidator functions to check the validity of a prop passed to it.
279+ /// When an invalid value is provided for a prop, a warning will be shown in the JavaScript console.
280+ /// For performance reasons, propTypes is only checked in development mode.
281+ ///
282+ /// Override with a custom implementation to easily add validation.
283+ ///
284+ /// get propTypes => {
285+ /// getPropKey((props) => props.twoObjects, typedPropsFactory):
286+ /// (props, propName, componentName, location, propFullName) {
287+ /// final length = props.twoObjects?.length;
288+ /// if (length != 2) {
289+ /// return new PropError.value(length, propName, 'must have a length of 2');
290+ /// }
291+ /// return null;
292+ /// },
293+ /// };
294+ ///
295+ /// `getPropKey` is a staticlly typed helper to get the string key for a prop.
296+ ///
297+ /// __Note:__ An improved version of `getPropKey` will be offered once
298+ /// https://jira.atl.workiva.net/browse/CPLAT-6655 is completed.
299+ ///
300+ /// For more info see: https://www.npmjs.com/package/prop-types
301+ @override
302+ Map <String , react.PropValidator <TProps >> get propTypes => {};
273303}
274304
275305/// The basis for a _stateful_ over_react component that is compatible with ReactJS 16 ([react.Component2] ).
@@ -300,8 +330,8 @@ abstract class UiComponent2<TProps extends UiProps> extends react.Component2
300330/// )(props.children);
301331/// }
302332/// }
303- abstract class UiStatefulComponent2 <TProps extends UiProps , TState extends UiState >
304- extends UiComponent2 <TProps >
333+ abstract class UiStatefulComponent2 <TProps extends UiProps ,
334+ TState extends UiState > extends UiComponent2 <TProps >
305335 implements UiStatefulComponent <TProps , TState > {
306336 // ----------------------------------------------------------------------
307337 // ----------------------------------------------------------------------
0 commit comments