best-doctor/ke

View on GitHub
src/django-spa/cdk/Controls/Button/Button.tsx

Summary

Maintainability
A
35 mins
Test Coverage
D
66%
import React from 'react'
import { Button as ChakraButton } from '@chakra-ui/react'
import type { ButtonProps } from '@chakra-ui/button'

import { useIsMounted, usePropState } from '@cdk/Hooks'
import { ensurePromise } from '../../../../DetailView/utils/dataAccess'

export const Button = (props: ButtonProps): JSX.Element => {
  const { onClick, isDisabled: initialDisabled } = props
  const [isDisabled, setIsDisabled] = usePropState<boolean>(initialDisabled || false)
  const isMountedRef = useIsMounted()

  const handleClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): Promise<void> => {
    if (onClick) {
      setIsDisabled(true)
      return ensurePromise(onClick(e)).finally(() => {
        if (isMountedRef.current) {
          setIsDisabled(false)
        }
      })
    }
  }

  // Подавлено, так как компонент-обёртка
  // eslint-disable-next-line react/jsx-props-no-spreading
  return <ChakraButton {...props} isDisabled={isDisabled} onClick={handleClick} />
}