beta-badge.tsx 1.7 KB

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