enable-widget.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { ReactNode } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { sendMB } from '@/infrastructure/event-tracking'
  4. import OLBadge from '@/features/ui/components/ol/ol-badge'
  5. import OLButton from '@/features/ui/components/ol/ol-button'
  6. function trackUpgradeClick() {
  7. sendMB('settings-upgrade-click')
  8. }
  9. type EnableWidgetProps = {
  10. logo: ReactNode
  11. title: string
  12. description: string
  13. helpPath: string
  14. helpTextOverride?: string
  15. hasFeature?: boolean
  16. isPremiumFeature?: boolean
  17. statusIndicator?: ReactNode
  18. children?: ReactNode
  19. linked?: boolean
  20. handleLinkClick: () => void
  21. handleUnlinkClick: () => void
  22. disabled?: boolean
  23. }
  24. export function EnableWidget({
  25. logo,
  26. title,
  27. description,
  28. helpPath,
  29. helpTextOverride,
  30. hasFeature,
  31. isPremiumFeature,
  32. statusIndicator,
  33. linked,
  34. handleLinkClick,
  35. handleUnlinkClick,
  36. children,
  37. disabled,
  38. }: EnableWidgetProps) {
  39. const { t } = useTranslation()
  40. const helpText = helpTextOverride || t('learn_more')
  41. return (
  42. <div className="settings-widget-container">
  43. <div>{logo}</div>
  44. <div className="description-container">
  45. <div className="title-row">
  46. <h4>{title}</h4>
  47. {!hasFeature && isPremiumFeature && (
  48. <OLBadge bg="info">{t('premium_feature')}</OLBadge>
  49. )}
  50. </div>
  51. <p className="small">
  52. {description}{' '}
  53. <a href={helpPath} target="_blank" rel="noreferrer">
  54. {helpText}
  55. </a>
  56. </p>
  57. {children}
  58. {hasFeature && statusIndicator}
  59. </div>
  60. <div>
  61. <ActionButton
  62. hasFeature={hasFeature}
  63. linked={linked}
  64. handleUnlinkClick={handleUnlinkClick}
  65. handleLinkClick={handleLinkClick}
  66. disabled={disabled}
  67. />
  68. </div>
  69. </div>
  70. )
  71. }
  72. type ActionButtonProps = {
  73. hasFeature?: boolean
  74. linked?: boolean
  75. handleUnlinkClick: () => void
  76. handleLinkClick: () => void
  77. disabled?: boolean
  78. linkText?: string
  79. unlinkText?: string
  80. }
  81. export function ActionButton({
  82. linked,
  83. handleUnlinkClick,
  84. handleLinkClick,
  85. hasFeature,
  86. disabled,
  87. linkText,
  88. unlinkText,
  89. }: ActionButtonProps) {
  90. const { t } = useTranslation()
  91. const linkingText = linkText || t('turn_on')
  92. const unlinkingText = unlinkText || t('turn_off')
  93. if (!hasFeature) {
  94. return (
  95. <OLButton
  96. variant="primary"
  97. href="/user/subscription/plans"
  98. onClick={trackUpgradeClick}
  99. >
  100. <span>{t('upgrade')}</span>
  101. </OLButton>
  102. )
  103. } else if (linked) {
  104. return (
  105. <OLButton
  106. variant="danger-ghost"
  107. onClick={handleUnlinkClick}
  108. disabled={disabled}
  109. >
  110. {unlinkingText}
  111. </OLButton>
  112. )
  113. } else {
  114. return (
  115. <OLButton
  116. variant="secondary"
  117. disabled={disabled}
  118. onClick={handleLinkClick}
  119. >
  120. {linkingText}
  121. </OLButton>
  122. )
  123. }
  124. }
  125. export default EnableWidget