// Type definitions for react-native-tab-view 1.0 // Project: https://github.com/react-native-community/react-native-tab-view // Definitions by: Kalle Ott // Kyle Roach // Tim Wang // Gerardo Pacheco // Kazuyuki Takahashi // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 import { PureComponent, ReactNode, ComponentType } from 'react' import { Animated, StyleProp, ViewStyle, TextStyle, EasingFunction } from 'react-native' export type Key = { key: string } export type RouteBase = Key & { testID?: string } export type Route = T export type NavigationState = { index: number routes: T[] } export type Scene = { route: T focused: boolean index: number } export type Layout = { height: number width: number } export type SceneRendererProps = { layout: Layout & { measured: boolean } navigationState: NavigationState position: Animated.Value jumpTo: (key: string) => void getLastPosition: () => number subscribe: ( event: SubscriptionName, callback: () => void ) => { remove: () => void } } export type SubscriptionName = 'reset' | 'position' export type TransitionProps = { progress: number } export type NavigationTransitionSpec = { duration?: number, // An easing function from `Easing`. easing?: EasingFunction, // A timing function such as `Animated.timing`. timing?: (value: Animated.Value, config: any) => any, } export type TransitionConfigurator = ( currentTransitionProps: TransitionProps, nextTransitionProps: TransitionProps ) => NavigationTransitionSpec export type PagerProps = { configureTransition?: TransitionConfigurator animationEnabled?: boolean swipeEnabled?: boolean swipeDistanceThreshold?: number swipeVelocityThreshold?: number children?: ReactNode } export type TabViewProps< T extends RouteBase = RouteBase > = PagerProps & { navigationState: NavigationState tabBarPosition?: 'bottom' | 'top' onIndexChange: (index: number) => void onPositionChange?: (props: { value: number }) => void initialLayout?: Layout canJumpToTab?: (route: T) => boolean renderPager?: (props: SceneRendererProps & PagerProps) => ReactNode renderScene: (props: SceneRendererProps & Scene) => ReactNode renderTabBar?: (props: SceneRendererProps) => ReactNode lazy?: boolean style?: StyleProp } export class TabView extends PureComponent> {} export type GestureEvent = { nativeEvent: { changedTouches: any[] identifier: number locationX: number locationY: number pageX: number pageY: number target: number timestamp: number touches: any[] } } export type GestureState = { stateID: number moveX: number moveY: number x0: number y0: number dx: number dy: number vx: number vy: number numberActiveTouches: number } export type GestureHandler = (event: GestureEvent, state: GestureState) => void export type PagerPanProps< T extends RouteBase = RouteBase > = SceneRendererProps & { configureTransition?: TransitionConfigurator animationEnabled?: boolean swipeEnabled?: boolean swipeDistanceThreshold?: number swipeVelocityThreshold?: number onSwipeStart?: GestureHandler onSwipeEnd?: GestureHandler children?: ReactNode } export type DefaultTransitionSpec = { timing: typeof Animated.spring tension: 300 friction: 35 } export class PagerPan extends PureComponent> { static defaultProps: { configureTransition: () => DefaultTransitionSpec initialLayout: { height: 0 width: 0 } swipeDistanceThreshold: 120 swipeVelocityThreshold: 0.25 } } export type ScrollEvent = { nativeEvent: { contentOffset: { x: number y: number } } } export type PagerScrollProps< T extends RouteBase = RouteBase > = SceneRendererProps & { animationEnabled?: boolean swipeEnabled?: boolean children?: ReactNode } export class PagerScroll extends PureComponent> {} export type PageScrollEvent = { nativeEvent: { position: number offset: number } } export type PageScrollState = 'dragging' | 'settling' | 'idle' export type PagerAndroidProps< T extends RouteBase = RouteBase > = SceneRendererProps & { animationEnabled?: boolean swipeEnabled?: boolean children?: ReactNode } export class PagerAndroid extends PureComponent> {} export type IndicatorProps< T extends RouteBase = RouteBase > = SceneRendererProps & { width: Animated.Value } export type TabBarProps = SceneRendererProps< T > & { getLabelText?: (scene: Scene) => string | undefined | null getAccessible?: (scene: Scene) => boolean getAccessibilityLabel?: (scene: Scene) => string | undefined | null getTestID?: (scene: Scene) => string | undefined | null renderIcon?: (scene: Scene) => ReactNode renderLabel?: (scene: Scene) => ReactNode renderIndicator?: (props: IndicatorProps) => ReactNode renderBadge?: (scene: Scene) => ReactNode onTabPress?: (scene: Scene) => void onTabLongPress?: (scene: Scene) => void activeColor?: string inactiveColor?: string pressColor?: string pressOpacity?: number scrollEnabled?: boolean bounces?: boolean useNativeDriver?: boolean; tabStyle?: StyleProp indicatorStyle?: StyleProp labelStyle?: StyleProp style?: StyleProp } export class TabBar extends PureComponent> {} export function SceneMap(scenes: { [key: string]: ComponentType }): (props: { route: Route }) => ReactNode