beta-badge.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import type { FC, MouseEventHandler, ReactNode } from 'react'
  2. import OLTooltip from '@/features/ui/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 defaultHref = '/beta/participate'
  19. const BetaBadge: FC<{
  20. tooltip?: TooltipProps
  21. link?: LinkProps
  22. description?: ReactNode
  23. phase?: string
  24. }> = ({
  25. tooltip,
  26. link = { href: defaultHref },
  27. description,
  28. phase = 'beta',
  29. }) => {
  30. const { href, ...linkProps } = link
  31. const linkedBadge = (
  32. <a
  33. target="_blank"
  34. rel="noopener noreferrer"
  35. href={href || defaultHref}
  36. {...linkProps}
  37. >
  38. <span className="visually-hidden">{description || tooltip?.text}</span>
  39. <BetaBadgeIcon phase={phase} />
  40. </a>
  41. )
  42. return tooltip ? (
  43. <OLTooltip
  44. id={tooltip.id}
  45. description={tooltip.text}
  46. tooltipProps={{ className: tooltip.className }}
  47. overlayProps={{
  48. placement: tooltip.placement || 'bottom',
  49. delay: 100,
  50. }}
  51. >
  52. {linkedBadge}
  53. </OLTooltip>
  54. ) : (
  55. linkedBadge
  56. )
  57. }
  58. export default BetaBadge