UNPKG

@scrolia/react-native

Version:
1 lines 11.2 kB
{"version":3,"file":"pan.mjs","names":["pointerOffset: number","_startPos: StartPos","delta: number","ratio: number","scrollTo: number","result: OnDragMoveResult | undefined","final: number","axis: Axis","responder: PanResponderInstance","event: GestureResponderEvent","state: PanResponderGestureState","_: GestureResponderEvent"],"sources":["../../../../src/hooks/thumb/functions/pan.ts"],"sourcesContent":["import type {\n FlatList,\n GestureResponderEvent,\n PanResponderGestureState,\n PanResponderInstance,\n} from \"react-native\";\n\nimport type { Axis, OnDragMoveResult, Plugin } from \"#/@types/options\";\n\nimport * as React from \"react\";\nimport { PanResponder, type ScrollView } from \"react-native\";\n\nimport { type ContentType, useScrollCore } from \"#/contexts/scrollcore\";\nimport { tryPlugin } from \"#/functions/plugin\";\n\ntype StartPos = {\n viewOffset: number;\n pointerOffset: number;\n};\n\ntype OnPanResponderGrantOptions = {\n axis: Axis;\n event: GestureResponderEvent;\n state: PanResponderGestureState;\n startPos: React.RefObject<StartPos>;\n isDrag: React.RefObject<boolean>;\n disabled: boolean;\n animated: boolean;\n plugins: Plugin[];\n hvTrack: boolean;\n hvThumb: boolean;\n total: React.RefObject<number>;\n view: React.RefObject<number>;\n viewOffset: React.RefObject<number>;\n};\n\nconst onPanResponderGrant = ({\n axis,\n event,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n}: OnPanResponderGrantOptions) => {\n event.preventDefault();\n\n const pointerOffset: number = axis === \"x\" ? state.x0 : state.y0;\n\n startPos.current = {\n viewOffset: viewOffset.current,\n pointerOffset,\n };\n\n for (const plugin of plugins) {\n if (!plugin.onDragStart) continue;\n\n tryPlugin(plugin, plugin.onDragStart, {\n axis,\n isDisabled: disabled,\n isAnimated: animated,\n isDefined: hvTrack && hvThumb,\n total: total.current,\n view: view.current,\n viewOffset: viewOffset.current,\n pointerOffset,\n });\n }\n\n isDrag.current = true;\n};\n\ntype OnPanResponderMoveOptions = {\n axis: Axis;\n state: PanResponderGestureState;\n startPos: React.RefObject<StartPos>;\n isDrag: React.RefObject<boolean>;\n disabled: boolean;\n animated: boolean;\n plugins: Plugin[];\n contentType: React.RefObject<ContentType>;\n contentRef: React.RefObject<any>;\n hvTrack: boolean;\n hvThumb: boolean;\n total: React.RefObject<number>;\n view: React.RefObject<number>;\n viewOffset: React.RefObject<number>;\n};\n\nconst onPanResponderMove = ({\n axis,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n contentType,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n}: OnPanResponderMoveOptions): void => {\n if (!isDrag.current || !contentRef.current) return void 0;\n\n // declarations\n const _startPos: StartPos = startPos.current;\n\n // calculations\n const delta: number = axis === \"x\" ? state.dx : state.dy;\n const ratio: number = view.current / total.current;\n\n const scrollTo: number = _startPos.viewOffset + delta / ratio;\n\n let result: OnDragMoveResult | undefined;\n\n for (const plugin of plugins) {\n if (!plugin.onDragMove) continue;\n\n result =\n tryPlugin(plugin, plugin.onDragMove, {\n axis,\n isDisabled: disabled,\n isAnimated: animated,\n isDefined: hvTrack && hvThumb,\n total: total.current,\n view: view.current,\n viewOffset: viewOffset.current,\n pointerOffset:\n _startPos.pointerOffset +\n (axis === \"x\" ? state.dx : state.dy),\n viewOffsetInit: _startPos.viewOffset,\n pointerOffsetInit: _startPos.pointerOffset,\n delta,\n ratio,\n scrollTo: result?.scrollTo ?? scrollTo,\n }) ?? result;\n }\n\n let final: number;\n\n if (result?.scrollTo) {\n final = result.scrollTo;\n } else {\n final = scrollTo;\n }\n\n switch (contentType.current) {\n case \"scrollview\": {\n (contentRef.current as ScrollView).scrollTo({\n ...(axis === \"x\"\n ? {\n x: final,\n }\n : {\n y: final,\n }),\n animated: false,\n });\n\n break;\n }\n case \"flatlist\": {\n (contentRef.current as FlatList).scrollToOffset({\n offset: final,\n animated: false,\n });\n\n break;\n }\n }\n};\n\ntype OnPanResponderReleaseOptions = {\n axis: Axis;\n state: PanResponderGestureState;\n startPos: React.RefObject<StartPos>;\n isDrag: React.RefObject<boolean>;\n disabled: boolean;\n animated: boolean;\n plugins: Plugin[];\n hvTrack: boolean;\n hvThumb: boolean;\n total: React.RefObject<number>;\n view: React.RefObject<number>;\n viewOffset: React.RefObject<number>;\n};\n\nconst onPanResponderRelease = ({\n axis,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n}: OnPanResponderReleaseOptions) => {\n const _startPos: StartPos = startPos.current;\n\n for (const plugin of plugins) {\n if (!plugin.onDragEnd) continue;\n\n tryPlugin(plugin, plugin.onDragEnd, {\n axis,\n isDisabled: disabled,\n isAnimated: animated,\n isDefined: hvTrack && hvThumb,\n total: total.current,\n view: view.current,\n viewOffset: viewOffset.current,\n pointerOffset: axis === \"x\" ? state.x0 : state.y0,\n viewOffsetInit: _startPos.viewOffset,\n pointerOffsetInit: _startPos.pointerOffset,\n });\n }\n\n isDrag.current = false;\n};\n\nconst createPanResponder = (axis: Axis): PanResponderInstance => {\n const {\n options: { disabled, animated, plugins },\n [axis]: {\n contentType,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n },\n } = useScrollCore();\n\n const isDrag = React.useRef<boolean>(false);\n\n const startPos = React.useRef<StartPos>({\n viewOffset: 0,\n pointerOffset: 0,\n });\n\n const responder: PanResponderInstance = PanResponder.create({\n onStartShouldSetPanResponder: (): boolean => true,\n onMoveShouldSetPanResponder: (): boolean => true,\n onPanResponderGrant: (\n event: GestureResponderEvent,\n state: PanResponderGestureState,\n ): void => {\n onPanResponderGrant({\n axis,\n event,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n });\n },\n onPanResponderMove: (\n _: GestureResponderEvent,\n state: PanResponderGestureState,\n ): void => {\n onPanResponderMove({\n axis,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n contentType,\n contentRef,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n });\n },\n onPanResponderRelease: (\n _: GestureResponderEvent,\n state: PanResponderGestureState,\n ): void => {\n onPanResponderRelease({\n axis,\n state,\n startPos,\n isDrag,\n disabled,\n animated,\n plugins,\n hvTrack,\n hvThumb,\n total,\n view,\n viewOffset,\n });\n },\n });\n\n return responder;\n};\n\nexport { createPanResponder };\n"],"mappings":"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"}