UNPKG

@scrolia/react-native

Version:
1 lines 10.8 kB
{"version":3,"file":"pan.mjs","names":[],"sources":["../../../../src/hooks/thumb/functions/pan.ts"],"sourcesContent":["import type {\n FlatList,\n GestureResponderEvent,\n PanResponderGestureState,\n PanResponderInstance,\n ScrollView,\n} from \"react-native\";\n\nimport type { Axis, OnDragMoveResult, Plugin } from \"#/@types/options\";\nimport type { ContentType } from \"#/contexts/scrollcore\";\n\nimport * as React from \"react\";\nimport { PanResponder } from \"react-native\";\n\nimport { 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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"}