group-settings-button.tsx 3.8 KB

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