# All files / src/NumberInput NumberInput.hooks.ts

100% Statements 28/28
66.66% Branches 6/9
100% Functions 8/8
100% Lines 23/23

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
    728x

    8x

    8x
    61x
    61x
    61x

    61x

    8x
    69x
    69x
    69x

    69x

    41x

    69x
    41x

    69x
    41x

    69x

    194x

    69x
    20x
    15x

    69x

     import React from 'react'
    import { InputValue, UseNumberFormatConfig } from './NumberInput.types'
    import {
      defaultLocale,
      format,
      getLengthInfo,
      verifyDecimalScale,
    } from './NumberInput.utils'

    export function usePrevious<T>(value: T) {
      const ref = React.useRef<T>()
      React.useEffect(() => {
        ref.current = value
      })
      return ref.current as T
    }

    export function useNumberFormat({
      decimalScale: _decimalScale = true,
      fillDecimalScale = 'none',
      locale: _locale = defaultLocale,
    }: UseNumberFormatConfig) {
      const locale = React.useMemo(
        () =>
          [
            ...(Array.isArray(_locale) ? _locale : [_locale]),
            defaultLocale,
          ] as string[],
        [_locale]
      )

      const { fixedDecimalScale, fillDecimalScaleOnBlur } = React.useMemo(
        () => ({
          fixedDecimalScale: fillDecimalScale === 'always',
          fillDecimalScaleOnBlur: fillDecimalScale === 'onBlur',
        }),
        [fillDecimalScale]
      )

      const decimalScale = React.useMemo(
        () => verifyDecimalScale(_decimalScale),
        [_decimalScale]
      )

      const formatValue = React.useCallback(
        (value: InputValue) =>
          format(locale, decimalScale, fillDecimalScale, value),
        [locale, decimalScale, fillDecimalScale]
      )

      const getValueLengthInfo = React.useCallback(
        (value: InputValue, isNumericString = false) =>
          getLengthInfo(
            locale,
            value,
            decimalScale,
            fillDecimalScale,
            isNumericString
          ),
        [locale, decimalScale, fillDecimalScale]
      )

      return {
        formatValue,
        getValueLengthInfo,
        locale,
        fixedDecimalScale,
        fillDecimalScaleOnBlur,
        decimalScale,
      }
    }