managed-institution.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 { Institution } from './managed-institutions'
  6. import { RowLink } from './row-link'
  7. type ManagedInstitutionProps = {
  8. institution: Institution
  9. }
  10. export default function ManagedInstitution({
  11. institution,
  12. }: ManagedInstitutionProps) {
  13. const { t } = useTranslation()
  14. const [subscriptionChanging, setSubscriptionChanging] = useState(false)
  15. const { updateManagedInstitution } = useSubscriptionDashboardContext()
  16. const changeInstitutionalEmailSubscription = useCallback(
  17. (e, institutionId: Institution['v1Id']) => {
  18. const updateSubscription = async (institutionId: Institution['v1Id']) => {
  19. setSubscriptionChanging(true)
  20. try {
  21. const data = await postJSON<string[]>(
  22. `/institutions/${institutionId}/emailSubscription`
  23. )
  24. institution.metricsEmail.optedOutUserIds = data
  25. updateManagedInstitution(institution)
  26. } catch (error) {
  27. console.error(error)
  28. }
  29. setSubscriptionChanging(false)
  30. }
  31. e.preventDefault()
  32. updateSubscription(institutionId)
  33. },
  34. [institution, updateManagedInstitution]
  35. )
  36. return (
  37. <div>
  38. <p>
  39. <Trans
  40. i18nKey="you_are_a_manager_of_commons_at_institution_x"
  41. components={[<strong />]} // eslint-disable-line react/jsx-key
  42. values={{
  43. institutionName: institution.name || '',
  44. }}
  45. />
  46. </p>
  47. <RowLink
  48. href={`/metrics/institutions/${institution.v1Id}`}
  49. heading={t('view_metrics')}
  50. subtext={t('view_metrics_commons_subtext')}
  51. icon="insights"
  52. />
  53. <RowLink
  54. href={`/institutions/${institution.v1Id}/hub`}
  55. heading={t('view_hub')}
  56. subtext={t('view_hub_subtext')}
  57. icon="account_circle"
  58. />
  59. <RowLink
  60. href={`/manage/institutions/${institution.v1Id}/managers`}
  61. heading={t('manage_institution_managers')}
  62. subtext={t('manage_managers_subtext')}
  63. icon="manage_accounts"
  64. />
  65. <div>
  66. <p>
  67. <span>Monthly metrics emails: </span>
  68. {subscriptionChanging ? (
  69. <i className="fa fa-spin fa-refresh" />
  70. ) : (
  71. <button
  72. className="btn-inline-link"
  73. style={{ border: 0 }}
  74. onClick={e =>
  75. changeInstitutionalEmailSubscription(e, institution.v1Id)
  76. }
  77. >
  78. {institution.metricsEmail.optedOutUserIds.includes(
  79. window.user_id!
  80. )
  81. ? t('subscribe')
  82. : t('unsubscribe')}
  83. </button>
  84. )}
  85. </p>
  86. </div>
  87. <hr />
  88. </div>
  89. )
  90. }