| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import { Dispatch, SetStateAction, useCallback } from 'react'
- import { useTranslation } from 'react-i18next'
- import { InviteViewTypes } from './group-invite'
- import getMeta from '@/utils/meta'
- import { FetchError, putJSON } from '@/infrastructure/fetch-json'
- import useAsync from '@/shared/hooks/use-async'
- import classNames from 'classnames'
- import { debugConsole } from '@/utils/debugging'
- import Notification from '@/shared/components/notification'
- export default function JoinGroup({
- setView,
- }: {
- setView: Dispatch<SetStateAction<InviteViewTypes>>
- }) {
- const { t } = useTranslation()
- const expired = getMeta('ol-expired') as boolean
- const inviteToken = getMeta('ol-inviteToken') as string
- const {
- runAsync,
- isLoading: isJoining,
- isError,
- } = useAsync<never, FetchError>()
- const notNowBtnClasses = classNames(
- 'btn',
- 'btn-secondary',
- isJoining ? 'disabled' : ''
- )
- const joinTeam = useCallback(() => {
- runAsync(putJSON(`/subscription/invites/${inviteToken}`))
- .then(() => {
- setView('invite-accepted')
- })
- .catch(debugConsole.error)
- }, [inviteToken, runAsync, setView])
- if (!inviteToken) {
- return null
- }
- return (
- <>
- {isError && (
- <Notification
- type="error"
- content={t('generic_something_went_wrong')}
- className="my-3"
- />
- )}
- <div className="text-center">
- <p>{t('join_team_explanation')}</p>
- {!expired && (
- <p>
- <a className={notNowBtnClasses} href="/project">
- {t('not_now')}
- </a>
-
- <button
- className="btn btn-primary"
- onClick={() => joinTeam()}
- disabled={isJoining}
- >
- {t('accept_invitation')}
- </button>
- </p>
- )}
- </div>
- </>
- )
- }
|