{"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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"}