beta-badge.tsx 1.4 KB

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