index.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import type { FC, MouseEventHandler } from 'react'
  2. import React from 'react'
  3. import Spinner from '../spinner'
  4. export type IButtonProps = {
  5. type?: string
  6. className?: string
  7. disabled?: boolean
  8. loading?: boolean
  9. children: React.ReactNode
  10. onClick?: MouseEventHandler<HTMLDivElement>
  11. }
  12. const Button: FC<IButtonProps> = ({
  13. type,
  14. disabled,
  15. children,
  16. className,
  17. onClick,
  18. loading = false,
  19. }) => {
  20. let style = 'cursor-pointer'
  21. switch (type) {
  22. case 'primary':
  23. style = (disabled || loading) ? 'bg-primary-200 cursor-not-allowed text-white' : 'bg-primary-600 hover:bg-primary-600/75 hover:shadow-md cursor-pointer text-white hover:shadow-sm'
  24. break
  25. case 'warning':
  26. style = (disabled || loading) ? 'bg-red-600/75 cursor-not-allowed text-white' : 'bg-red-600 hover:bg-red-600/75 hover:shadow-md cursor-pointer text-white hover:shadow-sm'
  27. break
  28. default:
  29. style = disabled ? 'border-solid border border-gray-200 bg-gray-200 cursor-not-allowed text-gray-800' : 'border-solid border border-gray-200 cursor-pointer text-gray-500 hover:bg-white hover:shadow-sm hover:border-gray-300'
  30. break
  31. }
  32. return (
  33. <div
  34. className={`inline-flex justify-center items-center content-center h-9 leading-5 rounded-lg px-4 py-2 text-base ${style} ${className && className}`}
  35. onClick={disabled ? undefined : onClick}
  36. >
  37. {children}
  38. {/* Spinner is hidden when loading is false */}
  39. <Spinner loading={loading} className='!text-white !h-3 !w-3 !border-2 !ml-1' />
  40. </div>
  41. )
  42. }
  43. export default React.memo(Button)