managed-group-subscriptions.tsx 5.3 KB

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