content: /**
   * Copyright (c) 2015-present, Facebook, Inc.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   *
   * @format
   * @flow
   */
  
  import React from 'react';
  
  export type MeasureOnSuccessCallback = (
    x: number,
    y: number,
    width: number,
    height: number,
    pageX: number,
    pageY: number,
  ) => void;
  
  export type MeasureInWindowOnSuccessCallback = (
    x: number,
    y: number,
    width: number,
    height: number,
  ) => void;
  
  export type MeasureLayoutOnSuccessCallback = (
    left: number,
    top: number,
    width: number,
    height: number,
  ) => void;
  
  type BubblingEventType = {
    phasedRegistrationNames: {
      captured: string,
      bubbled: string,
    },
  };
  
  type DirectEventType = {
    registrationName: string,
  };
  
  export type ReactNativeBaseComponentViewConfig = {
    validAttributes: Object,
    uiViewClassName: string,
    bubblingEventTypes?: {[topLevelType: string]: BubblingEventType},
    directEventTypes?: {[topLevelType: string]: DirectEventType},
    propTypes?: Object,
  };
  
  export type ViewConfigGetter = () => ReactNativeBaseComponentViewConfig;
  
  /**
   * Class only exists for its Flow type.
   */
  class ReactNativeComponent<Props> extends React.Component<Props> {
    blur(): void {}
    focus(): void {}
    measure(callback: MeasureOnSuccessCallback): void {}
    measureInWindow(callback: MeasureInWindowOnSuccessCallback): void {}
    measureLayout(
      relativeToNativeNode: number,
      onSuccess: MeasureLayoutOnSuccessCallback,
      onFail?: () => void,
    ): void {}
    setNativeProps(nativeProps: Object): void {}
  }
  
  /**
   * This type keeps ReactNativeFiberHostComponent and NativeMethodsMixin in sync.
   * It can also provide types for ReactNative applications that use NMM or refs.
   */
  export type NativeMethodsMixinType = {
    blur(): void,
    focus(): void,
    measure(callback: MeasureOnSuccessCallback): void,
    measureInWindow(callback: MeasureInWindowOnSuccessCallback): void,
    measureLayout(
      relativeToNativeNode: number,
      onSuccess: MeasureLayoutOnSuccessCallback,
      onFail: () => void,
    ): void,
    setNativeProps(nativeProps: Object): void,
  };
  
  type SecretInternalsType = {
    NativeMethodsMixin: NativeMethodsMixinType,
    computeComponentStackForErrorReporting(tag: number): string,
    // TODO (bvaughn) Decide which additional types to expose here?
    // And how much information to fill in for the above types.
  };
  
  type SecretInternalsFabricType = {
    NativeMethodsMixin: NativeMethodsMixinType,
  };
  
  /**
   * Flat ReactNative renderer bundles are too big for Flow to parse efficiently.
   * Provide minimal Flow typing for the high-level RN API and call it a day.
   */
  export type ReactNativeType = {
    NativeComponent: typeof ReactNativeComponent,
    findNodeHandle(componentOrHandle: any): ?number,
    render(
      element: React$Element<any>,
      containerTag: any,
      callback: ?Function,
    ): any,
    unmountComponentAtNode(containerTag: number): any,
    unmountComponentAtNodeAndRemoveContainer(containerTag: number): any,
    unstable_batchedUpdates: any, // TODO (bvaughn) Add types
  
    __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: SecretInternalsType,
  };
  
  export type ReactFabricType = {
    NativeComponent: typeof ReactNativeComponent,
    findNodeHandle(componentOrHandle: any): ?number,
    render(
      element: React$Element<any>,
      containerTag: any,
      callback: ?Function,
    ): any,
    unmountComponentAtNode(containerTag: number): any,
  
    __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: SecretInternalsFabricType,
  };
  