group-settings-button.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { RowLink } from '@/features/subscription/components/dashboard/row-link'
  2. import { useTranslation } from 'react-i18next'
  3. import { useFeatureFlag } from '@/shared/context/split-test-context'
  4. import { useLocation } from '@/shared/hooks/use-location'
  5. import MaterialIcon from '@/shared/components/material-icon'
  6. import OLTag from '@/features/ui/components/ol/ol-tag'
  7. import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
  8. import { bsVersion } from '@/features/utils/bootstrap-5'
  9. import { ManagedGroupSubscription } from '../../../../../../types/subscription/dashboard/subscription'
  10. import { sendMB } from '../../../../infrastructure/event-tracking'
  11. function AvailableWithGroupProfessionalBadge() {
  12. const { t } = useTranslation()
  13. const location = useLocation()
  14. const handleUpgradeClick = () => {
  15. sendMB('flex-upgrade', {
  16. location: 'ad-badge',
  17. })
  18. location.assign('/user/subscription/group/upgrade-subscription')
  19. }
  20. return (
  21. <OLTag
  22. prepend={
  23. <img
  24. aria-hidden="true"
  25. src="/img/material-icons/star-gradient.svg"
  26. alt=""
  27. />
  28. }
  29. contentProps={{
  30. className: bsVersion({ bs5: 'mw-100' }),
  31. onClick: handleUpgradeClick,
  32. }}
  33. >
  34. <strong>{t('available_with_group_professional')}</strong>
  35. </OLTag>
  36. )
  37. }
  38. function useGroupSettingsButton(subscription: ManagedGroupSubscription) {
  39. const { t } = useTranslation()
  40. const isFlexibleGroupLicensing = useFeatureFlag('flexible-group-licensing')
  41. const subscriptionHasManagedUsers =
  42. subscription.features?.managedUsers === true
  43. const subscriptionHasGroupSSO = subscription.features?.groupSSO === true
  44. const heading = isFlexibleGroupLicensing
  45. ? t('group_settings')
  46. : t('manage_group_settings')
  47. let groupSettingRowSubText = ''
  48. if (subscriptionHasGroupSSO && subscriptionHasManagedUsers) {
  49. groupSettingRowSubText = t('manage_group_settings_subtext')
  50. } else if (subscriptionHasGroupSSO) {
  51. groupSettingRowSubText = t('manage_group_settings_subtext_group_sso')
  52. } else if (subscriptionHasManagedUsers) {
  53. groupSettingRowSubText = t('manage_group_settings_subtext_managed_users')
  54. }
  55. return {
  56. heading,
  57. groupSettingRowSubText,
  58. }
  59. }
  60. export function GroupSettingsButton({
  61. subscription,
  62. }: {
  63. subscription: ManagedGroupSubscription
  64. }) {
  65. const { heading, groupSettingRowSubText } =
  66. useGroupSettingsButton(subscription)
  67. return (
  68. <RowLink
  69. href={`/manage/groups/${subscription._id}/settings`}
  70. heading={heading}
  71. subtext={groupSettingRowSubText}
  72. icon="settings"
  73. />
  74. )
  75. }
  76. export function GroupSettingsButtonWithAdBadge({
  77. subscription,
  78. }: {
  79. subscription: ManagedGroupSubscription
  80. }) {
  81. const { heading, groupSettingRowSubText } =
  82. useGroupSettingsButton(subscription)
  83. return (
  84. <BootstrapVersionSwitcher
  85. bs3={
  86. <div className="row-link text-muted">
  87. <div className="icon">
  88. <MaterialIcon type="settings" />
  89. </div>
  90. <div className="text">
  91. <div className="heading">{heading}</div>
  92. <div className="subtext">{groupSettingRowSubText}</div>
  93. </div>
  94. <span className="badge-group-settings">
  95. <AvailableWithGroupProfessionalBadge />
  96. </span>
  97. </div>
  98. }
  99. bs5={
  100. <li className="list-group-item row-link">
  101. <div className="row-link-inner">
  102. <MaterialIcon type="settings" className="p-2 p-md-3 text-muted" />
  103. <div className="flex-grow-1 text-truncate text-muted">
  104. <strong>{heading}</strong>
  105. <div className="text-truncate">{groupSettingRowSubText}</div>
  106. </div>
  107. <span className="p-2 p-md-3">
  108. <AvailableWithGroupProfessionalBadge />
  109. </span>
  110. </div>
  111. </li>
  112. }
  113. />
  114. )
  115. }