managed-institution.tsx 2.8 KB

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