managed-group-subscriptions.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. const isSharingUpdatesEnabled = useFeatureFlag('sharing-updates')
  91. if (!managedGroupSubscriptions) {
  92. return null
  93. }
  94. const groupSettingsAdvertisedFor =
  95. getMeta('ol-groupSettingsAdvertisedFor') || []
  96. const groupSettingsEnabledFor = getMeta('ol-groupSettingsEnabledFor') || []
  97. return (
  98. <>
  99. {managedGroupSubscriptions.map(subscription => {
  100. const isAdmin = usersEmail === subscription.admin_id.email
  101. return (
  102. <div key={`managed-group-${subscription._id}`}>
  103. <h2 className="h3 fw-bold">{t('group_management')}</h2>
  104. <p>
  105. <ManagedGroupAdministrator subscription={subscription} />
  106. </p>
  107. <ul className="list-group p-0">
  108. {combinedUserManagement && (
  109. <RowLink
  110. href={`/manage/groups/${subscription._id}/users`}
  111. heading={t('user_management')}
  112. subtext={t('manage_users_subtext')}
  113. icon="groups"
  114. />
  115. )}
  116. {!combinedUserManagement && (
  117. <>
  118. <RowLink
  119. href={`/manage/groups/${subscription._id}/members`}
  120. heading={t('group_members')}
  121. subtext={t('manage_group_members_subtext')}
  122. icon="groups"
  123. />
  124. <RowLink
  125. href={`/manage/groups/${subscription._id}/managers`}
  126. heading={t('group_managers')}
  127. subtext={t('manage_managers_subtext')}
  128. icon="manage_accounts"
  129. />
  130. </>
  131. )}
  132. {groupSettingsEnabledFor?.includes(subscription._id) && (
  133. <GroupSettingsButton subscription={subscription} />
  134. )}
  135. {groupSettingsAdvertisedFor?.includes(subscription._id) && (
  136. <GroupSettingsButtonWithAdBadge subscription={subscription} />
  137. )}
  138. {isAdmin && (
  139. <>
  140. {isSharingUpdatesEnabled &&
  141. subscription.planLevelName === 'Pro' && (
  142. <RowLink
  143. href={`/manage/groups/${subscription._id}/sharing-permissions`}
  144. heading={t('sharing_permissions')}
  145. subtext={t('manage_group_sharing_permissions_subtext')}
  146. icon="share"
  147. />
  148. )}
  149. <RowLink
  150. href={`/manage/groups/${subscription._id}/audit-logs`}
  151. heading={t('audit_logs')}
  152. subtext={t('view_audit_logs_group_subtext')}
  153. icon="list"
  154. onClick={() =>
  155. sendMB('group-audit-log-click', {
  156. subscriptionId: subscription._id,
  157. })
  158. }
  159. />
  160. </>
  161. )}
  162. <RowLink
  163. href={`/metrics/groups/${subscription._id}`}
  164. heading={t('usage_metrics')}
  165. subtext={t('view_metrics_group_subtext')}
  166. icon="insights"
  167. />
  168. </ul>
  169. <hr />
  170. </div>
  171. )
  172. })}
  173. </>
  174. )
  175. }