export interface InterfaceFormControlProps {
  /**
   * If provided, this prop is passed to its children.
   */
  nativeID?: string;
  /**
   * If true, this prop is passed to its children.
   */
  isInvalid?: boolean;
  /**
   * If true, this prop is passed to its children.
   */
  isRequired?: boolean;
  /**
   * If true, this prop is passed to its children.
   */
  isDisabled?: boolean;
  /**
   * If true, this prop is passed to its children.
   */
  isReadOnly?: boolean;
}

export interface IFormControlLabelProps {
  htmlFor?: string;
}

export type IFormControlComponentType<
  Root,
  Error,
  ErrorText,
  ErrorIcon,
  Label,
  LabelText,
  LabelAstrick,
  Helper,
  HelperText
> = ((props: Root) => JSX.Element) & {
  Error: React.MemoExoticComponent<(props: Error) => JSX.Element> & {
    Text: React.MemoExoticComponent<(props: ErrorText) => JSX.Element>;
    Icon: React.MemoExoticComponent<(props: ErrorIcon) => JSX.Element>;
  };
  Label: React.MemoExoticComponent<(props: Label) => JSX.Element> & {
    Text: React.MemoExoticComponent<(props: LabelText) => JSX.Element>;
    Astrick: React.MemoExoticComponent<(props: LabelAstrick) => JSX.Element>;
  };
  Helper: React.MemoExoticComponent<(props: Helper) => JSX.Element> & {
    Text: React.MemoExoticComponent<(props: HelperText) => JSX.Element>;
  };
};
