# All files / src/_hooks Autofocus.ts

10.71% Statements 3/28
0% Branches 0/12
0% Functions 0/6
14.28% Lines 3/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    811x

    1x

    1x

     import React from 'react'

    interface Config {
      /**
       * @since 10.19.0
       */
      enabled: boolean
      /**
       * @since 10.19.0
       */
      ref: any
    }

    interface AutofocusProps {
      /**
       * @since 10.19.0
       */
      enabled?: boolean
      /**
       * @since 10.19.0
       */
      children: React.ReactElement
    }

    /**
     * @deprecatedSince 9
     * @deprecated Never officially documented/supported
     */
    export const Autofocus = React.forwardRef<HTMLElement, AutofocusProps>(
      function Autofocus({ children, enabled = true, ...props }, ref) {
        const childRef = (children as React.ComponentProps<any>).ref
        const scope = React.createRef<HTMLElement>()

        useAutofocus({ ref: scope, enabled })
        useSharedRef({ ref: scope, refs: [ref, childRef] })

        Iif (React.isValidElement<{ ref: React.RefObject<HTMLElement> }>(children)) {
          return React.cloneElement(children, { ...props, ref: scope })
        }

        return children
      }
    )

    /**
     * @deprecatedSince 9
     * @deprecated Never officially documented/supported
     */
    export function useAutofocus({ enabled = true, ref }: Config) {
      React.useLayoutEffect(() => {
        enabled && ref && ref.current && ref.current.focus()
      }, [ref.current])
    }

    interface SharedRefConfig {
      ref: React.RefObject<HTMLElement>
      refs: React.MutableRefObject<HTMLElement>[]
    }

    // ==========
    // SHARED REF
    // ==========
    // TODO: Move to own hook

    function useSharedRef({ ref, refs }: SharedRefConfig) {
      React.useLayoutEffect(() => {
        refs.forEach(
          (reference: React.MutableRefObject<HTMLElement | null> | Function) => {
            Iif (reference) {
              if (typeof reference === 'function') {
                reference
                reference(ref.current)
              } else {
                reference.current = ref.current
              }
            }
          }
        )
      }, [ref])
    }