import type { HostComponent, ViewProps } from 'react-native'; import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; import { BubblingEventHandler, DirectEventHandler, Int32, Double, // @ts-ignore - CI environment type resolution issue for CodegenTypes } from 'react-native/Libraries/Types/CodegenTypes'; import type { Point, UnsafeMixed } from './codegenUtils'; // see https://github.com/rnmapbox/maps/wiki/FabricOptionalProp type OptionalProp = UnsafeMixed; type GestureSettings = { doubleTapToZoomInEnabled?: boolean; doubleTouchToZoomOutEnabled?: boolean; pinchScrollEnabled?: boolean; pinchToZoomDecelerationEnabled?: boolean; }; type LocalizeLabels = | { locale: string; layerIds?: string[]; } | true; type OnCameraChangedEventType = { type: string; payload: string; }; type OnPressEventType = { type: string; payload: string }; type OnMapChangeEventType = { type: string; payload: string }; export interface NativeProps extends ViewProps { attributionEnabled?: OptionalProp; attributionPosition?: UnsafeMixed; logoEnabled?: OptionalProp; logoPosition?: UnsafeMixed; compassEnabled?: OptionalProp; compassFadeWhenNorth?: OptionalProp; compassPosition?: UnsafeMixed; compassViewPosition?: OptionalProp; compassViewMargins?: OptionalProp; scaleBarEnabled?: OptionalProp; scaleBarPosition?: UnsafeMixed; zoomEnabled?: OptionalProp; scrollEnabled?: OptionalProp; rotateEnabled?: OptionalProp; pitchEnabled?: OptionalProp; maxPitch?: OptionalProp; deselectAnnotationOnTap?: OptionalProp; requestDisallowInterceptTouchEvent?: OptionalProp; projection?: OptionalProp<'mercator' | 'globe'>; localizeLabels?: UnsafeMixed; styleURL?: OptionalProp; gestureSettings?: UnsafeMixed; // Android only surfaceView?: OptionalProp; scaleBarViewMargins?: UnsafeMixed; attributionViewMargins?: UnsafeMixed; attributionViewPosition?: UnsafeMixed; // iOS only compassImage?: OptionalProp; onPress?: BubblingEventHandler; onLongPress?: DirectEventHandler; onMapChange?: DirectEventHandler; onCameraChanged?: DirectEventHandler; mapViewImpl?: OptionalProp; preferredFramesPerSecond?: OptionalProp; } // @ts-ignore-error - Codegen requires single cast but TypeScript prefers double cast export default codegenNativeComponent( 'RNMBXMapView', ) as HostComponent; // The actually types for callbacks are sometwhat different due to codegen limitations: type MapState = { properties: { center: GeoJSON.Position; bounds: { ne: GeoJSON.Position; sw: GeoJSON.Position; }; zoom: number; heading: number; pitch: number; }; gestures: { isGestureActive: boolean; }; timestamp?: number; }; type RegionPayload = { zoomLevel: number; heading: number; animated: boolean; isUserInteraction: boolean; visibleBounds: GeoJSON.Position[]; pitch: number; }; type OnPressEventTypeActual = { type: string; payload: GeoJSON.Feature | string; }; type OnCameraChangedEventTypeActual = { type: string; payload: MapState | string; }; type OnMapChangeEventTypeActual = { type: string; payload: | GeoJSON.Feature< GeoJSON.Point, RegionPayload & { isAnimatingFromUserInteraction: boolean } > | string; }; export type NativeMapViewActual = HostComponent< Omit & { onCameraChanged?: DirectEventHandler; onLongPress?: DirectEventHandler; onPress?: DirectEventHandler; onMapChange?: DirectEventHandler; } >;