| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import { forwardRef, ReactNode } from 'react'
- import { Button, ButtonProps, Spinner } from 'react-bootstrap'
- import { useTranslation } from 'react-i18next'
- import classNames from 'classnames'
- type DSButtonProps = Pick<
- ButtonProps,
- | 'children'
- | 'disabled'
- | 'href'
- | 'id'
- | 'target'
- | 'rel'
- | 'onClick'
- | 'onMouseDown'
- | 'onMouseOver'
- | 'onMouseOut'
- | 'onFocus'
- | 'onBlur'
- | 'size'
- | 'active'
- | 'type'
- > & {
- leadingIcon?: ReactNode
- trailingIcon?: ReactNode
- variant?: 'primary' | 'secondary' | 'tertiary' | 'danger'
- isLoading?: boolean
- loadingLabel?: string
- }
- const DSButton = forwardRef<HTMLButtonElement, DSButtonProps>(
- (
- {
- children,
- leadingIcon,
- isLoading = false,
- loadingLabel,
- trailingIcon,
- variant = 'primary',
- size,
- ...props
- },
- ref
- ) => {
- const { t } = useTranslation()
- const buttonClassName = classNames('d-inline-grid btn-ds', {
- 'button-loading': isLoading,
- })
- const loadingSpinnerClassName =
- size === 'lg' ? 'loading-spinner-large' : 'loading-spinner-small'
- return (
- <Button
- className={buttonClassName}
- variant={variant}
- size={size}
- {...props}
- ref={ref}
- disabled={isLoading || props.disabled}
- data-ol-loading={isLoading}
- role={undefined}
- >
- {isLoading && (
- <span className="spinner-container">
- <Spinner
- size="sm"
- animation="border"
- aria-hidden="true"
- className={loadingSpinnerClassName}
- />
- <span className="visually-hidden">
- {loadingLabel ?? t('loading')}
- </span>
- </span>
- )}
- <span className="button-content" aria-hidden={isLoading}>
- {leadingIcon}
- {children}
- {trailingIcon}
- </span>
- </Button>
- )
- }
- )
- DSButton.displayName = 'DSButton'
- export default DSButton
|