join-group.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { Dispatch, SetStateAction, useCallback } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { InviteViewTypes } from './group-invite'
  4. import getMeta from '@/utils/meta'
  5. import { FetchError, putJSON } from '@/infrastructure/fetch-json'
  6. import useAsync from '@/shared/hooks/use-async'
  7. import classNames from 'classnames'
  8. import { debugConsole } from '@/utils/debugging'
  9. import Notification from '@/shared/components/notification'
  10. import OLButton from '@/shared/components/ol/ol-button'
  11. export default function JoinGroup({
  12. setView,
  13. }: {
  14. setView: Dispatch<SetStateAction<InviteViewTypes>>
  15. }) {
  16. const { t } = useTranslation()
  17. const expired = getMeta('ol-expired')
  18. const inviteToken = getMeta('ol-inviteToken')
  19. const {
  20. runAsync,
  21. isLoading: isJoining,
  22. isError,
  23. } = useAsync<never, FetchError>()
  24. const notNowBtnClasses = classNames(
  25. 'btn',
  26. 'btn-secondary',
  27. isJoining ? 'disabled' : ''
  28. )
  29. const joinTeam = useCallback(() => {
  30. runAsync(putJSON(`/subscription/invites/${inviteToken}`))
  31. .then(() => {
  32. setView('invite-accepted')
  33. })
  34. .catch(debugConsole.error)
  35. }, [inviteToken, runAsync, setView])
  36. if (!inviteToken) {
  37. return null
  38. }
  39. return (
  40. <>
  41. {isError && (
  42. <Notification
  43. type="error"
  44. content={t('generic_something_went_wrong')}
  45. className="my-3"
  46. />
  47. )}
  48. <div className="text-center">
  49. <p>{t('join_team_explanation')}</p>
  50. {!expired && (
  51. <p>
  52. <a className={notNowBtnClasses} href="/project">
  53. {t('not_now')}
  54. </a>
  55. &nbsp;&nbsp;
  56. <OLButton
  57. variant="primary"
  58. onClick={() => joinTeam()}
  59. disabled={isJoining}
  60. >
  61. {t('accept_invitation')}
  62. </OLButton>
  63. </p>
  64. )}
  65. </div>
  66. </>
  67. )
  68. }