managed-group-subscriptions.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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 { sendMB } from '@/infrastructure/event-tracking'
  11. import { useFeatureFlag } from '@/shared/context/split-test-context'
  12. function ManagedGroupAdministrator({
  13. subscription,
  14. }: {
  15. subscription: ManagedGroupSubscription
  16. }) {
  17. const usersEmail = getMeta('ol-usersEmail')
  18. const values = {
  19. planName: subscription.planLevelName,
  20. groupName: subscription.teamName || '',
  21. adminEmail: subscription.admin_id.email,
  22. }
  23. const isAdmin = usersEmail === subscription.admin_id.email
  24. if (subscription.userIsGroupMember && !isAdmin) {
  25. return (
  26. <Trans
  27. i18nKey="you_are_a_manager_and_member_of_x_plan_as_member_of_group_subscription_y_administered_by_z"
  28. components={[
  29. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  30. <a href="/user/subscription/plans" />,
  31. // eslint-disable-next-line react/jsx-key
  32. <strong />,
  33. ]}
  34. values={values}
  35. shouldUnescape
  36. tOptions={{ interpolation: { escapeValue: true } }}
  37. />
  38. )
  39. } else if (subscription.userIsGroupMember && isAdmin) {
  40. return (
  41. <Trans
  42. i18nKey="you_are_a_manager_and_member_of_x_plan_as_member_of_group_subscription_y_administered_by_z_you"
  43. components={[
  44. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  45. <a href="/user/subscription/plans" />,
  46. // eslint-disable-next-line react/jsx-key
  47. <strong />,
  48. ]}
  49. values={values}
  50. shouldUnescape
  51. tOptions={{ interpolation: { escapeValue: true } }}
  52. />
  53. )
  54. } else if (isAdmin) {
  55. return (
  56. <Trans
  57. i18nKey="you_are_a_manager_of_x_plan_as_member_of_group_subscription_y_administered_by_z_you"
  58. components={[
  59. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  60. <a href="/user/subscription/plans" />,
  61. // eslint-disable-next-line react/jsx-key
  62. <strong />,
  63. ]}
  64. values={values}
  65. shouldUnescape
  66. tOptions={{ interpolation: { escapeValue: true } }}
  67. />
  68. )
  69. }
  70. return (
  71. <Trans
  72. i18nKey="you_are_a_manager_of_x_plan_as_member_of_group_subscription_y_administered_by_z"
  73. components={[
  74. // eslint-disable-next-line react/jsx-key, jsx-a11y/anchor-has-content
  75. <a href="/user/subscription/plans" />,
  76. // eslint-disable-next-line react/jsx-key
  77. <strong />,
  78. ]}
  79. values={values}
  80. shouldUnescape
  81. tOptions={{ interpolation: { escapeValue: true } }}
  82. />
  83. )
  84. }
  85. export default function ManagedGroupSubscriptions() {
  86. const { t } = useTranslation()
  87. const usersEmail = getMeta('ol-usersEmail')
  88. const { managedGroupSubscriptions } = useSubscriptionDashboardContext()
  89. const combinedUserManagement = useFeatureFlag('combined-user-management')
  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. const isAdmin = usersEmail === subscription.admin_id.email
  100. return (
  101. <div key={`managed-group-${subscription._id}`}>
  102. <h2 className="h3 fw-bold">{t('group_management')}</h2>
  103. <p>
  104. <ManagedGroupAdministrator subscription={subscription} />
  105. </p>
  106. <ul className="list-group p-0">
  107. {combinedUserManagement && (
  108. <RowLink
  109. href={`/manage/groups/${subscription._id}/users`}
  110. heading={t('user_management')}
  111. subtext={t('manage_users_subtext')}
  112. icon="groups"
  113. />
  114. )}
  115. {!combinedUserManagement && (
  116. <>
  117. <RowLink
  118. href={`/manage/groups/${subscription._id}/members`}
  119. heading={t('group_members')}
  120. subtext={t('manage_group_members_subtext')}
  121. icon="groups"
  122. />
  123. <RowLink
  124. href={`/manage/groups/${subscription._id}/managers`}
  125. heading={t('group_managers')}
  126. subtext={t('manage_managers_subtext')}
  127. icon="manage_accounts"
  128. />
  129. </>
  130. )}
  131. {groupSettingsEnabledFor?.includes(subscription._id) && (
  132. <GroupSettingsButton subscription={subscription} />
  133. )}
  134. {groupSettingsAdvertisedFor?.includes(subscription._id) && (
  135. <GroupSettingsButtonWithAdBadge subscription={subscription} />
  136. )}
  137. {isAdmin && (
  138. <RowLink
  139. href={`/manage/groups/${subscription._id}/audit-logs`}
  140. heading={t('audit_logs')}
  141. subtext={t('view_audit_logs_group_subtext')}
  142. icon="list"
  143. onClick={() =>
  144. sendMB('group-audit-log-click', {
  145. subscriptionId: subscription._id,
  146. })
  147. }
  148. />
  149. )}
  150. <RowLink
  151. href={`/metrics/groups/${subscription._id}`}
  152. heading={t('usage_metrics')}
  153. subtext={t('view_metrics_group_subtext')}
  154. icon="insights"
  155. />
  156. </ul>
  157. <hr />
  158. </div>
  159. )
  160. })}
  161. </>
  162. )
  163. }