File size: 1,446 Bytes
bf237c2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* eslint-disable react-hooks/exhaustive-deps */
import React from 'react'
import { Controller } from '@use-gesture/core'
import { GenericOptions, GestureKey, InternalHandlers, NativeHandlers } from '@use-gesture/core/types'
import { ReactDOMAttributes } from './types'
type HookReturnType<Config extends GenericOptions> = Config['target'] extends object
? void
: (...args: any[]) => ReactDOMAttributes
/**
* Utility hook called by all gesture hooks and that will be responsible for
* the internals.
*
* @param {InternalHandlers} handlers
* @param {GenericOptions} config
* @param {GestureKey} gestureKey
* @param {NativeHandler} nativeHandlers
* @returns nothing when config.target is set, a binding function when not.
*/
export function useRecognizers<Config extends GenericOptions>(
handlers: InternalHandlers,
config: Config | {} = {},
gestureKey?: GestureKey,
nativeHandlers?: NativeHandlers
): HookReturnType<Config> {
const ctrl = React.useMemo(() => new Controller(handlers), [])
ctrl.applyHandlers(handlers, nativeHandlers)
ctrl.applyConfig(config, gestureKey)
React.useEffect(ctrl.effect.bind(ctrl))
React.useEffect(() => {
return ctrl.clean.bind(ctrl)
}, [])
// When target is undefined we return the bind function of the controller which
// returns prop handlers.
// @ts-ignore
if (config.target === undefined) {
return ctrl.bind.bind(ctrl) as any
}
return undefined as any
}
|