react-yandex-maps
Version:
Yandex.Maps API bindings for React
278 lines (240 loc) • 8.01 kB
TypeScript
import * as React from 'react';
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
interface AnyObject {
[key: string]: any;
}
interface CommonProps<T = any> extends AnyObject {
instanceRef?: (instance: React.Ref<T>) => void;
onLoad?: (ymaps: YMapsApi) => void;
onError?: (error: Error) => void;
modules?: string[];
children?: React.ReactNode;
}
export type MapType = 'yandex#map' | 'yandex#satellite' | 'yandex#hybrid';
export interface YMapsApi extends AnyObject {}
//
// Main components
// ----------------------------------------------------------------------
export interface YMapsProps extends AnyObject {
version?: string;
enterprise?: boolean;
query?: {
lang?: 'tr_TR' | 'en_US' | 'en_RU' | 'ru_RU' | 'ru_UA' | 'uk_UA';
apikey?: string;
coordorder?: 'latlong' | 'longlat';
load?: string;
mode?: 'release' | 'debug';
csp?: boolean;
ns?: string;
};
children?: React.ReactNode;
preload?: boolean;
}
interface MapStateBase extends AnyObject {
controls?: string[];
behaviors?: string[];
margin?: number[] | number[][];
type?: MapType;
}
interface MapStateBounds {
bounds: number[][];
zoom?: never;
center?: never;
}
interface MapStateCenter {
center: number[];
zoom: number;
bounds?: never;
}
/**
* REVIEW: discuss if this behavior is necessary
*/
export type MapState = MapStateBase & (MapStateBounds | MapStateCenter);
export interface MapOptions extends AnyObject {
autoFitToViewport?: 'none' | 'ifNull' | 'always';
avoidFractionalZoom?: boolean;
exitFullscreenByEsc?: boolean;
fullscreenZIndex?: number;
mapAutoFocus?: boolean;
maxAnimationZoomDifference?: number;
maxZoom?: number;
minZoom?: number;
nativeFullscreen?: boolean;
projection?: any;
restrictMapArea?: boolean;
suppressMapOpenBlock?: boolean;
suppressObsoleteBrowserNotifier?: boolean;
yandexMapAutoSwitch?: boolean;
yandexMapDisablePoiInteractivity?: boolean;
}
export interface MapProps extends CommonProps {
state?: MapState;
defaultState?: MapState;
options?: MapOptions;
defaultOptions?: MapOptions;
children?: React.ReactNode;
width?: number | string;
height?: number | string;
style?: React.CSSProperties;
className?: string;
}
export interface ObjectManagerFeature {
id: number | string;
type: 'Feature';
geometry: AnyObject;
options?: AnyObject;
properties?: AnyObject;
}
export interface ObjectManagerFeatureCollection {
type: 'FeatureCollection';
features: (ObjectManagerFeatureCollection | ObjectManagerFeature)[];
}
export type ObjectManagerFeatures =
| ObjectManagerFeature
| ObjectManagerFeatureCollection
| (ObjectManagerFeatureCollection | ObjectManagerFeature)[];
export type ObjectManagerFilter =
| string
| ((feature: ObjectManagerFeature) => void);
export interface ObjectManagerOptions extends AnyObject {
clusterize?: boolean;
syncOverlayInit?: boolean;
viewportMargin?: number | number[];
}
/**
* TODO: replace `AnyObject` with definitions
*/
export interface ObjectManagerObjectsOptions extends AnyObject {}
export interface ObjectManagerClustersOptions extends AnyObject {}
export interface ObjectManagerProps extends CommonProps {
features?: ObjectManagerFeatures;
defaultFeatures?: ObjectManagerFeatures;
filter?: ObjectManagerFilter;
defaultFilter?: ObjectManagerFilter;
options?: ObjectManagerOptions;
defaultOptions?: ObjectManagerOptions;
objects?: ObjectManagerObjectsOptions;
defaultObjects?: ObjectManagerObjectsOptions;
clusters?: ObjectManagerClustersOptions;
defaultClusters?: ObjectManagerClustersOptions;
}
export interface ClustererOptions extends AnyObject {
gridSize?: number;
groupByCoordinates?: boolean;
hasBalloon?: boolean;
hasHint?: boolean;
margin?: number | number[] | number[][];
maxZoom?: number | number[];
minClusterSize?: number;
preset?: string;
showInAlphabeticalOrder?: boolean;
useMapMargin?: boolean;
viewportMargin?: number | number[] | number[][];
zoomMargin?: number | number[] | number[][];
}
export interface ClustererProps extends CommonProps {
options?: ClustererOptions;
defaultOptions?: ClustererOptions;
}
export interface PanoramaOptions extends AnyObject {
autoFitToViewport?: 'none' | 'ifNull' | 'always';
controls?: string[];
direction?: string | number[];
hotkeysEnabled?: boolean;
scrollZoomBehavior?: boolean;
span?: string | number[];
suppressMapOpenBlock?: boolean;
}
export interface PanoramaProps extends CommonProps {
coordinates?: number[];
defaultCoordinates?: number[];
options?: PanoramaOptions;
defaultOptions?: PanoramaOptions;
children?: React.ReactNode;
width?: number | string;
height?: number | string;
style?: React.CSSProperties;
className?: string;
}
export interface WithYMapsProps {
ymaps: YMapsApi;
}
export function withYMaps<P>(
component: React.ComponentType<P>,
waitForApi?: boolean,
modules?: string[]
): React.ComponentType<P>;
export const YMaps: React.ComponentType<YMapsProps>;
export const Map: React.ComponentType<MapProps>;
export const ObjectManager: React.ComponentType<ObjectManagerProps>;
export const Clusterer: React.ComponentType<ClustererProps>;
export const Panorama: React.ComponentType<PanoramaProps>;
//
// Geo Objects components
// ----------------------------------------------------------------------
export interface GeoObjectProps<G, P = AnyObject, O = AnyObject>
extends AnyObject {
geometry?: G;
defaultGeometry?: G;
properties?: P;
defaultProperties?: P;
options?: O;
defaultOptions?: O;
}
export interface GeoObjectGeometry extends AnyObject {
type: 'Point' | 'LineString' | 'Rectangle' | 'Polygon' | 'Circle';
coordinates: number[] | number[][] | number[][][];
radius?: number;
}
export type PlacemarkGeometry = number[];
export type PolylineGeometry = number[][];
export type RectangleGeometry = number[][];
export type PolygonGeometry = number[][][];
export type CircleGeometry = (number | number[])[];
export const GeoObject: React.ComponentType<GeoObjectProps<GeoObjectGeometry>>;
export const Placemark: React.ComponentType<GeoObjectProps<PlacemarkGeometry>>;
export const Polyline: React.ComponentType<GeoObjectProps<PolylineGeometry>>;
export const Rectangle: React.ComponentType<GeoObjectProps<RectangleGeometry>>;
export const Polygon: React.ComponentType<GeoObjectProps<PolygonGeometry>>;
export const Circle: React.ComponentType<GeoObjectProps<CircleGeometry>>;
//
// Controls components
// ----------------------------------------------------------------------
/**
* REVIEW: discuss about detailed props for `data`, `options`, `state`
*/
export interface ControlProps<D = AnyObject, O = AnyObject, S = AnyObject>
extends CommonProps {
data?: D;
defaultData?: D;
options?: O;
defaultOptions?: O;
state?: S;
defaultState?: S;
}
export type ControlPropsWithoutData<
D = AnyObject,
O = AnyObject,
S = AnyObject
> = Omit<ControlProps<D, O, S>, 'data' | 'defaultData'>;
export type TypeSelectorProps<
D = AnyObject,
O = AnyObject,
S = AnyObject
> = ControlProps<D, O, S> & {
mapTypes?: MapType[];
defaultMapTypes?: MapType[];
};
export const Button: React.ComponentType<ControlProps>;
export const FullscreenControl: React.ComponentType<ControlProps>;
export const GeolocationControl: React.ComponentType<ControlProps>;
export const ListBox: React.ComponentType<ControlProps>;
export const ListBoxItem: React.ComponentType<ControlProps>;
export const RouteButton: React.ComponentType<ControlProps>;
export const RouteEditor: React.ComponentType<ControlProps>;
export const RoutePanel: React.ComponentType<ControlPropsWithoutData>;
export const RulerControl: React.ComponentType<ControlProps>;
export const SearchControl: React.ComponentType<ControlProps>;
export const TrafficControl: React.ComponentType<ControlPropsWithoutData>;
export const TypeSelector: React.ComponentType<TypeSelectorProps>;
export const ZoomControl: React.ComponentType<ControlProps>;