@stephahart/react-native-pager
Version:
simple pager component for react-native
87 lines (86 loc) • 3.37 kB
TypeScript
import React from 'react';
import { ViewStyle } from 'react-native';
import Animated from 'react-native-reanimated';
import { PanGestureHandlerProperties } from 'react-native-gesture-handler';
export declare type SpringConfig = {
damping: Animated.Adaptable<number>;
mass: Animated.Adaptable<number>;
stiffness: Animated.Adaptable<number>;
overshootClamping: Animated.Adaptable<number> | boolean;
restSpeedThreshold: Animated.Adaptable<number>;
restDisplacementThreshold: Animated.Adaptable<number>;
toValue: Animated.Adaptable<number>;
};
export declare enum Extrapolate {
EXTEND = "extend",
CLAMP = "clamp",
IDENTITY = "identity"
}
interface InterpolationConfig {
inputRange: ReadonlyArray<Animated.Adaptable<number>>;
outputRange: ReadonlyArray<Animated.Adaptable<number>>;
extrapolate?: Extrapolate;
extrapolateLeft?: Extrapolate;
extrapolateRight?: Extrapolate;
}
declare type iInterpolationFn = (offset: Animated.Node<number>) => Animated.Node<number>;
interface iInterpolationConfig extends InterpolationConfig {
unit?: string;
}
declare type iTransformProp = {
[transformProp: string]: iInterpolationConfig | iInterpolationFn;
};
export interface iPageInterpolation {
[animatedProp: string]: iTransformProp[] | iInterpolationConfig | iInterpolationFn;
}
export interface iPager {
onChange?: (nextIndex: number) => void;
children: React.ReactNode[];
springConfig?: Partial<SpringConfig>;
pageInterpolation?: iPageInterpolation;
panProps?: Partial<PanGestureHandlerProperties>;
pageSize?: number;
threshold?: number;
minIndex?: number;
maxIndex?: number;
adjacentChildOffset?: number;
style?: ViewStyle;
containerStyle?: ViewStyle;
type?: 'horizontal' | 'vertical';
clamp?: {
prev?: number;
next?: number;
};
clampDrag?: {
prev?: number;
next?: number;
};
loop: boolean;
}
declare function Pager({ onChange, children, springConfig, panProps, pageSize, threshold, minIndex, maxIndex: parentMax, adjacentChildOffset, style, containerStyle, type, pageInterpolation, clamp, clampDrag, loop, }: iPager): JSX.Element;
interface iPagerContext<T> {
animatedValue: Animated.Value<number>;
animatedIndex: Animated.Value<number>;
nextIndex: Animated.Value<number>;
activeIndex: number;
setActiveIndex: (idx: number) => void;
content: T[];
setContent: (content: T[]) => void;
setState: (state: PagerState<T>) => void;
}
declare const PagerContext: React.Context<iPagerContext<any>>;
interface iPagerProvider {
children: React.ReactNode;
initialIndex: number;
}
export interface PagerState<T> {
activeIndex: number;
content: T[];
}
declare const PagerProvider: React.FC<iPagerProvider>;
declare function usePager<T>(): iPagerContext<T>;
declare function useIndex(): number;
declare function useAnimatedIndex(): any;
declare function useOffset(index: number, animatedNumberOfScreens: Animated.Node<number>): any;
declare function useInterpolation(pageInterpolation: iPageInterpolation, animatedNumberOfScreens: Animated.Node<number>, index?: number): any;
export { Pager, PagerProvider, PagerContext, usePager, useOffset, useIndex, useAnimatedIndex, useInterpolation, };