managed-institution.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { useCallback, useState } from 'react'
  2. import { Trans, useTranslation } from 'react-i18next'
  3. import { postJSON } from '../../../../infrastructure/fetch-json'
  4. import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
  5. import { ManagedInstitution as Institution } from '../../../../../../types/subscription/dashboard/managed-institution'
  6. import { RowLink } from './row-link'
  7. import { debugConsole } from '@/utils/debugging'
  8. import getMeta from '@/utils/meta'
  9. import OLButton from '@/shared/components/ol/ol-button'
  10. type ManagedInstitutionProps = {
  11. institution: Institution
  12. }
  13. export default function ManagedInstitution({
  14. institution,
  15. }: ManagedInstitutionProps) {
  16. const { t } = useTranslation()
  17. const [subscriptionChanging, setSubscriptionChanging] = useState(false)
  18. const { updateManagedInstitution } = useSubscriptionDashboardContext()
  19. const changeInstitutionalEmailSubscription = useCallback(
  20. (
  21. e: React.MouseEvent<HTMLButtonElement, MouseEvent>,
  22. institutionId: Institution['v1Id']
  23. ) => {
  24. const updateSubscription = async (institutionId: Institution['v1Id']) => {
  25. setSubscriptionChanging(true)
  26. try {
  27. const data = await postJSON<string[]>(
  28. `/institutions/${institutionId}/emailSubscription`
  29. )
  30. institution.metricsEmail.optedOutUserIds = data
  31. updateManagedInstitution(institution)
  32. } catch (error) {
  33. debugConsole.error(error)
  34. }
  35. setSubscriptionChanging(false)
  36. }
  37. e.preventDefault()
  38. updateSubscription(institutionId)
  39. },
  40. [institution, updateManagedInstitution]
  41. )
  42. return (
  43. <div>
  44. <p>
  45. <Trans
  46. i18nKey="you_are_a_manager_of_commons_at_institution_x"
  47. components={[<strong />]} // eslint-disable-line react/jsx-key
  48. values={{
  49. institutionName: institution.name || '',
  50. }}
  51. shouldUnescape
  52. tOptions={{ interpolation: { escapeValue: true } }}
  53. />
  54. </p>
  55. <ul className="list-group p-0">
  56. <RowLink
  57. href={`/metrics/institutions/${institution.v1Id}`}
  58. heading={t('view_metrics')}
  59. subtext={t('view_metrics_commons_subtext')}
  60. icon="insights"
  61. />
  62. <RowLink
  63. href={`/institutions/${institution.v1Id}/hub`}
  64. heading={t('view_hub')}
  65. subtext={t('view_hub_subtext')}
  66. icon="account_circle"
  67. />
  68. <RowLink
  69. href={`/manage/institutions/${institution.v1Id}/managers`}
  70. heading={t('manage_institution_managers')}
  71. subtext={t('manage_managers_subtext')}
  72. icon="manage_accounts"
  73. />
  74. </ul>
  75. <div>
  76. <p>
  77. <span>Monthly metrics emails: </span>
  78. <OLButton
  79. variant="link"
  80. className="btn-inline-link"
  81. isLoading={subscriptionChanging}
  82. loadingLabel={t('loading')}
  83. onClick={e =>
  84. changeInstitutionalEmailSubscription(e, institution.v1Id)
  85. }
  86. >
  87. {institution.metricsEmail.optedOutUserIds.includes(
  88. getMeta('ol-user_id')!
  89. )
  90. ? t('subscribe')
  91. : t('unsubscribe')}
  92. </OLButton>
  93. </p>
  94. </div>
  95. <hr />
  96. </div>
  97. )
  98. }