rs-react-native-map-clustering
Version:
React Native Map Clustering both for Android and iOS with TypeScript support
121 lines (120 loc) • 3.31 kB
TypeScript
import type { MutableRefObject, ReactNode } from 'react';
import type { LayoutAnimationConfig } from 'react-native';
import type MapView from 'react-native-maps';
import type { LatLng, MapViewProps } from 'react-native-maps';
import type SuperCluster from 'supercluster';
export interface Region {
latitude: number;
longitude: number;
latitudeDelta: number;
longitudeDelta: number;
}
export interface GeoJsonPoint {
type: 'Point';
coordinates: [number, number];
}
export interface Feature {
type: 'Feature';
geometry: GeoJsonPoint;
properties: {
point_count: number;
point_count_abbreviated?: string;
index?: number;
cluster_id?: number;
cluster?: boolean;
[key: string]: unknown;
};
id?: number | string;
}
export interface ClusterFeature extends Feature {
properties: {
cluster?: boolean;
cluster_id?: number;
point_count: number;
index: number;
[key: string]: unknown;
};
geometry: GeoJsonPoint;
}
export interface SpiderMarker extends LatLng {
index: number;
centerPoint: LatLng;
}
export interface MarkerData {
properties: {
point_count: number;
index: number;
[key: string]: unknown;
};
geometry: {
coordinates: [number, number];
};
}
export interface MarkerStyle {
width: number;
height: number;
size: number;
fontSize: number;
}
export interface ClusterRenderProps {
geometry: GeoJsonPoint;
properties: {
point_count: number;
cluster_id?: number;
cluster?: boolean;
[key: string]: unknown;
};
key: string;
onPress: () => void;
clusterColor: string;
clusterTextColor: string;
clusterFontFamily?: string;
}
export interface ClusterMarkerProps {
geometry: GeoJsonPoint;
properties: {
point_count: number;
cluster_id?: number;
cluster?: boolean;
[key: string]: unknown;
};
onPress: () => void;
clusterColor: string;
clusterTextColor: string;
clusterFontFamily?: string;
tracksViewChanges: boolean;
}
export interface EdgePadding {
top: number;
left: number;
right: number;
bottom: number;
}
export interface ClusteredMapViewProps extends Omit<MapViewProps, 'onRegionChangeComplete'> {
clusteringEnabled?: boolean;
spiralEnabled?: boolean;
animationEnabled?: boolean;
preserveClusterPressBehavior?: boolean;
tracksViewChanges?: boolean;
layoutAnimationConf?: LayoutAnimationConfig;
radius?: number;
maxZoom?: number;
minZoom?: number;
extent?: number;
nodeSize?: number;
minPoints?: number;
edgePadding?: EdgePadding;
clusterColor?: string;
clusterTextColor?: string;
clusterFontFamily?: string;
selectedClusterId?: string;
selectedClusterColor?: string;
spiderLineColor?: string;
superClusterRef?: MutableRefObject<SuperCluster | null>;
mapRef?: (ref: MapView | null) => void;
onClusterPress?: (cluster: Feature, markers?: Feature[]) => void;
onMarkersChange?: (markers: Feature[]) => void;
onRegionChangeComplete?: (region: Region, markers?: Feature[]) => void;
renderCluster?: (props: ClusterRenderProps) => ReactNode;
children?: ReactNode;
}