@likashefqet/react-native-image-zoom
Version:
A performant zoomable image written in Reanimated v2+ 🚀
225 lines • 8.65 kB
TypeScript
import { ForwardedRef } from 'react';
import type { ImageProps, ImageSourcePropType, LayoutRectangle, ViewProps } from 'react-native';
import type { GestureStateChangeEvent, PanGestureHandlerEventPayload, PinchGestureHandlerEventPayload, TapGestureHandlerEventPayload } from 'react-native-gesture-handler';
import { AnimatableValue, AnimateProps, SharedValue } from 'react-native-reanimated';
export type OnPinchStartCallback = (event: GestureStateChangeEvent<PinchGestureHandlerEventPayload>) => void;
export type OnPinchEndCallback = (event: GestureStateChangeEvent<PinchGestureHandlerEventPayload>, success: boolean) => void;
export type OnPanStartCallback = (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => void;
export type OnPanEndCallback = (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>, success: boolean) => void;
export type OnSingleTapCallback = (event: GestureStateChangeEvent<TapGestureHandlerEventPayload>) => void;
export declare enum ZOOM_TYPE {
ZOOM_IN = "ZOOM_IN",
ZOOM_OUT = "ZOOM_OUT"
}
export type ProgrammaticZoomCallback = (event: {
scale: number;
x: number;
y: number;
}) => void;
export type OnDoubleTapCallback = (zoomType: ZOOM_TYPE) => void;
export type OnProgrammaticZoomCallback = (zoomType: ZOOM_TYPE) => void;
export type GetInfoCallback = () => {
container: {
width: number;
height: number;
center: {
x: number;
y: number;
};
};
scaledSize: {
width: number;
height: number;
};
visibleArea: {
x: number;
y: number;
width: number;
height: number;
};
transformations: {
translateX: number;
translateY: number;
scale: number;
};
};
export declare enum ANIMATION_VALUE {
SCALE = "SCALE",
FOCAL_X = "FOCAL_X",
FOCAL_Y = "FOCAL_Y",
TRANSLATE_X = "TRANSLATE_X",
TRANSLATE_Y = "TRANSLATE_Y"
}
export type OnResetAnimationEndCallback = (finished?: boolean, values?: Record<ANIMATION_VALUE, {
lastValue: number;
finished?: boolean;
current?: AnimatableValue;
}>) => void;
export type ZoomProps = {
/**
* The minimum scale allowed for zooming.
* @default 1
*/
minScale?: number;
/**
* The maximum scale allowed for zooming.
* @default 5
*/
maxScale?: number;
/**
* The `scale` property allows you to provide your own Reanimated shared value for scale.
* This shared value will be updated as the zoom level changes, enabling you to use the
* current scale in your own code.
* @default useSharedValue(1)
*/
scale?: SharedValue<number>;
/**
* The value of the scale when a double-tap gesture is detected.
* @default 3
*/
doubleTapScale?: number;
/**
* The maximum number of pointers required to enable panning.
* @default 2
*/
maxPanPointers?: number;
/**
* Determines whether panning is enabled within the range of the minimum and maximum pan pointers.
* @default true
*/
isPanEnabled?: boolean;
/**
* Determines whether pinching is enabled.
* @default true
*/
isPinchEnabled?: boolean;
/**
* Enables or disables the single tap feature.
* @default false
*/
isSingleTapEnabled?: boolean;
/**
* Enables or disables the double tap feature.
* When enabled, this feature prevents automatic reset of the zoom to its initial position, allowing continuous zooming.
* To return to the initial position, double tap again or zoom out to a scale level less than 1.
* @default false
*/
isDoubleTapEnabled?: boolean;
/**
* A callback triggered when the interaction starts.
*/
onInteractionStart?: () => void;
/**
* A callback triggered when the interaction ends.
*/
onInteractionEnd?: () => void;
/**
* A callback triggered when the pinching starts.
*/
onPinchStart?: OnPinchStartCallback;
/**
* A callback triggered when the pinching ends.
*/
onPinchEnd?: OnPinchEndCallback;
/**
* A callback triggered when the panning starts.
*/
onPanStart?: OnPanStartCallback;
/**
* A callback triggered when the panning ends.
*/
onPanEnd?: OnPanEndCallback;
/**
* A callback triggered when a single tap is detected.
*/
onSingleTap?: OnSingleTapCallback;
/**
* A callback triggered when a double tap gesture is detected.
*/
onDoubleTap?: OnDoubleTapCallback;
/**
* A callback function that is invoked when a programmatic zoom event occurs.
*/
onProgrammaticZoom?: OnProgrammaticZoomCallback;
/**
* A callback triggered upon the completion of the reset animation. It accepts two parameters: finished and values.
* The finished parameter evaluates to true if all animation values have successfully completed the reset animation;
* otherwise, it is false, indicating interruption by another gesture or unforeseen circumstances.
* The values parameter provides additional detailed information for each animation value.
*/
onResetAnimationEnd?: OnResetAnimationEndCallback;
};
export type ZoomableProps = AnimateProps<ViewProps> & ZoomProps;
export type UseZoomableProps = ZoomProps & {
ref: ForwardedRef<ZoomableRef>;
/**
* Invoked on mount and layout changes with
*
* {nativeEvent: { layout: {x, y, width, height}}}.
*/
onLayout?: ZoomableProps['onLayout'];
};
export type ImageZoomProps = Omit<AnimateProps<ImageProps>, 'source'> & ZoomProps & {
/**
* The image's URI, which can be overridden by the `source` prop.
* @default ''
*/
uri?: string;
/**
* @see https://facebook.github.io/react-native/docs/image.html#source
* @default undefined
*/
source?: ImageSourcePropType;
};
export type ZoomableUseLayoutProps = Pick<ZoomableProps, 'onLayout'>;
export type ZoomableLayoutState = LayoutRectangle & {
/**
* An object containing the x and y coordinates of the center point of the view, relative to the top-left corner of the container.
*/
center: {
/**
* The x-coordinate of the center point of the view.
*/
x: number;
/**
* The y-coordinate of the center point of the view.
*/
y: number;
};
};
export type ZoomableUseGesturesProps = Pick<ZoomableLayoutState, 'width' | 'height' | 'center'> & Pick<ZoomableProps, 'minScale' | 'maxScale' | 'scale' | 'doubleTapScale' | 'maxPanPointers' | 'isPanEnabled' | 'isPinchEnabled' | 'isSingleTapEnabled' | 'isDoubleTapEnabled' | 'onInteractionStart' | 'onInteractionEnd' | 'onPinchStart' | 'onPinchEnd' | 'onPanStart' | 'onPanEnd' | 'onSingleTap' | 'onDoubleTap' | 'onProgrammaticZoom' | 'onResetAnimationEnd'>;
export type ZoomableRef = {
/**
* Resets the zoom level to its original scale.
*/
reset: () => void;
/**
* Triggers a zoom event to the specified coordinates (x, y) at the defined scale level.
*/
zoom: ProgrammaticZoomCallback;
/**
* Retrieves detailed information about the zoomable component, including container dimensions,
* scaled size, visible area (relative to the scaled component), and transformation values.
*
* @returns An object containing:
* - `container`: The original container's dimensions and center point.
* - `width`: The width of the container.
* - `height`: The height of the container.
* - `center`: The center coordinates of the container.
* - `scaledSize`: The dimensions of the component after applying the current scale.
* - `width`: The scaled width.
* - `height`: The scaled height.
* - `visibleArea`: The visible region of the scaled component.
* - `x`: The x-coordinate of the top-left corner of the visible area (relative to the scaled component).
* - `y`: The y-coordinate of the top-left corner of the visible area (relative to the scaled component).
* - `width`: The width of the visible area (matches container width).
* - `height`: The height of the visible area (matches container height).
* - `transformations`: The current transformation values.
* - `translateX`: The horizontal translation value (including focal point adjustment).
* - `translateY`: The vertical translation value (including focal point adjustment).
* - `scale`: The current scale factor.
*/
getInfo: GetInfoCallback;
};
export type ImageZoomRef = ZoomableRef;
//# sourceMappingURL=types.d.ts.map