group-invite.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import useWaitForI18n from '@/shared/hooks/use-wait-for-i18n'
  2. import getMeta from '@/utils/meta'
  3. import HasIndividualRecurlySubscription from './has-individual-recurly-subscription'
  4. import { useEffect, useState } from 'react'
  5. import { useTranslation, Trans } from 'react-i18next'
  6. import ManagedUserCannotJoin from './managed-user-cannot-join'
  7. import Notification from '@/shared/components/notification'
  8. import JoinGroup from './join-group'
  9. import AcceptedInvite from './accepted-invite'
  10. import OLRow from '@/shared/components/ol/ol-row'
  11. import OLCol from '@/shared/components/ol/ol-col'
  12. import OLPageContentCard from '@/shared/components/ol/ol-page-content-card'
  13. export type InviteViewTypes =
  14. | 'invite'
  15. | 'invite-accepted'
  16. | 'cancel-personal-subscription'
  17. | 'managed-user-cannot-join'
  18. | undefined
  19. function GroupInviteViews() {
  20. const hasIndividualPaidSubscription = getMeta(
  21. 'ol-hasIndividualPaidSubscription'
  22. )
  23. const cannotJoinSubscription = getMeta('ol-cannot-join-subscription')
  24. useEffect(() => {
  25. if (cannotJoinSubscription) {
  26. setView('managed-user-cannot-join')
  27. } else if (hasIndividualPaidSubscription) {
  28. setView('cancel-personal-subscription')
  29. } else {
  30. setView('invite')
  31. }
  32. }, [cannotJoinSubscription, hasIndividualPaidSubscription])
  33. const [view, setView] = useState<InviteViewTypes>(undefined)
  34. if (!view) {
  35. return null
  36. }
  37. if (view === 'managed-user-cannot-join') {
  38. return <ManagedUserCannotJoin />
  39. } else if (view === 'cancel-personal-subscription') {
  40. return <HasIndividualRecurlySubscription setView={setView} />
  41. } else if (view === 'invite') {
  42. return <JoinGroup setView={setView} />
  43. } else if (view === 'invite-accepted') {
  44. return <AcceptedInvite />
  45. }
  46. return null
  47. }
  48. export default function GroupInvite() {
  49. const inviterName = getMeta('ol-inviterName')
  50. const expired = getMeta('ol-expired')
  51. const { isReady } = useWaitForI18n()
  52. const { t } = useTranslation()
  53. if (!isReady) {
  54. return null
  55. }
  56. return (
  57. <div className="container" id="main-content">
  58. {expired && (
  59. <OLRow>
  60. <OLCol lg={{ span: 8, offset: 2 }}>
  61. <Notification type="error" content={t('email_link_expired')} />
  62. </OLCol>
  63. </OLRow>
  64. )}
  65. <OLRow className="row row-spaced">
  66. <OLCol lg={{ span: 8, offset: 2 }}>
  67. <OLPageContentCard>
  68. <div className="page-header">
  69. <h1 className="text-center">
  70. <Trans
  71. i18nKey="invited_to_group"
  72. values={{ inviterName }}
  73. shouldUnescape
  74. tOptions={{ interpolation: { escapeValue: true } }}
  75. components={
  76. /* eslint-disable-next-line react/jsx-key */
  77. [<span className="team-invite-name" />]
  78. }
  79. />
  80. </h1>
  81. </div>
  82. <GroupInviteViews />
  83. </OLPageContentCard>
  84. </OLCol>
  85. </OLRow>
  86. </div>
  87. )
  88. }