@dokuhero/react-native-components
Version:
Sets of React Native components that works with dokuhero/react-native-theme and react-i18next
438 lines (391 loc) • 13.2 kB
TypeScript
/**
* Modified from https://github.com/react-community/react-native-maps/blob/master/index.d.ts
*/
import * as Expo from 'expo'
import * as React from 'react'
import {
Animated,
ImageRequireSource,
ImageURISource,
NativeSyntheticEvent,
ViewProperties
} from 'react-native'
declare module 'expo' {
export interface Region {
latitude: number
longitude: number
latitudeDelta: number
longitudeDelta: number
}
export interface LatLng {
latitude: number
longitude: number
}
export interface Point {
x: number
y: number
}
// helper interface
export interface MapEvent<T = {}>
extends NativeSyntheticEvent<
T & {
coordinate: LatLng
position: Point
}
> {}
export type LineCapType = 'butt' | 'round' | 'square'
export type LineJoinType = 'miter' | 'round' | 'bevel'
// =======================================================================
// AnimatedRegion
// =======================================================================
interface AnimatedRegionTimingConfig
extends Animated.AnimationConfig,
Partial<Region> {
easing?: (value: number) => number
duration?: number
delay?: number
}
interface AnimatedRegionSpringConfig
extends Animated.AnimationConfig,
Partial<Region> {
overshootClamping?: boolean
restDisplacementThreshold?: number
restSpeedThreshold?: number
velocity?: number | Point
bounciness?: number
speed?: number
tension?: number
friction?: number
stiffness?: number
mass?: number
damping?: number
}
export class AnimatedRegion extends Animated.AnimatedWithChildren {
latitude: Animated.Value
longitude: Animated.Value
latitudeDelta: Animated.Value
longitudeDelta: Animated.Value
constructor(region?: Region)
setValue(value: Region): void
setOffset(offset: Region): void
flattenOffset(): void
stopAnimation(callback?: (region: Region) => void): void
addListener(callback: (region: Region) => void): string
removeListener(id: string): void
spring(config: AnimatedRegionSpringConfig): Animated.CompositeAnimation
timing(config: AnimatedRegionTimingConfig): Animated.CompositeAnimation
}
// =======================================================================
// MapView (default export)
// =======================================================================
/**
* takeSnapshot options
*/
export interface SnapshotOptions {
/** optional, when omitted the view-width is used */
width?: number
/** optional, when omitted the view-height is used */
height?: number
/** __iOS only__, optional region to render */
region?: Region
/** image formats, defaults to 'png' */
format?: 'png' | 'jpg'
/** image quality: 0..1 (only relevant for jpg, default: 1) */
quality?: number
/** result types, defaults to 'file' */
result?: 'file' | 'base64'
}
/**
* onUserLocationChange parameters
*/
export interface EventUserLocation extends NativeSyntheticEvent<{}> {
nativeEvent: {
coordinate: {
latitude: number
longitude: number
altitude: number
timestamp: number
accuracy: number
speed: number
isFromMockProvider: boolean
}
}
}
/**
* Map style elements.
* @see https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource
* @see https://developers.google.com/maps/documentation/android-api/styling
*/
export type MapStyleElement = {
featureType?: string
elementType?: string
stylers: object[]
}
export type EdgePadding = {
top: Number
right: Number
bottom: Number
left: Number
}
export type EdgeInsets = {
top: Number
right: Number
bottom: Number
left: Number
}
export type KmlMarker = {
id: String
title: String
description: String
coordinate: LatLng
position: Point
}
/**
* onKmlReady parameter
*/
export interface KmlMapEvent
extends NativeSyntheticEvent<{ markers: KmlMarker[] }> {}
type MapTypes =
| 'standard'
| 'satellite'
| 'hybrid'
| 'terrain'
| 'none'
| 'mutedStandard'
export interface MapViewProps extends ViewProperties {
provider?: 'google' | null
customMapStyle?: MapStyleElement[]
customMapStyleString?: string
showsUserLocation?: boolean
userLocationAnnotationTitle?: string
showsMyLocationButton?: boolean
followsUserLocation?: boolean
showsPointsOfInterest?: boolean
showsCompass?: boolean
zoomEnabled?: boolean
zoomControlEnabled?: boolean
rotateEnabled?: boolean
cacheEnabled?: boolean
loadingEnabled?: boolean
loadingBackgroundColor?: string
loadingIndicatorColor?: string
scrollEnabled?: boolean
pitchEnabled?: boolean
toolbarEnabled?: boolean
moveOnMarkerPress?: boolean
showsScale?: boolean
showsBuildings?: boolean
showsTraffic?: boolean
showsIndoors?: boolean
showsIndoorLevelPicker?: boolean
mapType?: MapTypes
region?: Region
initialRegion?: Region
liteMode?: boolean
mapPadding?: EdgePadding
maxDelta?: number
minDelta?: number
legalLabelInsets?: EdgeInsets
onMapReady?: () => void
onKmlReady?: (values: KmlMapEvent) => void
onRegionChange?: (region: Region) => void
onRegionChangeComplete?: (region: Region) => void
onPress?: (event: MapEvent) => void
onLongPress?: (event: MapEvent) => void
onUserLocationChange?: (event: EventUserLocation) => void
onPanDrag?: (event: MapEvent) => void
onPoiClick?: (event: MapEvent<{ placeId: string; name: string }>) => void
onMarkerPress?: (
event: MapEvent<{ action: 'marker-press'; id: string }>
) => void
onMarkerSelect?: (
event: MapEvent<{ action: 'marker-select'; id: string }>
) => void
onMarkerDeselect?: (
event: MapEvent<{ action: 'marker-deselect'; id: string }>
) => void
onCalloutPress?: (event: MapEvent<{ action: 'callout-press' }>) => void
onMarkerDragStart?: (event: MapEvent) => void
onMarkerDrag?: (event: MapEvent) => void
onMarkerDragEnd?: (event: MapEvent) => void
minZoomLevel?: number
maxZoomLevel?: number
kmlSrc?: string
}
export class MapView extends React.Component<MapViewProps, any> {
animateToNavigation(
location: LatLng,
bearing: number,
angle: number,
duration?: number
): void
animateToRegion(region: Region, duration?: number): void
animateToCoordinate(latLng: LatLng, duration?: number): void
animateToBearing(bearing: number, duration?: number): void
animateToViewingAngle(angle: number, duration?: number): void
fitToElements(animated: boolean): void
fitToSuppliedMarkers(markers: string[], animated: boolean): void
fitToCoordinates(
coordinates?: LatLng[],
options?: { edgePadding?: EdgePadding; animated?: boolean }
): void
setMapBoundaries(northEast: LatLng, southWest: LatLng): void
takeSnapshot(options?: SnapshotOptions): Promise<string>
}
export class MapViewAnimated extends MapView {}
// =======================================================================
// Marker
// =======================================================================
export interface MarkerProps extends ViewProperties {
identifier?: string
reuseIdentifier?: string
title?: string
description?: string
image?: ImageURISource | ImageRequireSource
opacity?: number
pinColor?: string
coordinate: LatLng | AnimatedRegion
centerOffset?: Point
calloutOffset?: Point
anchor?: Point
calloutAnchor?: Point
flat?: boolean
draggable?: boolean
tracksViewChanges?: boolean
tracksInfoWindowChanges?: boolean
stopPropagation?: boolean
onPress?: (event: MapEvent<{ action: 'marker-press'; id: string }>) => void
onSelect?: (
event: MapEvent<{ action: 'marker-select'; id: string }>
) => void
onDeselect?: (
event: MapEvent<{ action: 'marker-deselect'; id: string }>
) => void
onCalloutPress?: (event: MapEvent<{ action: 'callout-press' }>) => void
onDragStart?: (event: MapEvent) => void
onDrag?: (event: MapEvent) => void
onDragEnd?: (event: MapEvent) => void
rotation?: number
zIndex?: number
}
export class Marker extends React.Component<MarkerProps, any> {
/**
* Shows the callout for this marker
*/
showCallout(): void
/**
* Hides the callout for this marker
*/
hideCallout(): void
/**
* Animates marker movement.
* __Android only__
*/
animateMarkerToCoordinate(coordinate: LatLng, duration?: number): void
}
export class MarkerAnimated extends Marker {}
// =======================================================================
// Callout
// =======================================================================
export interface MapCalloutProps extends ViewProperties {
tooltip?: boolean
onPress?: (event: MapEvent<{ action: 'callout-press' }>) => void
}
export class Callout extends React.Component<MapCalloutProps, any> {}
// =======================================================================
// Polyline
// =======================================================================
export interface MapPolylineProps extends ViewProperties {
coordinates: LatLng[]
onPress?: (event: MapEvent) => void
tappable?: boolean
fillColor?: string
strokeWidth?: number
strokeColor?: string
strokeColors?: string[]
zIndex?: number
lineCap?: LineCapType
lineJoin?: LineJoinType
miterLimit?: number
geodesic?: boolean
lineDashPhase?: number
lineDashPattern?: number[]
}
export class Polyline extends React.Component<MapPolylineProps, any> {}
// =======================================================================
// Polygon
// =======================================================================
export interface MapPolygonProps extends ViewProperties {
coordinates: LatLng[]
holes?: LatLng[][]
onPress?: (event: MapEvent) => void
tappable?: boolean
strokeWidth?: number
strokeColor?: string
fillColor?: string
zIndex?: number
lineCap?: LineCapType
lineJoin?: LineJoinType
miterLimit?: number
geodesic?: boolean
lineDashPhase?: number
lineDashPattern?: number[]
}
export class Polygon extends React.Component<MapPolygonProps, any> {}
// =======================================================================
// Circle
// =======================================================================
export interface MapCircleProps extends ViewProperties {
center: LatLng
radius: number
onPress?: (event: MapEvent) => void
strokeWidth?: number
strokeColor?: string
fillColor?: string
zIndex?: number
lineCap?: LineCapType
lineJoin?: LineJoinType
miterLimit?: number
lineDashPhase?: number
lineDashPattern?: number[]
}
export class Circle extends React.Component<MapCircleProps, any> {}
// =======================================================================
// UrlTile & LocalTile
// =======================================================================
export interface MapUrlTileProps extends ViewProperties {
urlTemplate: string
maximumZ?: number
zIndex?: number
}
export class UrlTile extends React.Component<MapUrlTileProps, any> {}
export interface MapLocalTileProps extends ViewProperties {
pathTemplate: string
tileSize?: number
zIndex?: number
}
export class LocalTile extends React.Component<MapLocalTileProps, any> {}
// =======================================================================
// Overlay
// =======================================================================
type Coordinate = [number, number]
export interface MapOverlayProps extends ViewProperties {
image?: ImageURISource | ImageRequireSource
bounds: [Coordinate, Coordinate]
}
export class Overlay extends React.Component<MapOverlayProps, any> {}
export class OverlayAnimated extends Overlay {}
// =======================================================================
// Constants
// =======================================================================
export const MAP_TYPES: {
STANDARD: MapTypes
SATELLITE: MapTypes
HYBRID: MapTypes
TERRAIN: MapTypes
NONE: MapTypes
MUTEDSTANDARD: MapTypes
}
export const PROVIDER_DEFAULT: null
export const PROVIDER_GOOGLE: 'google'
}