managed-group-subscriptions.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import {
  2. GroupSettingsButton,
  3. GroupSettingsButtonWithAdBadge,
  4. } from '@/features/subscription/components/dashboard/group-settings-button'
  5. import getMeta from '@/utils/meta'
  6. import { Trans, useTranslation } from 'react-i18next'
  7. import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
  8. import { RowLink } from './row-link'
  9. import { ManagedGroupSubscription } from '../../../../../../types/subscription/dashboard/subscription'
  10. import { bsVersion } from '@/features/utils/bootstrap-5'
  11. import { useFeatureFlag } from '@/shared/context/split-test-context'
  12. import classnames from 'classnames'
  13. function ManagedGroupAdministrator({
  14. subscription,
  15. }: {
  16. subscription: ManagedGroupSubscription
  17. }) {
  18. const usersEmail = getMeta('ol-usersEmail')
  19. const values = {
  20. planName: subscription.planLevelName,
  21. groupName: subscription.teamName || '',
  22. adminEmail: subscription.admin_id.email,
  23. }
  24. const isAdmin = usersEmail === subscription.admin_id.email
  25. if (subscription.userIsGroupMember && !isAdmin) {
  26. return (
  27. <Trans
  28. i18nKey="you_are_a_manager_and_member_of_x_plan_as_member_of_group_subscription_y_administered_by_z"
  29. components={[
  30. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  31. <a href="/user/subscription/plans" />,
  32. // eslint-disable-next-line react/jsx-key
  33. <strong />,
  34. ]}
  35. values={values}
  36. shouldUnescape
  37. tOptions={{ interpolation: { escapeValue: true } }}
  38. />
  39. )
  40. } else if (subscription.userIsGroupMember && isAdmin) {
  41. return (
  42. <Trans
  43. i18nKey="you_are_a_manager_and_member_of_x_plan_as_member_of_group_subscription_y_administered_by_z_you"
  44. components={[
  45. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  46. <a href="/user/subscription/plans" />,
  47. // eslint-disable-next-line react/jsx-key
  48. <strong />,
  49. ]}
  50. values={values}
  51. shouldUnescape
  52. tOptions={{ interpolation: { escapeValue: true } }}
  53. />
  54. )
  55. } else if (isAdmin) {
  56. return (
  57. <Trans
  58. i18nKey="you_are_a_manager_of_x_plan_as_member_of_group_subscription_y_administered_by_z_you"
  59. components={[
  60. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  61. <a href="/user/subscription/plans" />,
  62. // eslint-disable-next-line react/jsx-key
  63. <strong />,
  64. ]}
  65. values={values}
  66. shouldUnescape
  67. tOptions={{ interpolation: { escapeValue: true } }}
  68. />
  69. )
  70. }
  71. return (
  72. <Trans
  73. i18nKey="you_are_a_manager_of_x_plan_as_member_of_group_subscription_y_administered_by_z"
  74. components={[
  75. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  76. <a href="/user/subscription/plans" />,
  77. // eslint-disable-next-line react/jsx-key
  78. <strong />,
  79. ]}
  80. values={values}
  81. shouldUnescape
  82. tOptions={{ interpolation: { escapeValue: true } }}
  83. />
  84. )
  85. }
  86. export default function ManagedGroupSubscriptions() {
  87. const { t } = useTranslation()
  88. const { managedGroupSubscriptions } = useSubscriptionDashboardContext()
  89. const isFlexibleGroupLicensing = useFeatureFlag('flexible-group-licensing')
  90. if (!managedGroupSubscriptions) {
  91. return null
  92. }
  93. const groupSettingsAdvertisedFor =
  94. getMeta('ol-groupSettingsAdvertisedFor') || []
  95. const groupSettingsEnabledFor = getMeta('ol-groupSettingsEnabledFor') || []
  96. return (
  97. <>
  98. {managedGroupSubscriptions.map(subscription => {
  99. return (
  100. <div key={`managed-group-${subscription._id}`}>
  101. <h2 className={classnames('h3', bsVersion({ bs5: 'fw-bold' }))}>
  102. {t('group_management')}
  103. </h2>
  104. <p>
  105. <ManagedGroupAdministrator subscription={subscription} />
  106. </p>
  107. <ul className="list-group p-0">
  108. <RowLink
  109. href={`/manage/groups/${subscription._id}/members`}
  110. heading={
  111. isFlexibleGroupLicensing
  112. ? t('group_members')
  113. : t('manage_members')
  114. }
  115. subtext={t('manage_group_members_subtext')}
  116. icon="groups"
  117. />
  118. <RowLink
  119. href={`/manage/groups/${subscription._id}/managers`}
  120. heading={
  121. isFlexibleGroupLicensing
  122. ? t('group_managers')
  123. : t('manage_group_managers')
  124. }
  125. subtext={t('manage_managers_subtext')}
  126. icon="manage_accounts"
  127. />
  128. {groupSettingsEnabledFor?.includes(subscription._id) && (
  129. <GroupSettingsButton subscription={subscription} />
  130. )}
  131. {groupSettingsAdvertisedFor?.includes(subscription._id) && (
  132. <GroupSettingsButtonWithAdBadge subscription={subscription} />
  133. )}
  134. <RowLink
  135. href={`/metrics/groups/${subscription._id}`}
  136. heading={
  137. isFlexibleGroupLicensing
  138. ? t('usage_metrics')
  139. : t('view_metrics')
  140. }
  141. subtext={t('view_metrics_group_subtext')}
  142. icon="insights"
  143. />
  144. </ul>
  145. <hr />
  146. </div>
  147. )
  148. })}
  149. </>
  150. )
  151. }