beta-badge.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import type { FC, ReactNode } from 'react'
  2. import classnames from 'classnames'
  3. import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
  4. import MaterialIcon from '@/shared/components/material-icon'
  5. import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
  6. type TooltipProps = {
  7. id: string
  8. text: ReactNode
  9. className?: string
  10. placement?: NonNullable<
  11. React.ComponentProps<typeof OLTooltip>['overlayProps']
  12. >['placement']
  13. }
  14. const BetaBadge: FC<{
  15. tooltip: TooltipProps
  16. url?: string
  17. phase?: string
  18. }> = ({ tooltip, url = '/beta/participate', phase = 'beta' }) => {
  19. const badgeClass = chooseBadgeClass(phase)
  20. return (
  21. <OLTooltip
  22. id={tooltip.id}
  23. description={tooltip.text}
  24. tooltipProps={{ className: tooltip.className }}
  25. overlayProps={{
  26. placement: tooltip.placement || 'bottom',
  27. delay: 100,
  28. }}
  29. >
  30. <a href={url} target="_blank" rel="noopener noreferrer">
  31. <span className="sr-only">{tooltip.text}</span>
  32. <BootstrapVersionSwitcher
  33. bs3={<span className={classnames('badge', badgeClass)} />}
  34. bs5={
  35. <MaterialIcon
  36. type="info"
  37. className={classnames('align-middle', badgeClass)}
  38. />
  39. }
  40. />
  41. </a>
  42. </OLTooltip>
  43. )
  44. }
  45. export const chooseBadgeClass = (phase?: string) => {
  46. switch (phase) {
  47. case 'release':
  48. return 'info-badge'
  49. case 'alpha':
  50. return 'alpha-badge'
  51. case 'beta':
  52. default:
  53. return 'beta-badge'
  54. }
  55. }
  56. export default BetaBadge