beta-badge.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import type { FC, MouseEventHandler, ReactNode } from 'react'
  2. import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
  3. import { bsVersion } from '@/features/utils/bootstrap-5'
  4. import BetaBadgeIcon from '@/shared/components/beta-badge-icon'
  5. type TooltipProps = {
  6. id: string
  7. text: ReactNode
  8. className?: string
  9. placement?: NonNullable<
  10. React.ComponentProps<typeof OLTooltip>['overlayProps']
  11. >['placement']
  12. }
  13. type LinkProps = {
  14. href?: string
  15. ref?: React.Ref<HTMLAnchorElement>
  16. className?: string
  17. onMouseDown?: MouseEventHandler<HTMLAnchorElement>
  18. }
  19. const defaultHref = '/beta/participate'
  20. const BetaBadge: FC<{
  21. tooltip?: TooltipProps
  22. link?: LinkProps
  23. description?: ReactNode
  24. phase?: string
  25. }> = ({
  26. tooltip,
  27. link = { href: defaultHref },
  28. description,
  29. phase = 'beta',
  30. }) => {
  31. const { href, ...linkProps } = link
  32. const linkedBadge = (
  33. <a
  34. target="_blank"
  35. rel="noopener noreferrer"
  36. href={href || defaultHref}
  37. {...linkProps}
  38. >
  39. <span className={bsVersion({ bs5: 'visually-hidden', bs3: 'sr-only' })}>
  40. {description || tooltip?.text}
  41. </span>
  42. <BetaBadgeIcon phase={phase} />
  43. </a>
  44. )
  45. return tooltip ? (
  46. <OLTooltip
  47. id={tooltip.id}
  48. description={tooltip.text}
  49. tooltipProps={{ className: tooltip.className }}
  50. overlayProps={{
  51. placement: tooltip.placement || 'bottom',
  52. delay: 100,
  53. }}
  54. >
  55. {linkedBadge}
  56. </OLTooltip>
  57. ) : (
  58. linkedBadge
  59. )
  60. }
  61. export default BetaBadge