Merge pull request #4777 from matrix-org/t3chguy/notifications0

Improve Field ts definitions some more
pull/21833/head
Michael Telatynski 2020-06-17 02:21:47 +01:00 committed by GitHub
commit f08efc632f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 37 additions and 21 deletions

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import React from 'react'; import React, {InputHTMLAttributes, SelectHTMLAttributes, TextareaHTMLAttributes} from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import * as sdk from '../../../index'; import * as sdk from '../../../index';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
@ -29,45 +29,61 @@ function getId() {
return `${BASE_ID}_${count++}`; return `${BASE_ID}_${count++}`;
} }
interface IProps extends React.InputHTMLAttributes<HTMLSelectElement | HTMLInputElement | HTMLTextAreaElement> { interface IProps {
// The field's ID, which binds the input and label together. Immutable. // The field's ID, which binds the input and label together. Immutable.
id?: string, id?: string;
// The element to create. Defaults to "input".
// To define options for a select, use <Field><option ... /></Field>
element?: "input" | "select" | "textarea",
// The field's type (when used as an <input>). Defaults to "text". // The field's type (when used as an <input>). Defaults to "text".
type?: string, type?: string;
// id of a <datalist> element for suggestions // id of a <datalist> element for suggestions
list?: string, list?: string;
// The field's label string. // The field's label string.
label?: string, label?: string;
// The field's placeholder string. Defaults to the label. // The field's placeholder string. Defaults to the label.
placeholder?: string, placeholder?: string;
// The field's value.
// This is a controlled component, so the value is required.
value: string,
// Optional component to include inside the field before the input. // Optional component to include inside the field before the input.
prefixComponent?: React.ReactNode, prefixComponent?: React.ReactNode;
// Optional component to include inside the field after the input. // Optional component to include inside the field after the input.
postfixComponent?: React.ReactNode, postfixComponent?: React.ReactNode;
// The callback called whenever the contents of the field // The callback called whenever the contents of the field
// changes. Returns an object with `valid` boolean field // changes. Returns an object with `valid` boolean field
// and a `feedback` react component field to provide feedback // and a `feedback` react component field to provide feedback
// to the user. // to the user.
onValidate?: (input: IFieldState) => Promise<IValidationResult>, onValidate?: (input: IFieldState) => Promise<IValidationResult>;
// If specified, overrides the value returned by onValidate. // If specified, overrides the value returned by onValidate.
flagInvalid?: boolean, flagInvalid?: boolean;
// If specified, contents will appear as a tooltip on the element and // If specified, contents will appear as a tooltip on the element and
// validation feedback tooltips will be suppressed. // validation feedback tooltips will be suppressed.
tooltipContent?: React.ReactNode, tooltipContent?: React.ReactNode;
// If specified alongside tooltipContent, the class name to apply to the // If specified alongside tooltipContent, the class name to apply to the
// tooltip itself. // tooltip itself.
tooltipClassName?: string, tooltipClassName?: string;
// If specified, an additional class name to apply to the field container // If specified, an additional class name to apply to the field container
className?: string, className?: string;
// All other props pass through to the <input>. // All other props pass through to the <input>.
} }
interface IInputProps extends IProps, InputHTMLAttributes<HTMLInputElement> {
// The element to create. Defaults to "input".
element?: "input";
// The input's value. This is a controlled component, so the value is required.
value: string;
}
interface ISelectProps extends IProps, SelectHTMLAttributes<HTMLSelectElement> {
// To define options for a select, use <Field><option ... /></Field>
element: "select";
// The select's value. This is a controlled component, so the value is required.
value: string;
}
interface ITextareaProps extends IProps, TextareaHTMLAttributes<HTMLTextAreaElement> {
element: "textarea";
// The textarea's value. This is a controlled component, so the value is required.
value: string;
}
type PropShapes = IInputProps | ISelectProps | ITextareaProps;
interface IState { interface IState {
valid: boolean, valid: boolean,
feedback: React.ReactNode, feedback: React.ReactNode,
@ -75,7 +91,7 @@ interface IState {
focused: boolean, focused: boolean,
} }
export default class Field extends React.PureComponent<IProps, IState> { export default class Field extends React.PureComponent<PropShapes, IState> {
private id: string; private id: string;
private input: HTMLInputElement; private input: HTMLInputElement;