{"version":3,"file":"focusSourceEnhance.mjs","names":["React","assignProps","lastFocusSource","focusSourceListeners","useFocusSource","handleMouseDown","useCallback","forEach","listener","setFocusSource","handleKeyDown","focusSourceRef","useRef","source","current","subscribeListeners","document","addEventListener","capture","unsubscribeListeners","removeEventListener","useEffect","needToAddListeners","length","sourceListener","push","needToRemoveListeners","sourceListenerIndex","indexOf","splice","focusSourceEnhance","props"],"sources":["../../src/enhances/focusSourceEnhance.tsx"],"sourcesContent":["import React from 'react';\nimport assignProps from '../assignProps';\n\nlet lastFocusSource: 'mouse' | 'keyboard' | 'none' = 'none';\nconst focusSourceListeners: {\n  setFocusSource: (source: 'mouse' | 'keyboard' | 'none') => void;\n  subscribeListeners: () => void;\n}[] = [];\nexport const useFocusSource = () => {\n  const handleMouseDown = React.useCallback(\n    () => focusSourceListeners.forEach((listener) => listener.setFocusSource('mouse')),\n    [],\n  );\n  const handleKeyDown = React.useCallback(\n    () => focusSourceListeners.forEach((listener) => listener.setFocusSource('keyboard')),\n    [],\n  );\n  const focusSourceRef = React.useRef<'none' | 'mouse' | 'keyboard'>(lastFocusSource);\n  const setFocusSource = React.useCallback((source: 'none' | 'mouse' | 'keyboard') => {\n    focusSourceRef.current = source;\n    lastFocusSource = source;\n  }, []);\n  const subscribeListeners = React.useCallback(() => {\n    document.addEventListener('mousedown', handleMouseDown, { capture: true });\n    document.addEventListener('keydown', handleKeyDown, { capture: true });\n  }, []);\n  const unsubscribeListeners = React.useCallback(() => {\n    document.removeEventListener('mousedown', handleMouseDown, { capture: true });\n    document.removeEventListener('keydown', handleKeyDown, { capture: true });\n  }, []);\n\n  React.useEffect(() => {\n    const needToAddListeners = focusSourceListeners.length === 0;\n    const sourceListener = { setFocusSource, subscribeListeners };\n    focusSourceListeners.push(sourceListener);\n    if (needToAddListeners) subscribeListeners();\n    const needToRemoveListeners = needToAddListeners;\n\n    return () => {\n      const sourceListenerIndex = focusSourceListeners.indexOf(sourceListener);\n      focusSourceListeners.splice(sourceListenerIndex, 1);\n      if (needToRemoveListeners) unsubscribeListeners();\n      if (needToRemoveListeners && focusSourceListeners.length > 0) {\n        focusSourceListeners[0].subscribeListeners();\n      }\n    };\n  }, []);\n\n  return focusSourceRef;\n};\n\nexport type FocusSourceEnhanceHook = (props: {\n  tabIndex?: number;\n  disabled?: boolean;\n  loading?: boolean;\n  autoFocus?: boolean;\n}) => {\n  tabIndex: number;\n  keyboardFocused: boolean;\n  onFocus: (e: React.FocusEvent) => void;\n  onBlur: () => void;\n  focusSourceRef: React.MutableRefObject<typeof lastFocusSource>;\n};\n\nconst focusSourceEnhance = (): FocusSourceEnhanceHook => {\n  return (props) => {\n    const focusSourceRef = useFocusSource();\n\n    return assignProps(props, {\n      focusSourceRef,\n    });\n  };\n};\n\nexport default focusSourceEnhance;\n"],"mappings":"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"}